获取签名的步骤
- 1.获取jspai_ticket
- 2.使用签名算法生成签名
本文只展示了node的实现 其他平台实现见官方demo传送门
具体签名算法传送门
什么是jsapi_ticket
jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。由于获取jsapi_ticket的api调用次数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存jsapi_ticket 。
请求方式
get https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi
//返回
{
"errcode":0,
"errmsg":"ok",
"ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",
"expires_in":7200
}
获取签名
签名算法
注意 jssha 的版本 为 "jssha": "^1.5.0"
//随机字符串
var createNonceStr = function () {
return Math.random().toString(36).substr(2, 15);
};
//时间戳
var createTimestamp = function () {
return parseInt(new Date().getTime() / 1000) + '';
};
//对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1
var raw = function (args) {
var keys = Object.keys(args);
keys = keys.sort()
var newArgs = {};
keys.forEach(function (key) {
newArgs[key.toLowerCase()] = args[key];
});
var string = '';
for (var k in newArgs) {
string += '&' + k + '=' + newArgs[k];
}
string = string.substr(1);
return string;
};
/**
* @synopsis 签名算法
*
* @param jsapi_ticket 用于签名的 jsapi_ticket
* @param url 用于签名的 url ,注意必须动态获取,不能 hardcode
*
* @returns
*/
var sign = function (jsapi_ticket, url,appId) {
var ret = {
jsapi_ticket: jsapi_ticket,
nonceStr: createNonceStr(),
timestamp: createTimestamp(),
url: url
};
var string = raw(ret);
jsSHA = require('jssha');
//对string作sha1签名
shaObj = new jsSHA(string, 'TEXT');
ret.signature = shaObj.getHash('SHA-1', 'HEX');
ret.appId=appId;
return ret;
};
//暴露sign方法
module.exports = sign;
使用
为了简化操作,这里使用到了express 和 wechat-api
var API = require('wechat-api');
var express = require('express');
var sign = require('./sign');//上面的签名算法
var app = express();
var config = {
appid : "your appid",
appsecret : "your appsecret"
};
var api = new API(config.appid, config.appsecret);
api.getAccessToken(function (err, token) {
console.log(err);
console.log(token);
});
app.get("/sign",(req,res)=>{
//获取ticket
api.getTicket((err,result)=>{
if(err) throw new Error(error);
//签名
var ret = sign(result.ticket,req.query.url,config.appid);
res.json(ret);
});
});
app.listen(3000);
最后使用游览器访问 localhost:3000/sign?url=http://wechat.xxx.com 就可以看到返回的签名数据了
网友评论