文档章节

微信js-sdk集成小结

isonghui
 isonghui
发布于 2016/12/01 10:37
字数 1428
阅读 336
收藏 2

完整的官方文档在此:

https://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html

以前有些第三方开发的js库,肯定是不要再用了。

  • 公众号后台配置
    这个js-sdk的使用,是必须依附于一个公众号的,要想配置成功,首先公众号后台得把页面所需的域名配进来(官方文档里有), 注意配置的时候, 要把一个认证文件放在该域名指向的服务器,这个文件就在配置页面上下载
  • 签名的生成
    看似复杂,其实是描述最清晰,实现最简单的,主要就是以下几个步骤:
    • 根据appid获取Token
    • 根据token获取JsTicket
    • 根据JsTicket, 加上客户端传过来的随机字符串(这个真是随便生成一个就可以,写死的也没关系,只要和前端用的一样就行)、时间戳和url(必须是前端页面的完整url地址,这是个大坑,后面会说),用SHA1算法加密生成signature(也就是签名)
      注意:Token和Ticket需要缓存,不能每次都去微信服务器取,会被拒绝的,所以自己记录一下每次来取的时间戳,比较一下, 只要不超过7200秒就可以
      代码片段在此: https://git.oschina.net/songhui/codes/kmanqvby4xz05e2hpwl1r15/widget
       
  • 页面调试
    这里满满的都是坑呀,其实一开始自己写个测试页面,很容易就通过了,后来仅仅是把js代码从html中提取到一个独立js文件中,用微信官方的调试工具,竟然怎么都通不过,每次都报


    config:invalid url domain


    上网到处查,都说是公众号后台域名配置不对,可我明明放在html文件中是可以的呀!!! 后来终于发现, 这居然是"微信web开发者工具"的bug, bug, bug...  同样的页面在手机端的微信里好好的.

    以至于到了后来,我看见invalid url domain都很开心,这表示调试成功了。。。
     
  • 关于url encode
    用到url有两个地方:给自己的后台发请求,获取签名的时候用一次,调用wx.onMenuShareAppMessaged 的时候用一次,获取签名的地址,要和页面自身地址完全一致,如果页面地址简单,是没有任何问题的,如果地址复杂,保护一些"/"之类的特殊字符,就需要encodeURI方法来编码,但偏偏我们的地址非常复杂,带一个子url的参数,这个参数里面还有参数,大概是这个样子:

    http://www.nijilijil.com/llll/url_detail.html?url=http%25253A%25252F%25252Fwww.nijilijil.com%25252Fllll%25252Fpicture_detail.html&id=1613&from=singlemessage

    (最后的from=singlemessage是微信转发的时候加的)用在签名方法里,后端会把&id=后面的当成整个url的参数舍去,这样生成的签名就不对了。

    为了解决这个问题,用了一个比较ugly的办法:把这个url再编码一次,把后面的&编码为特殊字符串"_AND_",后端再解码回来
     
  • 关于调用顺序
    官方文档里只给出了不同API的说明,没有完整的例子,网上的例子通常是这样的:

       

    wx.config({
    
           debug: false,
    
           appId: '1111111111111',// 必填,公众号的唯一标识
    
           timestamp: timestamp,// 必填,生成签名的时间戳
    
           nonceStr: nonce,// 必填,生成签名的随机串
    
           signature: signature,// 必填,签名,
    
           jsApiList: [
    
              'onMenuShareAppMessage',
    
              'onMenuShareQQ',
    
              'onMenuShareWeibo',
    
              'onMenuShareQZone'
    
        ]});
    
        wx.error(function(res){
    
            console.log('出现一个问题:'+res.errorMessage);
    
        });
    
        wx.ready(function(){
    
            console.log('wx准备就绪');
        } 
        var shareConfig = {
    
            title: title, // 分享标题
    
            desc: descr, // 分享描述
    
             link: curl,
    
            imgUrl: image, // 分享图标
    
            type: 'link', // 分享类型,music、video或link,不填默认为link
    
            success: function () {
    
                     console.log('onMenuShareAppMessage ok');
    
                },
    
                cancel: function () {
    
                     console.log('onMenuShareAppMessage cancel');
    
                }
    
        };
    
        wx.onMenuShareAppMessage(shareConfig);
    
    


    config, ready, onMenuShareAppMessage几个属性顺序设置,其实这是有问题的,特别是在手机端,执行比较慢的时候,很可能onMenuShareAppMessage已经设置了, wx.ready还没有被执行,这时设置就失败了,而且没有任何错误信息。正确的做法是把onMenuShareAppMessage调用放在ready方法里面:

       

    var shareConfig = {
    
            title: title, // 分享标题
    
            desc: descr, // 分享描述
    
             link: curl,
    
            imgUrl: image, // 分享图标
    
            type: 'link', // 分享类型,music、video或link,不填默认为link
    
            success: function () {
    
                     console.log('onMenuShareAppMessage ok');
    
                },
    
                cancel: function () {
    
                     console.log('onMenuShareAppMessage cancel');
    
                }
    
        };
    
        wx.onMenuShareAppMessage(shareConfig);

     

  • iframe的处理
    由于我们的页面是一个通用父页面通过iframe容器嵌入子页面,分享的时候,当然希望不同的子页面标题和题图都不同,这时就需要再iframe加载完成后,再获取子页面信息,大致是这样处理的:
    iframe.onload = function(){
    
         console.log("iframe load!");
    
         if(browser.versions.weixin){
    
            shareConfig(iframe.contentWindow.document.title ,iframe.contentWindow.document.title ,iframe.contentDocument.getElementById('share_img_url').innerHTML );
    
         }
    
    };

    其中share_img_url是子页面中为了分享专门设计的标签
     
  • 微信的缓存
    微信缓存是个超级坑,网上也很多说法介绍如何清缓存,都不一定靠谱,包括:
    * 使用系统自带设置->应用设置->微信->清除缓存功能
    * 退出公众号再重新加
    * 卸载微信重新安装(这也太凶残了)
    然而,微信给人的感觉是: 你又千条妙计,我又一定之规,至于规则到底是什么,对不起,无可奉告!所以有时同一个页面,第二次打开就已经刷新缓存了;有时任你怎么清缓存,退出公众号都无效,卸载微信没试,我怕卸了以后再也不想装了。根据经验,清缓存有80%的概率会生效。

    鄙视微信,面向开发者的时候,完全没有面向用户的易用性体验,这种感觉很像以前的微软:windows,office都很好用,但你要是敢用微软产品搭建企业级服务,保证死的很惨。

© 著作权归作者所有

共有 人打赏支持
isonghui
粉丝 4
博文 10
码字总数 4762
作品 0
昌平
加载中

评论(2)

isonghui
isonghui
哈哈,谢谢:grin:
MissSimple
MissSimple
语言风趣幽默
基于Koa.js的微信工具类小记

关于微信公众号开发和小程序开发的教程其实网上已经有很多了,但是基于koa.js 开发的教程其实不多,于是接下来对踩坑的经历做一些小结; 自己也写了一个微信工具类,项目地址是微信工具类 ...

evont
07/09
0
0
深究WeixinJSBridge未定义之因

对于Fundebug这样一个没有使用微信JS-SDK的产品来说,我们竟然收到了WeixinJSBridge is not defined 的报错: 去网上一搜,发现很多开发者都遇到类似的问题: 我的微信项目,没有用到微信JS-...

kiwenlau
2017/02/20
0
0
如何正确的在项目中接入微信JS-SDK

微信JS-SDK的功能 如果你点进来,那么我相信你应该知道微信的JS-SDK可以用来做什么了。微信的官方文档描述如下。 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包。...

detectiveHLH
08/04
0
0
微信公众号开发纪要(4)-调用微信扫一扫功能

在微信公众号页面中调用微信扫一扫功能,就是调用微信JS-SDK。让JS-SDK完成调用摄像头扫描,然后我们将扫描结果进行业务操作。微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页...

pdzhsy
07/16
0
0
微信JS SDK Demo 官方案例

微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包。 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的能力,同时可以直接使...

大道至精
2015/01/14
0
38

没有更多内容

加载失败,请刷新页面

加载更多

20180920 rzsz传输文件、用户和用户组相关配置文件与管理

利用rz、sz实现Linux与Windows互传文件 [root@centos01 ~]# yum install -y lrzsz # 安装工具sz test.txt # 弹出对话框,传递到选择的路径下rz # 回车后,会从对话框中选择对应的文件传递...

野雪球
今天
2
0
OSChina 周四乱弹 —— 毒蛇当辣条

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 达尔文:分享花澤香菜/前野智昭/小野大輔/井上喜久子的单曲《ミッション! 健?康?第?イチ》 《ミッション! 健?康?第?イチ》- 花澤香菜/前野智...

小小编辑
今天
7
3
java -jar运行内存设置

java -Xms64m #JVM启动时的初始堆大小 -Xmx128m #最大堆大小 -Xmn64m #年轻代的大小,其余的空间是老年代 -XX:MaxMetaspaceSize=128m # -XX:CompressedClassSpaceSize=6...

李玉长
今天
4
0
Spring | 手把手教你SSM最优雅的整合方式

HEY 本节主要内容为:基于Spring从0到1搭建一个web工程,适合初学者,Java初级开发者。欢迎与我交流。 MODULE 新建一个Maven工程。 不论你是什么工具,选这个就可以了,然后next,直至finis...

冯文议
今天
2
0
RxJS的另外四种实现方式(四)——性能最高的库(续)

接上一篇RxJS的另外四种实现方式(三)——性能最高的库 上一篇文章我展示了这个最高性能库的实现方法。下面我介绍一下这个性能提升的秘密。 首先,为了弄清楚Most库究竟为何如此快,我必须借...

一个灰
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部