微信jssdk进行分享功能

前端的工作

  1. 步骤一:绑定域名
    先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。

  2. 步骤二:引入JS文件
    http://res2.wx.qq.com/open/js/jweixin-1.6.0.js (支持https)。

  3. 步骤三:通过config接口注入权限验证配置
    所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用)

  • timestamp,nonceStr,signature这三个值必须后端返回来
wx.config({
  debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  appId: '', // 必填,公众号的唯一标识
  timestamp: '', // 必填,生成签名的时间戳
  nonceStr: '', // 必填,生成签名的随机串
  signature: '',// 必填,签名
  jsApiList: [] // 必填,需要使用的JS接口列表
});
  1. 步骤四:通过ready接口处理成功验证
wx.ready(function(){
  // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
});
  1. 步骤五:通过error接口处理失败验证
wx.error(function(res){
  // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
});

后端的工作

  1. 获取access_token(有效期7200秒,开发者必须在自己的服务全局缓存access_token):此处需要用到appId和appsecret

  2. 用第一步拿到的access_token 采用http GET方式请求获得jsapi_ticket(有效期7200秒,开发者必须在自己的服务全局缓存jsapi_ticket):https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi

  3. 生成JS-SDK权限验证的签名:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分)

  4. 返回给前端timestamp,nonceStr,signature,前端需要传appId,url给后端

  5. 出于安全考虑,开发者必须在服务器端实现签名的逻辑。

最后的样子

  const appId = 'xxx';
  const url = window.location.href.split('#')[0];
  getWxJssdkSignReq({ appId, url})
    .then((res) => {
      const config = res.result
      wx.config({
        debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
        appId: appId, // 必填,公众号的唯一标识
        timestamp: config.timestamp, // 必填,生成签名的时间戳
        nonceStr: config.nonceStr, // 必填,生成签名的随机串
        signature: config.signature, // 必填,签名,见附录1
        jsApiList: [
          'updateAppMessageShareData', 'updateTimelineShareData'
        ] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
      })

      wx.ready(() => {
        const shareConfig = shareInfo; // 自己定义的分享信息
        const title = shareConfig.title || '';
        const imgUrl = shareConfig.pic || '';
        const desc = shareConfig.content || '';
        const link = window.location.href;

        // 分享朋友
        wx.updateAppMessageShareData({
          title: title, // 分享标题
          desc: desc, // 分享描述
          link: link, // 分享链接
          imgUrl: imgUrl, // 分享图标
          success: function () {
            // 用户确认分享后执行的回调函数
            console.log('分享朋友 success')
          }
        });

        // 分享朋友圈
        wx.updateTimelineShareData({
          title: title,
          link: link, // 分享链接
          imgUrl: imgUrl, // 分享图标
          success: function () {
            // 用户确认分享后执行的回调函数
            console.log('分享朋友圈 success')
          }
        });
      })

      wx.error((err) => {
        console.log('----wx error----: ', err)
      })
    })
    .catch(err => {
      console.log('----wxconfig catch err----: ', err)
    })

遇到的困难

  1. config:require subscribe:由于测试环境用的测试公众号,所以需要先关注公众号才行。


    image.png
  2. config:invalid signature:签名失败,这个是很磨人而且经常遇到的问题
    解决流程:
  • 确认签名算法正确,可用http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 页面工具进行校验。
  • 确认url是页面完整的url(请在当前页面alert(location.href.split('#')[0])确认),包括'http(s)://'部分,以及'?'后面的GET参数部分,但不包括'#'hash后面的部分。确保后端解析到用来签名的url和前端发送的一致(此处很坑),如果是get方法请求的,根据需要进行encodeURIComponent(location.href.split('#')[0])处理,后端需要decode(因为url中有&时会被浏览器截断导致签名不正确,如果是post请求也要注意后端是否把&转义成&amp了)。
  • 确认 config 中的 appid 与用来获取 jsapi_ticket 的 appid 一致。
  • 检查当前appId对应的“公众号设置”的“功能设置”里是否填写“JS接口安全域名”。
  • 确保一定缓存access_token和jsapi_ticket。
    官方的解决方案:


    image.png
  1. 分享出去的图片没显示
    项目中设置为封面的本地图片较小,在打包过程中被打包成了base64字符串,因此分享参数中拿到的也是base64字符串。所以在配置成imgUrl时,在PC端可以正常显示,但是在手机端显示的就有问题。最后让UI切了超过项目打包文件限制的图片资源作为封面,解决了这个问题。

参考文章

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容