美文网首页
JSSDK 微信分享

JSSDK 微信分享

作者: 阿畅_ | 来源:发表于2019-09-27 10:50 被阅读0次

    记录一下我前段时间做微信分享遇到的麻烦和坑。
    先说一下使用方式,最后写我遇到的坑

    1. 引入 JS 文件
    • 我用的是 <script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.3.2.js"></script>
    • 当然也可以用微信开发者文档上推荐的 1.4 的版本
    1. 初始化 config
    • 首先调用后端的获取获取 jsapi_ticket ,需要传递当前页面的 URL 给后端,后端根据签名算法获取 ticket
    • 上代码
      async initWxConfig() {
        let shareUrl = location.href.split('#')[0]
    
        const { data } = await request.post('url', {
          shareUrl,
          ...
        })
    
        wx.config({
          debug: true, // 是否开启 debug 模式,true 时会把每部的结果为 弹框的形式展现,开发模式建议开启,
          appId: xxx, // 微信公众号 AppId
          timestamp: data.timestamp,
          nonceStr: data.nonceStr,
          signature: data.signature,
          jsApiList: [
            'showMenuItems',
            'hideMenuItems',
            'onMenuShareTimeline',
            'onMenuShareAppMessage'
          ]
        })
    
        // 隐藏不需要做分享的功能
        this.wxHideMenuItems()
        this.wxShowMenuItems()
    
        wxHideMenuItems() {
          wx.ready(() => {
            wx.hideMenuItems({
              menuList: [
                'menuItem:share:qq',
                'menuItem:favorite',
                'menuItem:share:QZone',
                'menuItem:share:weiboApp',
                'menuItem:share:timeline',
                'menuItem:share:facebook',
                'menuItem:share:appMessage'
              ]
            })
          })
        },
      }
      
    
      wxShowMenuItems() {
        wx.ready(() => {
          wx.showMenuItems({
            menuList: [
              'menuItem:share:timeline',
              'menuItem:share:appMessage'
            ]
          })
        })
      },
    
    
    1. 在页面中调用微信分享
      代码如下:
      async wxShare() {
        await this.initWxConfig()
        wx.ready(() => {
          let configData = {
            title: 'xxx', // 分享出去 title
            desc: xxx, // 分享的描述
            link: xxx, // 分享的链接
            imgUrl: xxx, // 分享窗口的小图片 限制 300*300 大小
            type: 'link', // 分享类型,music、video或link,不填默认为link
            dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
            success:function() {
              // 分享成功之后的回调
            }
          }
        })
        wx.onMenuShareTimeline(configData)
        wx.onMenuShareAppMessage(configData)
      }
    

    注意: 因为微信的分享机制改了,如果用户点击了分享,没有选择分享给朋友或者朋友圈,返回页面之后,微信默认提示还是会提示分享成功

    说一说遇到的问题吧

    1. invalid url domain 当前页面所在域名与使用的appid没有绑定,请确认正确填写绑定的域名,仅支持80(http)和443(https)两个端口,其实也不用写端口号
    2. invalid signature签名错误 小问题就不说了,按照微信的文档的步骤,一步一步排除, 主要说一说关于 URL 的问题,这个问题我排除了很久,网上说的方法基本上我都试了,可以说我把百度和Google都给搜遍了😂,最后还是靠自己解决了。
    • 我用的 vue 单页面应用,因为微信 IOS 和 Android 的URL 机制不同,安卓版的 URL 是随着页面 URL 的改变而改变的,但 IOS 不会,它只会记录页面第一次进来的路径(就是调用微信授权回调后的那个页面),所有就会遇到
      ···安卓版的分享是没有问题的,一但到IOS中会报 invalid signature签名错误···
    • 解决方式,判断是否为 IOS 版微信,在授权回调之后,记录下当前页面的 URL,
      if (isIOS) { //判断是否为 IOS 
        let shareUrl = location.href.split('#')[0]
        // 结果你可以存在 window 全局变量中,也可以存在 vuex 状态管理上
      }
    

    然后回去签名的时候,IOS 和 Android 分开传给后端获取 ticket

    • 之后会提醒签名成功之类的,但别太开心,试着分享出去,会遇到偶尔可以分享成功偶尔不可以(成功的意思是,自定义的title那些也会出来),我是遇到这个问题了,不知道你会不会,这个问题网上没有找到解决办法,在微信开发者社区好像有人提过,我看的时候并没有人回答...

    因为我突然想到 我第一版活动 并没有做 IOS 和 Android 的区分,就直接获取截取'#' 之前的 URL 就都可以实现分享,但对比代码也没有找到原因,然后突然想到我的 vue-router 版本不一样,因为我之前做了代码优化,router 用 cdn 引入的,用的版本太高了,我最的最新版 3.1.1 版本的,我把 router 的版本回到当初创建项目时的版本 2.6 发现这个问题解决了... 也不用TM区分环境了,直接获取 # 之前的 URL 就可以了

    1. 遇到 IOS 分享成功后,图片不显示 安卓可以
    • 这个原因是 IOS 分享 小图片的URL 必须要是白名单的 URL 地址。

    相关文章

      网友评论

          本文标题:JSSDK 微信分享

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