微信分享

需要实现一个微信分享功能,今天好好看了一下微信开发者文档  微信jssdk文档  记录一下步骤 方便以后查看

使用微信 sdk 必须自己实现微信的签名算法。

大概需要4个步骤:

1.获取 access_token;

2.根据 access_token 获取 jsapi_ticket

3. 根据 appId(公众号唯一id)、noncestr(随机字符串)、timestamp(时间戳)、url(当前页面完整url,不包括#aaa=bbb) 通过sha1算法签名

4.将信息返回给前端 , 设置wx.config。

由于获取access_token 和 jsapi_ticket 的接口都有访问限制,所以明确指出需要第三方做缓存处理。此处我们缓存jsapi_ticket 就可以了。

这里面需要配置很多,只需要按照微信给的步骤来,重点是 

wx.config({

    debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。

    appId: '', // 必填,公众号的唯一标识

    timestamp: , // 必填,生成签名的时间戳

    nonceStr: '', // 必填,生成签名的随机串  这个随机字符串是自定义字符串 与下面签名得生成有关 要确保一致性 

    signature: '',// 必填,签名 

    jsApiList: [] // 必填,需要使用的JS接口列表(这里按照微信提供得js接口列表 和你所需要的自己填写)

});

这里主要是签名得生成比较复杂

要生成签名,首先要获取  access_token  文档参考(具体得调用方法可以参考文档 注意点 在“微信公众平台-开发-基本配置”提前将服务器IP地址添加到IP白名单中) 

access_token  是微信提供的访问令牌,有次数限制,所以需要在有效期内将他保存,定时再次请求,防止多次请求而造成次数浪费

一般服务端会请求access_token 在7200s内将他存储在数据库,在从数据库读取使用,防止每次请求获取access_token

开始研究的时候并不知道,将所有得逻辑都放在了前端,包括 获取access_token的方法,产生了跨域问题,利用jsonp方式解决了跨域,却发现ajax请求走了error 在浏览器查看,成功获取到了access_token,但是由于微信提供的是json数据而不是jsonp数据,所以走了error,所以这种方式并不可取。

纯前端实现的话 主要解决的问题就是 定时获取access_token 和存储access_token的问题

附赠一个sha1加密算法 JS

   function add(x, y) {
            return((x & 0x7FFFFFFF) + (y & 0x7FFFFFFF)) ^ (x & 0x80000000) ^ (y & 0x80000000);
        }

        function SHA1hex(num) {
            var sHEXChars = "0123456789abcdef";
            var str = "";
            for(var j = 7; j >= 0; j--)
                str += sHEXChars.charAt((num >> (j * 4)) & 0x0F);
            return str;
        }

        function AlignSHA1(sIn) {
            var nblk = ((sIn.length + 8) >> 6) + 1,
                    blks = new Array(nblk * 16);
            for(var i = 0; i < nblk * 16; i++) blks[i] = 0;
            for(i = 0; i < sIn.length; i++)
                blks[i >> 2] |= sIn.charCodeAt(i) << (24 - (i & 3) * 8);
            blks[i >> 2] |= 0x80 << (24 - (i & 3) * 8);
            blks[nblk * 16 - 1] = sIn.length * 8;
            return blks;
        }

        function rol(num, cnt) {
            return(num << cnt) | (num >>> (32 - cnt));
        }

        function ft(t, b, c, d) {
            if(t < 20) return(b & c) | ((~b) & d);
            if(t < 40) return b ^ c ^ d;
            if(t < 60) return(b & c) | (b & d) | (c & d);
            return b ^ c ^ d;
        }

        function kt(t) {
            return(t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
                    (t < 60) ? -1894007588 : -899497514;
        }

        function SHA1(sIn) {
            var x = AlignSHA1(sIn);
            var w = new Array(80);
            var a = 1732584193;
            var b = -271733879;
            var c = -1732584194;
            var d = 271733878;
            var e = -1009589776;
            for(var i = 0; i < x.length; i += 16) {
                var olda = a;
                var oldb = b;
                var oldc = c;
                var oldd = d;
                var olde = e;
                for(var j = 0; j < 80; j++) {
                    if(j < 16) w[j] = x[i + j];
                    else w[j] = rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
                    t = add(add(rol(a, 5), ft(j, b, c, d)), add(add(e, w[j]), kt(j)));
                    e = d;
                    d = c;
                    c = rol(b, 30);
                    b = a;
                    a = t;
                }
                a = add(a, olda);
                b = add(b, oldb);
                c = add(c, oldc);
                d = add(d, oldd);
                e = add(e, olde);
            }
            SHA1Value = SHA1hex(a) + SHA1hex(b) + SHA1hex(c) + SHA1hex(d) + SHA1hex(e);
            return SHA1Value.toUpperCase();
        }
/*转化为全小写 签名需要所有均为小写*/
        function SHA2(sIn) {
            return SHA1(sIn).toLowerCase();
        }

这里几个参考博客写的很好 放这里方便以后看

微信公众号开发--微信JS-SDK分享到朋友圈和分享给朋友

 

 

 

posted @ 2020-11-17 17:30  明媚下雨天  阅读(139)  评论(0)    收藏  举报