美文网首页
node 获取微信网页签名

node 获取微信网页签名

作者: 洋洋洒洒_6a20 | 来源:发表于2018-08-15 08:35 被阅读0次

    获取签名的步骤

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

    相关文章

      网友评论

          本文标题:node 获取微信网页签名

          本文链接:https://www.haomeiwen.com/subject/oilibftx.html