Nodejs 对接公众号【第一难】
2018-08-14 本文已影响75人
simuty
Nodejs 接入 公众号
需求:
Boss: 我们要接入公众号,你看下文档对接下。
Me: 🆗
然后,可能因为对腾讯的反感,加之网上对腾讯的吐槽,怀着愤世嫉俗的态度胡乱的找资源,看方案,
image.png然后
image.png然后 想着还得早点回去睡觉,沉下心赶紧完成任务。
其实有些东西,做过才发现也就那么回事。
image.png总的步骤明确后,其实按部就班的来就行了,简单
第一步 生成测试账号
image.png就这样获取到了APPID Secret
第二步 配置接口信息
说好的万事开头难,这就来了,这个步骤是个问题。
请注意
原料列表
1. 外网可以访问的一个接口,端口号80、443
2. 写代码
3. 写代码
疑问: 本地起端口可以吗?
可以,但你需要内网穿透,比如花生壳, 6块那个就不行,真的不行🚫,因为不给提供80、443,只能自行解决了。比如在服务器上配置下、比如买个别的厂商的。
疑问: 为啥要80、443?
人家规定的
疑问: 要这个接口干啥?
这个接口是添加配置信息的时候,微信调用的,验证下是否合规,如何判断合规,你需要在接口里写代码,符合标准
疑问: 什么代码??
比如你直接填www.baidu.com, 就不行,因为,这个接口不是针对微信调用的,返回结果微信不认识,所以你就添加不了。
正确的代码是啥??
// 没错query 就是微信调用该接口是传过来的参数,对比下就可以
public static async configWechat(query: any) {
const { signature, timestamp, echostr, nonce } = query;
// 与微信后台配置的token一致
const token = "******";
const aesKey = "*******";
let tmpArray = new Array();
tmpArray = [nonce, timestamp, token].sort();
const sha_1 = crypto.createHash("sha1");
sha_1.update(tmpArray.join(""));
const result = sha_1.digest("hex");
if (result === signature) {
return echostr;
} else {
return { code: -1, msg: "fail" };
}
}
疑问: 有啥注意事项吗?
这个问题好,返回值记得一定直接要返回echostr,别加别的返回值。
不要问我怎么知道的!
image.png配置信息添加成功
- JS接口安全域名配置太简单了,直接填域名就好了
- 还有一步配置下就好了
第三步 获取code
这不是前端获取的吗??
对的,但是,你调试得用。所以如果简单获取code是一个问题。
步骤
1. 下载微信开发者工具;
2. 扫描二维码登录,选公众号;
3. 看到上边的那个条了吧,把下边的链接粘贴上去;
链接
https://open.weixin.qq.com/connect/oauth2/authorize?appid={{appid}}&redirect_uri={{URL}}&response_type={{code}}&scope={{snsapi_base}}&state=123#wechat_redirect
- appid: 你有
- URL:微信控制台,你已经配置好了
- code: 就是code
- scope: snsapi_base不需要用户点击授权,
放到里边就获取到code了。
image.png第三步 获取Token
前端提交code,后端根据code获取token
// 获取token openId
public static async getTokenOpenId(code: string) {
try {
console.log(code);
const AppId = config.appId;
const Secret = config.sceret;
const url = `https://api.weixin.qq.com/sns/oauth2/access_token?appid=${AppId}&secret=${Secret}&code=${code}&grant_type=authorization_code`;
let { body: result } = await utils.Request.get(url);
result = JSON.parse(result);
console.log(result);
return result;
} catch (e) {
console.log(e);
return "";
}
}
没了,就这万事开头难的结束了。
不过还有更多的坑在前路,风里雨里的等着你。
祝好!