微信公众号开发

  目录

微信公众号开发简介

微信公众号开发比较繁琐,先来看一下大致架构:
img
服务器鉴权这块,应该是比较难的。
这里有两个需要鉴权的地方,一个是基本配置里的URL接入鉴权,另一个是JS-SDK的鉴权。

URL接入鉴权

img
上图中的这个URL是微信公众平台接入到自己的后台服务器的接口鉴权,URL可以写成这样http://jinux.top/weixinapi
看一看微信公众平台的定义:

开发者通过检验 signature 对请求进行校验(下面有校验方式)。若确认此次 GET 请求来自微信服务器,请原样返回 echostr 参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与 signature 对比,标识该请求来源于微信

官网文档地址
验证signature的示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
function checkSignature() {
let { signature, timestamp, nonce, echostr } = req.query;
let token = 'testweixin'; // 这个token是上图中的填写的Token
let array = [timestamp, nonce, token];
array.sort(); // 字典排序
let str = array.join('');
let resultStr = sha1(str); // 对字符串进行sha1加密,需要const sha1 = require('sha1')
if(resultStr === signature) {
res.send(echostr);
}else {
res.send('Error');
}
}

JS-SDK使用

官方文档地址
js-sdk使用流程图:
img
在网页中调用微信赋予的功能时,需要config 接口注入权限验证配置:

1
2
3
4
5
6
7
8
wx.config({
debug: true, // 开启调试模式,调用的所有 api 的返回值会在客户端 alert 出来,若要查看传入的参数,可以在 pc 端打开,参数信息会通过 log 打出,仅在 pc 端时才会打印。
appId: '', // 必填,公众号的唯一标识
timestamp: , // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '',// 必填,签名
jsApiList: [] // 必填,需要使用的 JS 接口列表
});

timestamp, nonceStr, signature需要后台生成。
接下来,看一下生成流程

获取ticket

1
2
3
4
5
6
7
8
9
async function getTicket() {
let tokenUrl = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appid}&secret=${secret}`;
let token_data = await axios.get(tokenUrl);
let access_token = token_data.data.access_token; // 得到access_token
let ticketUrl = `https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=${access_token}&type=jsapi`;
let ticket_data = await axios.get(ticketUrl);
let ticket = ticket_data.data.ticket; // 获取jsp_ticket
return ticket;
}

生成nonceStr

1
2
3
function createNonceStr() {
return Math.random().toString(36).subStr(2, 15);
}

生成timestamp

1
2
3
function createTimestamp() {
return parseInt(new Date().getTime() / 1000) + '';
}

生成signature

签名生成规则如下:
1)参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。
2)对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用 URL 键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。
3)这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 处理数据格式
function row(obj) {
let keys = Object.keys(obj);
keys = keys.sort(); // 字典排序
let newObj = {};
keys.forEach(key=> {
newObj[key] = obj[key];
});
let string = '';
for(let k in newObj) {
string += '&' + k + '=' + newObj[k];
}
string = string.subStr(1);
return string;
}
// 生成signature签名方法
async function getSignature(url) {
let jsapi_ticket = await getTicket();
var obj = {
jsapi_ticket,
nonceStr: createNonceStr(),
timestamp: createTimestamp(),
url
}
let str = row(obj);
let signature = sha1(str);
obj.signature = signature;
return obj;
}

人脸识别认证

微信是提供了人脸识别验证接口的,该接口目前是免费的,并且是适用公众号的。由于该接口属于未开放接口,所以在微信JS-SDK说明文档是无法查看到该接口文档的,需要写邮件给腾讯进行申请审核,如果申请通过,腾讯会回复邮件,开通对应公众号的调用权限,并会发送接口文档。
开通人脸识别方法

总结

以上只是简单的列举了URL接入鉴权和JS-SDK的鉴权,这两个也是公众号中最繁琐的地方。