本文讲前端如何独立的进行微信开发(没有搭建后台,如何经过config接口注入权限验证配置)。css
一、申请微信公众号成功后,进入微信公众平台(https://mp.weixin.qq.com/),登陆。html
二、在开发者工具中选择公众平台测试帐号,点击进入,微信扫码受权登陆。前端
三、进入测试号页面,获得测试号信息:jquery
四、完成JS-SDK使用权限签名算法。git
首先获取access_token(有效期7200秒,开发者必须在本身的服务全局缓存access_token):打开连接https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET,连接中的APPID和APPSECRET用步骤3中获得的测试号信息对应的替换,便可成功返回access_token,好比个人返回数据以下:github
{ access_token: "br8H90LtER9bYV2X6w21gn2ncpNsk47jJqlunDxYHVVLqsjjP99OJd3cLTxrNg_xp7Pxry_aZ5JBVClfjrXE07m9j3LkSkFRDvDhmSK3Lp0BwsafdgTD0ZrnaDnkd0RuUCMjAJANVF", expires_in: 7200 }
而后获取jsapi_ticket(有效期7200秒,开发者必须在本身的服务全局缓存jsapi_ticket):打开连接https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi,连接中的ACCESS_TOKEN用上一步获取的access_token替换,便可成功返回jsapi_ticket,好比个人返回数据以下:算法
{ errcode: 0, errmsg: "ok", ticket: "kgt8ON7yVITDhtdwci0qefauZHtIntmVAA1tkdyuhJBV868ar6VeAiJpPeg-hDCbtfKfWaHOGS28YeeeqPyHTQ", expires_in: 7200 }
而后按照微信文档说明的签名算法获取signature。api
下面咱们分解一下该签名算法:缓存
首先准备原材料,一共须要四个原料:noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。jsapi_ticket在咱们完成以上步骤后就获得了,url就是咱们开发的页面的url,那么咱们实际上只差随机字符串和时间戳。安全
如今咱们经过如下代码制造一个随机字符串:
function generateRandomString() { return (Math.random().toString(36).substr(2)); } var noncestr = encodeURIComponent(generateRandomString());
经过微信文档示例,发现时间戳单位为秒,因而咱们经过如下代码实现:
var timestamp1 = new Date().getTime()/1000; var timestamp = timestamp1.toFixed(0);
那么如今原材料备齐!
接下来按照规则处理原材料。首先完成拼接:
var array = new Array(jsapi_ticket, noncestr, timestamp, url); var str = 'jsapi_ticket=' + array[0] + '&' + 'noncestr=' + array[1] + '&' + 'timestamp=' + array[2] + '&' + 'url=' + array[3];
而后对上面拼接完的字符串进行sha1加密,便可获得signature。可是怎么加密呢?通过实践发现,咱们可使用cryptoJS,参考cryptoJS(https://github.com/brix/crypto-js)在github上的说明,经过如下代码加密:
var sign = CryptoJS.SHA1(str).toString();
五、参考微信文档JSSDK使用步骤,前2步就不说了,主要说一下步骤三,经过config接口注入权限验证配置。经过本文以上步骤,咱们能够直接配置以下:
wx.config({ debug: true, // 开启调试模式,调用的全部api的返回值会在客户端alert出来,若要查看传入的参数,能够在pc端打开,参数信息会经过log打出,仅在pc端时才会打印。 appId: '你的测试号appid', // 必填,公众号的惟一标识 timestamp: timestamp, // 必填,生成签名的时间戳 nonceStr: noncestr, // 必填,生成签名的随机串 signature: sign, // 必填,签名,见附录1 jsApiList: ['chooseImage'] // 必填,须要使用的JS接口列表,全部JS接口列表见附录2 });
六、开启服务器,访问页面,just enjoy your coding!
附录:
1、注意事项:
一、开发页面的url要配置到上文3中提到的js接口安全域名中(不然config配置时会报错invalid url domain);
二、手机微信要关注测试公众号,不然访问页面后没法体验设计到微信接口的功能。
2、参考文献:
一、微信JS-SDK说明文档(http://mp.weixin.qq.com/wiki/11/74ad127cc054f6b80759c40f77ec03db.html);
二、crypto-js(https://github.com/brix/crypto-js)。
3、感谢老大cyn的指导。
4、demo代码以下.
html文件:
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1" />
<title>test</title>
<link rel="stylesheet" href="../../dist/css/index.css" />
<script src="../../dist/lib/jquery/jquery-2.2.0.min.js"></script>
<script src="../../dist/lib/wx/jweixin-1.0.0.js"></script>
<script src="../../dist/lib/crypto-js.js"></script>
<script src="../../dist/js/main.js"></script>
</head>
<body>
hello world!
</body>
</html>
js文件:
/** * * @authors lovelyun * */ $(function () { var data = { token: { access_token: "your token", expires_in: 7200 }, ticket: { errcode: 0, errmsg: "ok", ticket: "your ticket", expires_in: 7200 } }; var noncestr = encodeURIComponent(generateRandomString()); var timestamp1 = new Date().getTime()/1000; var timestamp = timestamp1.toFixed(0); var jsapi_ticket = data.ticket.ticket; var url = 'http://192.168.2.109:3000/dist/html/index.html'; var array = new Array(jsapi_ticket, noncestr, timestamp, url); var str = 'jsapi_ticket=' + array[0] + '&' + 'noncestr=' + array[1] + '&' + 'timestamp=' + array[2] + '&' + 'url=' + array[3]; var sign = CryptoJS.SHA1(str).toString(); function generateRandomString() { return (Math.random().toString(36).substr(2)); } wx.config({ debug: true, // 开启调试模式,调用的全部api的返回值会在客户端alert出来,若要查看传入的参数,能够在pc端打开,参数信息会经过log打出,仅在pc端时才会打印。 appId: 'your appid', // 必填,公众号的惟一标识 timestamp: timestamp, // 必填,生成签名的时间戳 nonceStr: noncestr, // 必填,生成签名的随机串 signature: sign, // 必填,签名,见附录1 jsApiList: ['chooseImage'] // 必填,须要使用的JS接口列表,全部JS接口列表见附录2 }); });