在单页应用(SPA)上调微信支付接口,地图接口,分享接口等。都是坑啊!

前端调微信接口无非是:(注入配置信息成功)=>(调用微信方法),对的,就是这样!说起前端调微信的方法很简单,但是在SPA页面上调微信的东西就知道多坑了。前端只需要传当前页面的url到后台,后台返回我们想要的时间戳,随机串,签名等!还有在公众号上配什么安全域名等等!

在这里先说url吧!在vue的单页面上调微信的接口!
vue框架开发上调微信接口(切记在vue上跳转的页面都是在同一页面上,说白了就是通过路由控制显示哪个组件!还是在一个页面上)

1.调微信地图和微信分享好友等等

ios:

在调取(注入配置信息成功)后,就可以调微信的接口了,之后在哪个页面上需要调微信的方法就直接在jsApiList: [] 写就可以了!注意:如果你在vue上调过一次无需在调(配置信息),在重调的话,ios上就有调不出来微信的方法了

安卓上:

在哪个页面需要调微信的方法必须要重新调取(注入配置信息成功)后,才可以调微信的接口。

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


wx.ready(() => {
    wx.getLocation({
      type: 'gcj02', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
      success: (res) => {
        const latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
        const longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
        commit(types.UPDATE_LOCATION, {latitude, longitude});
      }
    });
  });

调微信支付

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



wx.chooseWXPay({
    timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
    nonceStr: '', // 支付签名随机串,不长于 32 位
    package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
    signType: '', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
    paySign: '', // 支付签名
    success: function (res) {
        // 支付成功后的回调函数
    }
});
注意:配置好支付授权目录,该目录必须是发起支付的页面的精确目录,子目录下无法正常调用支付。(微信支付路径要求二级或以上路径)

所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用,目前Android微信客户端不支持pushState的H5新特性,所以使用pushState来实现web app的页面会导致签名失败,此问题会在Android6.2中修复)。

推荐阅读更多精彩内容