前言
上一篇我们讲了如果简单的接收微信的消息,当然,公众号不止会推送消息,还提供了丰富的 API 供开发者调用。想要了解微信提供了哪些接口,可以访问微信官方文档。在公众号后台,“开发”--“接口权限”菜单中也可以看到所有 API,并且微信已经做好了分类。
access_token
首先,所有的 API 都不是随意调用的。在调用任何 API 之前,都需要先获取令牌(即接口调用凭证:access_token)。不同公众号的 access_token 是不同的,微信会根据 access_token 来定位公众号,执行相应的操作。接下来我们就以最常用的“自定义菜单”接口为例,来介绍下如何调用微信公众号 API:
获取 access_token 上面说到,在调用 API 之前,先要获取 access_token。根据官方获取 access_token 文档,获取 access_token 是一个 3 个参数的 HTTP GET 请求:
- grant_type 在说明中,我们看到,微信这个参数是定死的,就传 client_credential
- appid 第三方用户唯一凭证
- secret 第三方用户唯一凭证密钥
grant_type 没有问题,我们直接传 client_credential 就行了,那 appid 和 secret 哪来呢?我们可以登录公众号后台,在“开发”--“基本配置”中找到“开发者 ID(AppID)”和“开发者密码(AppSecret)”。开发者 ID 就是 appid,开发者密码就是 secret。好了,万事俱备,让我们来获取下 access_token:
'use strict';
const rp = require('request-promise');
async function getAccessToken(appId, secret) {
const result = await rp(
`https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appId}&secret=${secret}`
);
if (result.access_token & result.expires_in) {
// 打印结果
return console.log(result);
}
}
getAccessToken('myAppId', 'mySecret');
如果没有问题,我们会得到一个 json 的响应。json 里面有 2 个属性值:access_token 和 expires_in,access_token 就是我们需要的,而 expires_in 是表示 access_token 的有效实现,一般情况下是 7200 秒,也就是 2 小时有效期。所以,我们必须在获取到 access_token 后 2 小时内使用它,否则就会过期。如果 access_token 过期,我们必须重新获取一次。
调用创建菜单的 API
根据微信的创建菜单的文档,创建菜单是一个 HTTP POST 方法, 这个 API 有 2 个参数,其中一个就是刚刚获取的 access_token,另一个就是菜单的内容。注意,所有接口 access_token 都是作为 query 参数传过去的。
'use strict';
const rp = require('request-promise');
async function setMenu(accessToken, menu) {
const result = await rp({
method: 'POST',
uri: `https://api.weixin.qq.com/cgi-bin/menu/create?access_token=${accessToken}`,
json: true,
body: menu
});
if (result.errcode === 0) {
// 设置成功
return console.log('success');
}
// 设置失败
console.log('failed');
}
const menuObj = {
button: [
{
type: 'click',
name: '今日歌曲',
key: 'V1001_TODAY_MUSIC'
},
{
name: '菜单',
sub_button: [
{
type: 'view',
name: '搜索',
url: 'http://www.soso.com/'
},
{
type: 'miniprogram',
name: 'wxa',
url: 'http://mp.weixin.qq.com',
appid: 'wx286b93c14bbf93aa',
pagepath: 'pages/lunar/index'
},
{
type: 'click',
name: '赞一下我们',
key: 'V1001_GOOD'
}
]
}
]
};
setMenu('accessToken', menuObj);
大部分公众号的 API 调用之后,都会有一个错误码 errcode,如果 errcode 为 0,则表示成功;如果 errcode 为其他值,那表示 API 调用有问题。 如果返回了其他错误码,可以通过微信的全局返回码说明来查询具体的错误原因。
总结
只要记住,在调用微信 API 时,access_token 是必不可少且一定是放在 query 里面的。如果调用出了什么问题,可以根据微信返回的错误码去官方查询具体原因。不过,根据我的经验,有些错误码微信也没有给出解释,祝各位好运!