微信分享
需要实现一个微信分享功能,今天好好看了一下微信开发者文档 微信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分享到朋友圈和分享给朋友

浙公网安备 33010602011771号