最近去一家公司实习,需要做微信分享功能,于是研究了研究微信分享的JSAPI。微信这个API,说复杂也不复杂,说简单,倒也是是有一堆坑在等着。分享这个功能前前后后研究折腾了一个星期,遇到不少问题,想来把自己的经验都分享分享。
1. 签名
签名个人认为是实现微信分享中逻辑相对而言较为复杂的一个部分了,为了正确的配置签名逻辑,则必须熟读微信API的文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115
不过,必须要稍稍批评一下微信SDK的文档写的似乎不是很走心?行文比较随意,结构也不是很清晰。对照文档实现算法逻辑的时候感觉并不是能够非常快速地找到自己所需的内容。
总之,签名逻辑的主要步骤如下,全部逻辑都在服务器端实现:
- 去公众号里找到你的appid和secret,收好。
- 服务器端通过以下文档中的说明获取access token,token的有效期为7200秒。微信API请求有次数限制,并且重复请求会降低响应速度,所以需要全局缓存access token,每次进行签名时检查token存在性和有效性。相关文档: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183
- 利用有效的access token获得jsapi_ticket,同理进行全局缓存。
- 根据请求页面的地址获得url参数、自己生成一个随机字符串(长度文档中明没有明确说明,示例中使用的随机串长度为16)、获取当前时间戳。
- 将参数加密,得到签名。
2. 页面配置
页面的配置非常简单,先引入相关js文件,然后按照文档进行配置,每个参数都填好就可以了。
问题篇
我在实现自定义分享的过程中遇到许多问题,其中一个是分享莫名失败,明明在微信web开发者工具中能够正常工作,到了真机环境中,配置显示正确却无法实现自定义分享;另一个就是自定义分享在Android与ios端的表现非常不同,许多情况下Android可以正常分享,而IOS不行,而IOS调试起来非常困难,网上也有许多的疑问,都没有太多的解决方案。
在此提供几个解决问题的思路:
- 按照微信官方文档中的说明,把能解决的都先解决了。
- 检查微信调用的各种接口配置(如onMenuShareTimeline)是否放在wx.ready回调中。我一开始的前端逻辑为,页面加载时配置JSSDK,用户点击页面上的分享按钮时注册相关接口,并弹出引导分享蒙层,全部配置都显示ok,但是发现此时Android手机中点击分享后无任何反应,ios虽然能进行分享,但无法实现自定义,经各种尝试确定是由于注册接口时没有写在ready()中导致。
- 尽管微信文档中仅仅明确说明了设置安全域名时仅支持http和https,但在自定义分享链接中也尽量不要出现带有端口号的链接地址,有可能造成IOS端无法进行自定义分享的问题。
- 如果公众号中配置了多个安全域名,需要注意,自定义分享的链接可能需要与当前页的链接匹配同一个安全域名。
- 我没办法了,再查查网上别的说法吧,比如分享图标大小限制之类的。
微信的心思不要猜……很多情况下,Android端却可以成功分享,在开发者工具中调试时也看不出任何问题,但是在IOS端却无法实现自定义分享,同时IOS调试起来十分困难,所以就更令人匪夷所思了。我在解决自己遇到的问题时也是主要靠猜,能够顺利解决也是十分幸运了。可以看出,微信IOS端对自定义分享的配置验证过程更为严格,不过这样区别对待的理由也是不得而知。
个人看法,很多时候造成这样的问题还是由于微信文档编写的不够充分、结构不够清晰造成的。开发者并不知道什么原因可能会造成自定义分享失败,文档中的有些排错指示,但并不能面面俱到,许多情况下还需要开发者自己摸索。
最后,希望这篇文章能够帮到大家,配置自定义分享时少走弯路。