AngularJS接入微信JSSDK小结

作者: 蔑视魔山 | 来源:发表于2016-08-11 17:40 被阅读996次

    最近手里一个微信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小结

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