完美解决微信js-sdk在IOS系统报invalid signature的问题
作者原创,转载注明出处
一、解决方案
先说结论再说过程:
(一)npm i jweixin-1.6.0 。系本人优化封装。修正了微信js-sdk官方1.6.0的bug,并针对iOS系统url验证签名错误进行优化。
(二)在需要分享的页面引入。
import wx from 'jweixin-1.6.0'
正常情况,按官方标准编码即可。
(三)如果IOS系统的分享有问题(请自行编码判断苹果和安卓)。向后台请求的地址:
signLink = decodeURIComponent(wx.signurl())
signLink是wx.config 需要验证签名的url。其中wx.signurl(),系本人增加。
二、问题现象
(一)vue开发微信公众号单页应用。自定义图文消息分享好友、群、朋友圈。项目使用了三方封装的weixin-js-sdk。该工具基于微信js-jdk 1.4.0封装,npm安装。
- 安卓手机测试正常。
- 微信开发者工具正常。
- 苹果手机无法分享。
- wx.config开启debug模式。苹果手机显示invalid signature。
- 使用updateAppMessageShareData。显示offline verifying。
(二)本项目使用history,url没有#符号。 试遍网上主要方法,均无有效解决方案。原因很明确。苹果系统浏览器url保存问题。
- 本项目单页应用,打开即获取微信授权及用户信息。问题现象是,苹果手机url为带着微信返回code的地址。不符合安全以及业务使用需要。因此使用replace替换为业务地址。如
/?code=xxxx&state=123456
在显示时需要被改为
/?order=123456。
- 此时苹果手机无法使用正确的地址验证签名。尝试使用所有可能的url写死给config验证签名,均无效。
三、解决思路
(一)方案思路。两个方向,一是升级jdk1.4.0到1.6.0,用新的可能会好。二是找到正确的url,并进行签名验证。
-
试了很多网上的npmjs中的1.6.0版本,包括在head里直接引入
<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
。都报document
not a function。说明这个版本存在bug。需改正。 -
根据print出的地址写死,仍然验证无效。说明验证前后有转码。需让jdk在验证前把地址返回。
四、实施步骤
- 自微信官方获取SDK版本https://res.wx.qq.com/open/js/jweixin-1.6.0.js。
- 测试并修正该版本的bug。
- 找到SDK中验证url参数,用signurl:function返回。
- 发布到github:https://github.com/luquan22/jweixin-js-sdk。具体改动见github的readme。
- 发布到npm。