node 获取微信网页签名

2018-08-15  本文已影响0人  洋洋洒洒_6a20

获取签名的步骤

  • 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 就可以看到返回的签名数据了

上一篇下一篇

猜你喜欢

热点阅读