AngularJS接入微信JSSDK小结

最近手里一个微信WEB项目,需要接入微信的部分功能——诸如“录音”、“文件上传”等等。一开始我只是当做一个普通的web工程在做,选了Framework7作为UI+逻辑框架,也算是练练手。之后发现Template7在逻辑代码的组织上存在一些我不大习惯的地方,于是还是回归了AngularJS。


配置清单:

Angular:1.5.7

Angular-UI-Router:0.3.1

微信JSSDK:1.0.0

微信调试工具:0.3。0


资源:

微信测试号申请:http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index

签名验证:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign

接口调试:http://mp.weixin.qq.com/debug/


1.需要准备的内容:

公众号的APPID和Secret:这个我是直接在测试页面拿到的。

调试工具:一定要有,因为直接在控制台看,和真机的偏差还是较大的。

2.原理:

通过APPID和Secret生成token,通过token生成api的票据(ticket),通过票据算出配置,传入配置,激活wx对象,在wx对象ready之后,即可调用方法。

而且后面会讲到,wx对象接受的配置里,加密字符串是包含了当前页面的地址的,只对单地址有效的,这个地址是#之前的部分,而使用了UI-router后,Angular项目——推测其他SPA也是——只有一个地址,这就使得只需要做一次wx对象的初始化,方便了不少。

3.config文件的生成:

这个我最初理解错了,想写在客户端,但是后来发现只要服务器持有一个7200s的token和ticket就可以。于是我拿Node在服务端写了一个简单的方法,用于生成。具体代码不贴了,超级简单。

时间戳代码:

Date.parse(newDate()) /1000

4.wx初始化

wx对象初始化时接受的config对象中,有一个signature,signature是由ticket、noncestr、时间戳、当前地址拼接成的字符串,SHA-1加密生成的。故当你URL变了之后,需要重新获取。

这里我使用了【https://www.zhihu.com/question/48160043】这个问题中的方法。在run方法中直接调用$http去获取config,然后在每个Controller中只是进行$window.wx的ready。

//利用angular初始调用

angular.module("wechatShare",[])

.run(function($http,$window,$location){

//利用http将$location.$$absUrl发送到后端并完成签名,再将签名等参数发送回前端,前端再利用返回来的参数填入config:

$http(

url: 实现签名的后端url,

method:"post",

data: {url: $location.$$absUrl},

).then(

function(res){

$window.wx.config(res.config);

}

);

})

.controller("sharePageCtrl", function($window,$scope){

//在每一个需要分享的页面对应的controller,调用wx.ready():

/*建议可建一个factory,就不用每个controller给微信写一大串代码了*/

$window.wx.ready(

function(){

$window.wx.onMenuShareTimeline({});

$window.wx.onMenuShareAppMessage({});

}

);

})

这样其实有个问题,就是错误处理其实比较麻烦……我还没想到好的方法。


以上就是正常流程。下面是错误处理:

首先,在wx初始化时,如果是签名错误,请仔细核对每一个字段,我出现过两个错误:1.时间戳不对;2.&符号错误。请务必——仔细核对!。

其次,如果是URL不合规,这里有个tips:首先,测试号允许使用IP而非域名进行安全域的注册,其次,localhost可以写成127.0.0.1。这样的话,就可以注册本机了。

第三,当测试号使用IP时,一定要注意,只写IP和Port,千万……不要写……协议。参见【http://blog.csdn.net/zyf_balance/article/details/48178353】

这样下来,就可以了。


P.S.:因为文章写的时候还不会markdown,所以代码比较乱。

你可能感兴趣的:(AngularJS接入微信JSSDK小结)