vue引入微信jssdk / SDK
vue 2017-12-27 08:59:35

vue2引入微信JSSDK

可以参照:https://ask.dcloud.net.cn/article/35380

 

vue3引入微信JSSDK,会报错require is not defined

C/C++ Code复制内容到剪贴板
  1. npm install weixin-js-sdk -S  

 

使用:import * as jWeixin from 'weixin-js-sdk'

 

 

使用场景,uni-app

在store中添加state

XML/HTML Code复制内容到剪贴板
  1. openid: "",         // 公众号的openid  
  2. accessToken: "",        // 公众号的access_token  
  3. baseOpenidKey: "DOOR_MANAGE_H5_OPENID", // 用户的openid缓存Key  

 

mutations 添加commit方法:

JavaScript Code复制内容到剪贴板
  1. setOpenid(state, params){  
  2.         state.openid = params.openid  
  3.         state.accessToken = params.access_token  
  4.         // 缓存更新  
  5.         uni.setStorage({  
  6.             key: state.baseOpenidKey,  
  7.             data: params,  
  8.             success: (result) => {  
  9.                 // 保存成功  
  10.                 // console.log("openid和access_token缓存更新成功", params);  
  11.             },  
  12.             fail: () => {  
  13.                 uni.showToast({  
  14.                     title: '存储openid和access_token数据失败',  
  15.                     icon:'none'  
  16.                 });  
  17.             }  
  18.         })  
  19.     },  

 

action中添加dispatch方法:

JavaScript Code复制内容到剪贴板
  1. /** 
  2.  * 初始化获取openid 
  3.  */  
  4. initOpenid: async function({  
  5.     dispatch,  
  6.     commit,  
  7.     state  
  8. }, params) {  
  9.     return await new Promise((resolve, reject) => {  
  10.         uni.getStorage({  
  11.             key: state.baseOpenidKey,  
  12.             success:async (res) => {  
  13.                 // console.log("从缓存中初始化openid", res.data);  
  14.                 commit('setOpenid', res.data)  
  15.                 resolve(res.data.openid);  
  16.             },  
  17.             fail: (err) => {  
  18.                 reject("获取openid缓存信息失败,仅提示");  
  19.             }  
  20.         })  
  21.     })  
  22. },  

 

再添加一个自定义JS文件:wechat.js

JavaScript Code复制内容到剪贴板
  1. // #ifdef H5  
  2. import * as jWeixin from 'weixin-js-sdk'  
  3. import GraceRequest from '@/Grace6/js/request.js'  
  4. import GraceRequestConfig from "@/custom/graceRequestConfig.js"  
  5.   
  6. // 需要调用的微信api列表  
  7. export const WXAPI = [  
  8.     // 'chooseWXPay',  
  9.     // 'updateAppMessageShareData',  
  10.     // 'updateTimelineShareData',  
  11.     // 'onMenuShareAppMessage',  
  12.     // 'scanQRCode',   
  13.     'getLocation'  
  14. ]  
  15.   
  16. export default {  
  17.     /** 
  18.      * 判断是否在微信中 
  19.      */  
  20.     isWechat() {  
  21.         var ua = window.navigator.userAgent.toLowerCase();  
  22.         if (ua.match(/micromessenger/i) == 'micromessenger') {  
  23.             //console.log('是微信客户端')    
  24.             return true;  
  25.         } else {  
  26.             //console.log('不是微信客户端')    
  27.             //以下是我项目中所需要的操作其他,可以自定义  
  28.             uni.showModal({  
  29.                 title: '提示',  
  30.                 content: '请在微信浏览器中打开',  
  31.                 showCancel: false,  
  32.                 confirmColor: '#00875a',  
  33.                 success: function(res) {  
  34.                     if (res.confirm) {  
  35.                         // console.log('用户点击确定');  
  36.                     } else if (res.cancel) {  
  37.                         // console.log('用户点击取消');  
  38.                     }  
  39.                 }  
  40.             });  
  41.             return false;  
  42.         }  
  43.     },  
  44.     /** 
  45.      * H5下获取openid,这里需要传参两个值 
  46.      * @param {Object} params 
  47.      * const params = { 
  48.      *      code: '',  // 交换了之后的code  
  49.      *      appid: '公众号的唯一标识', 
  50.      *  } 
  51.      */  
  52.     async getH5AuthCode(params) {  
  53.         return new Promise((resolve, reject) => {  
  54.             if (!this.isWechat()) {  
  55.                 reject('不是微信客户端')  
  56.                 return  
  57.             }  
  58.             const appid = params.appid  
  59.             if(!appid) {  
  60.                 reject('缺少appid')  
  61.                 return;  
  62.             }  
  63.             // 从本地读取是否已存在openid  
  64.             uni.store.dispatch('initOpenid').then(openid => {  
  65.                 reject('已有openid,无需授权' + openid)  
  66.             }).catch(err => {  
  67.                 let aaa = window.location.search  
  68.                 if(!aaa){  
  69.                     let url = GraceRequestConfig.URL + window.location.pathname + window.location.hash   //这里使用完整地址  
  70.                     // console.log('跳转回头的url', url)  
  71.                     url = encodeURIComponent(url)  
  72.                     // 已认证服务号,默认拥有scope参数中的snsapi_base和snsapi_userinfo 权限  
  73.                     const locationHref = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' + appid + '&redirect_uri='+url+'&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect'  
  74.                     window.location.href = locationHref  
  75.                 }else{  
  76.                     const queryString = aaa.split('?')[1];  
  77.                     if (!queryString) {  
  78.                         uni.showToast({  
  79.                             title: '缺少参数',  
  80.                             icon: 'error'  
  81.                         });  
  82.                         reject('缺少参数')  
  83.                         return  
  84.                     }  
  85.                     const params = queryString.split('&');  
  86.                     // console.log('跳转的参数', params)  
  87.                     const result = {};  
  88.                     params.forEach(param => {  
  89.                     const [key, value] = param.split('=');  
  90.                         // result[key] = decodeURIComponent(value);  
  91.                         result[key] = value  
  92.                     });  
  93.                     if(!result.code){  
  94.                         uni.showToast({  
  95.                             title: '缺少code参数',  
  96.                             icon: 'error'  
  97.                         });  
  98.                         reject('参数错误,缺少code')  
  99.                         return  
  100.                     }  
  101.                     resolve(result.code)  
  102.                 }  
  103.             })  
  104.               
  105.         })  
  106.     },  
  107.     /** 
  108.      * H5下获取openid,这里需要传参两个值 
  109.      * @param {Object} params 
  110.      * const params = { 
  111.      *      code: '',  // 交换了之后的code  
  112.      *      appid: '公众号的唯一标识', 
  113.      *      secret: ‘公众号的appsecret',    // 因为每个appid不同,所以这里需要带参 
  114.      *  } 
  115.      */  
  116.     async getH5OpenId(params) {  
  117.         return new Promise((resolve, reject) => {  
  118.             if (!this.isWechat()) {  
  119.                 reject('不是微信客户端') 
  120.                 return; 
  121.             } 
  122.             // 参考文档 
  123.             // https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html 
  124.             const openid = uni.store.state.openid 
  125.             if(openid) { 
  126.                 resolve(openid) 
  127.                 return 
  128.             } 
  129.             if(!params.appid) { 
  130.                 reject('缺少appid') 
  131.                 return; 
  132.             } 
  133.             if(!params.secret) { 
  134.                 reject('缺少密钥') 
  135.                 return; 
  136.             } 
  137.             uni.store.dispatch('initOpenid').then(openid => { 
  138.                 console.log('获取的本地openid', openid) 
  139.                 resolve(openid) 
  140.             }).catch(err => { 
  141.                 if(!params.code) { 
  142.                     reject('请先获取授权') 
  143.                     return; 
  144.                 } 
  145.                 //获取授权 
  146.                 GraceRequest.post( 
  147.                     '/api_WXGetOpenid', { 
  148.                         // post 数据 
  149.                         data: params 
  150.                     }, 
  151.                 ).then(res => { 
  152.                     // 返回,直接返回数据,忽略code等其他信息 
  153.                     const { 
  154.                         status, 
  155.                         data 
  156.                     } = res 
  157.                     console.log('通过code交换的值', data) 
  158.                     uni.store.commit('setOpenid', data) 
  159.                     resolve(data.openid) 
  160.                 }).catch(err => { 
  161.                     console.log('H5通过code交换openid接口有误', err); 
  162.                     reject(err) 
  163.                 }) 
  164.                  
  165.             }) 
  166.         }) 
  167.     }, 
  168.     /** 
  169.      * 通过config接口注入权限验证配置 
  170.      * @param {Object} cb 需要执行的函数 
  171.      */ 
  172.     initJssdk(cb) { 
  173.         //获取当前url然后传递给后台获取授权和签名信息   
  174.         var url = encodeURIComponent(window.location.href.split('#')[0]); //当前网页的URL,不包含#及其后面部分 
  175.         console.log('微信注入传递的URL是:', window.location.href.split('#')[0]); 
  176.         // return 
  177.         // 注入config权限配置 
  178.         GraceRequest.post( 
  179.             '/api_WXConfig', { 
  180.                 // post 数据 
  181.                 data: { 
  182.                     url: url 
  183.                 } 
  184.             }, 
  185.         ).then(res => { 
  186.             // 返回,直接返回数据,忽略code等其他信息 
  187.             const { 
  188.                 status, 
  189.                 data 
  190.             } = res 
  191.  
  192.             // https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#1 
  193.             jWeixin.config({ 
  194.               debug: true, // 是否开启调试模式 
  195.               appId: data.appId, // 必填,公众号的唯一标识 
  196.               timestamp: data.timestamp, // 必填,生成签名的时间戳 
  197.               nonceStr: data.nonceStr, // 必填,生成签名的随机串 
  198.               signature: data.signature, // 必填,签名,见附录1 
  199.               jsApiList: WXAPI 
  200.             }) 
  201.             // 本地环境测试使用,里面信息是测试号的appid和签名 
  202.             // jWeixin.config({ 
  203.             //  debug: true, 
  204.             //  appId: 'wx451eff21c6c0d938', 
  205.             //  timestamp: 1659065946, 
  206.             //  nonceStr: 'dzklsf', 
  207.             //  signature: 'd2ada1c92409e14c9e720ed58056dcd3800ab0a7', 
  208.             //  jsApiList: ['scanQRCode'] 
  209.             // }) 
  210.             // 本地环境测试结束 
  211.             if (cb) { 
  212.               cb() 
  213.             } 
  214.             jWeixin.error(function(res){ 
  215.               // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。 
  216.               console.log('注入权限有误', res) 
  217.             }); 
  218.         }).catch(err => { 
  219.             console.log('获取公众号Config接口注入权限有误', err); 
  220.         }) 
  221.  
  222.     }, 
  223.     //微信扫码 
  224.     scanQRCode: function(callback) { 
  225.         if (!this.isWechat()) { 
  226.             //console.log('不是微信客户端')   
  227.             return; 
  228.         } 
  229.         this.initJssdk(function(res) { 
  230.             jWeixin.ready(function() { 
  231.                 jWeixin.scanQRCode({ 
  232.                     needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果, 
  233.                     scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是一维码,默认二者都有 
  234.                     success: function(res) { 
  235.                         // console.log(res);   
  236.                         callback(res); 
  237.                     }, 
  238.                     fail: function(res) { 
  239.                         callback(res) 
  240.                     }, 
  241.                 }); 
  242.             }); 
  243.         }); 
  244.     }, 
  245.     //在需要定位页面调用 
  246.     getLocation: function(callback) { 
  247.         if (!this.isWechat()) { 
  248.             console.log('不是微信客户端')   
  249.             return; 
  250.         } 
  251.         this.initJssdk(function(res) { 
  252.             jWeixin.ready(function() { 
  253.                 jWeixin.getLocation({ 
  254.                     type: 'gcj02', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'   
  255.                     success: function(res) { 
  256.                         // console.log(res);   
  257.                         callback(res) 
  258.                     }, 
  259.                     fail: function(res) { 
  260.                         console.log(res) 
  261.                     }, 
  262.                 }); 
  263.             }); 
  264.         }); 
  265.     }, 
  266.     //打开位置   
  267.     openlocation: function(data, callback) { 
  268.         if (!this.isWechat()) { 
  269.             //console.log('不是微信客户端')   
  270.             return; 
  271.         } 
  272.         this.initJssdk(function(res) { 
  273.             jWeixin.ready(function() { 
  274.                 jWeixin.openLocation({ //根据传入的坐标打开地图   
  275.                     latitude: data.latitude, 
  276.                     longitude: data.longitude 
  277.                 }); 
  278.             }); 
  279.         }); 
  280.     }, 
  281.     //选择图片   
  282.     chooseImage: function(callback) { 
  283.         if (!this.isWechat()) { 
  284.             //console.log('不是微信客户端')   
  285.             return; 
  286.         } 
  287.         //console.log(data);   
  288.         this.initJssdk(function(res) { 
  289.             jWeixin.ready(function() { 
  290.                 jWeixin.chooseImage({ 
  291.                     count: 1, 
  292.                     sizeType: ['compressed'], 
  293.                     sourceType: ['album'], 
  294.                     success: function(rs) { 
  295.                         callback(rs) 
  296.                     } 
  297.                 }) 
  298.             }); 
  299.         }); 
  300.     }, 
  301.     //微信支付 
  302.     wxpay: function(data, callback) { 
  303.         if (!this.isWechat()) { 
  304.             //console.log('不是微信客户端') 
  305.             return; 
  306.         } 
  307.         // this.initJssdk(function(res) { 
  308.         //  jWeixin.ready(function() { 
  309.                 jWeixin.chooseWXPay({ 
  310.                     appId: data.appId, 
  311.                     timeStamp: data.timeStamp, // 支付签名时间戳 
  312.                     nonceStr: data.nonceStr, // 支付签名随机串,不长于 32 位   
  313.                     package: data.package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)   
  314.                     signType: data.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'   
  315.                     paySign: data.paySign, // 支付签名   
  316.                     success: function(res) { 
  317.                         // console.log(res);   
  318.                         callback(res) 
  319.                     }, 
  320.                     fail: function(res) { 
  321.                         callback(res) 
  322.                     }, 
  323.                 }); 
  324.         //  }); 
  325.         // }); 
  326.     }, 
  327.     //自定义分享  这里我统一调用了分享到朋友和朋友圈,可以自行定义 
  328.     share: function(callback) { 
  329.         if (!this.isWechat()) { 
  330.             //console.log('不是微信客户端')   
  331.             return; 
  332.         } 
  333.         this.initJssdk(function(res) { 
  334.             jWeixin.ready(function() { 
  335.   
  336.                 //我的分享配置由后台返回,可以自定义 
  337.                 http.get({ 
  338.                     url: 'getShareInfo'  
  339.                 }).then(res => {  
  340.                     const { shareInfo } = res.data;  
  341.                     jWeixin.updateAppMessageShareData({ //分享给朋友  
  342.                         title: shareInfo.title,  
  343.                         desc: shareInfo.description,  
  344.                         imgUrl: shareInfo.image,  
  345.                         link: shareInfo.link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致  
  346.                         success: function() {  
  347.                             // 用户确认分享后执行的回调函数  
  348.                             callback(res);  
  349.                         }  
  350.                     });  
  351.                     jWeixin.updateTimelineShareData({ //分享到朋友圈  
  352.                         title: shareInfo.title,  
  353.                         desc: shareInfo.description,  
  354.                         imgUrl: shareInfo.image,  
  355.                         link: shareInfo.link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致  
  356.                         success: function() {  
  357.                             // 用户确认分享后执行的回调函数  
  358.                             callback(res);  
  359.                         }  
  360.                     });  
  361.                 });  
  362.             });  
  363.         });  
  364.     },  
  365.       
  366. }  
  367.   
  368. // #endif  

 

 

在App.vue的onShow即使用:

JavaScript Code复制内容到剪贴板
  1. // 页面初始化获取openid  
  2. uni.store.dispatch('initOpenid')  

 

 

 


 

 

JavaScript Code复制内容到剪贴板
  1. npm i -S weixin-js-sdk  

 

引入:

JavaScript Code复制内容到剪贴板
  1. import wx from 'weixin-js-sdk'  

 

踩坑一:

微信分享:

QAQ1、router模式请改为hash:

JavaScript Code复制内容到剪贴板
  1. export default new Router({  
  2.     mode: 'hash',  
  3.     base:'/test/'// 根路径,可自定义  
  4.     routes: [  
  5.         // 用户部分  
  6.         {  
  7.             path: '/',  
  8.             name: 'userPetSelect',  
  9.             components: {  
  10.                 main: userPetSelect,  
  11.             }  
  12.         },  

 

QAQ2、关于网上资料说,IOS的请求页面权限需要使用入口记录第一次的url(在改为哈希模式后,这条不成立)

关于分享后的链接被微信添加了微信的自定义参数,如:

http://test.aaa.bbbb.com/?from=singlemessage&isappinstalled=0#/details?id=2
// 原本链接 http://test.aaa.bbbb.com/#/details?id=2

找了资料发现有小伙伴提供的一个方案很好用,在#前面加一个?号

JavaScript Code复制内容到剪贴板
  1. wxShare({state,commit},params) {  
  2.     let desc = params.desc, //分享的简介  
  3.     title = params.title,//params.title, //分享的标题  
  4.     shareUrl = params.link, //分享的链接  
  5.     imgUrl = params.imgUrl; //分享的缩略图  
  6.       
  7.     let link = window.location.href; // 请求JSSDK的页面路径  
  8.     link = link.split('#')[0]; //签名需要传当前页面的url  
  9.       
  10.     let linkEndString = link.charAt(link.length-1);  
  11.     if(linkEndString == '?'){  
  12.         link=link.substring(0,link.length-1)  
  13.     }  
  14.       
  15.     shareUrl = link + "?#"+ shareUrl; //重新拼接分享的链接  
  16.     alert(shareUrl);  
  17.     request.post(global.shareUrl,{url:link}).then(response => {  
  18.         if(!response) {  
  19.             return false;  
  20.         }  
  21.         // 请求成功后保存  
  22.         let appId = response.appId;  
  23.         let timeStamp = response.timeStamp;  
  24.         let nonceStr = response.nonceStr;  
  25.         let signature = response.signature;  
  26.           
  27.         wx.config({  
  28.             debug: false// 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。    
  29.             appId: appId,  
  30.             timestamp: timeStamp,  
  31.             nonceStr: nonceStr,  
  32.             signature: signature,  
  33.             jsApiList: [  
  34.                 'checkJsApi',  
  35.                 'onMenuShareTimeline'//分享到朋友圈  
  36.                 'onMenuShareAppMessage'//分享给朋友  
  37.                 'onMenuShareQQ'//分享到QQ  
  38.                 'onMenuShareWeibo'//分享到腾讯微博  
  39.                 'onMenuShareQZone'//分享到QQ空间  
  40.             ]// 必填,需要使用的JS接口列表,所有JS接口列表见附录2  
  41.         });  
  42.       
  43.         let share_config = {    
  44.                 "imgUrl": imgUrl,//分享图,默认当相对路径处理,所以使用绝对路径的的话,“http://”协议前缀必须在。  
  45.                 "desc" : desc,//摘要,如果分享到朋友圈的话,不显示摘要。  
  46.                 "title" : title,//分享卡片标题  
  47.                 "link": shareUrl,//分享出去后的链接,这里可以将链接设置为另一个页面。  
  48.                 "success":function(){  
  49.                         //分享成功后的回调函数  
  50.                         commit("changeIfShare",true);  
  51.                           
  52.                         let instance = Toast('分享成功');    
  53.                     setTimeout(() => {  
  54.                         instance.close();    
  55.                     }, 1000);  
  56.                 },  
  57.                 'cancel'function () {    
  58.                     // 用户取消分享后执行的回调函数  
  59.                     let instance = Toast('您已取消分享');    
  60.                     setTimeout(() => {    
  61.                         instance.close();    
  62.                     }, 1000);  
  63.                 }  
  64.         };  
  65.         wx.ready(function() {  
  66.             //分享给朋友  
  67.             wx.onMenuShareAppMessage(share_config);  
  68.             wx.onMenuShareAppMessage(share_config);    
  69.             wx.onMenuShareTimeline(share_config);  
  70.             wx.onMenuShareQQ(share_config);  
  71.             wx.onMenuShareWeibo(share_config);  
  72.             wx.onMenuShareQZone(share_config);  
  73.         })  
  74.         wx.error(function(res){  
  75.             // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。  
  76.             alert.log(res);  
  77.         });  
  78.     });  
  79. },  

 

 

上面的放在action方法中,回调以后 可以通过变量值currentIfShare来控制

JavaScript Code复制内容到剪贴板
  1. const state = {  
  2.     currentIfShare:false//当前页面是否已分享  
  3. }  
  4. const mutations = {  
  5.     changeIfShare(state,value){  
  6.         state.currentIfShare = value;  
  7.     },  
  8. }  

 

 

 

方法使用:

JavaScript Code复制内容到剪贴板
  1. data() {  
  2.   return {  
  3. },  
  4. mounted() {  
  5.   this.wxShare(); //执行微信分享  
  6. },  
  7. computed:{  
  8.     ifShare(){  
  9.     return this.$store.state.common.currentIfShare;  
  10.     },  
  11. },  
  12. watch:{  
  13.   ifShare(){  
  14.     if(this.ifShare){  
  15.       this.closePopup(); //如果ifShare参数为true,关闭遮罩层  
  16.     }  
  17.     },  
  18. },  
  19. methods: {  
  20.   openPopup(val) {  
  21.     this.popupVisible = true;//打开遮罩  
  22.   },  
  23.   closePopup(val) {  
  24.     //关闭遮罩层的同时,将当前分享状态设为false,分享成功后回调为true  
  25.     this.popupVisible = val;  
  26.     this.$store.commit('common/changeIfShare'false);   
  27.   },  
  28.   wxShare() {  
  29.     let defaultImg = this.$store.state.common.LOGOImg;console.log(defaultImg);  
  30.     var shareUrl = "/yoyo/user-homepage/"+sessionStorage.getItem("userId"); //分享链接  
  31.     let params = {  
  32.       title: 'yoyo个人博客'//分享的标题  
  33.       desc:'想要站在巨人的肩膀上,就从关注他开始!'// 分享的简介  
  34.       link: shareUrl, //分享链接  
  35.       imgUrl: defaultImg //分享默认图片  
  36.     };  
  37.     this.$store.dispatch("common/wxShare",params); // 进入方法,调取分享SDK接口  
  38.   
  39.   }  
  40. },  

 

PS:改为哈希模式后,发现不需要判断设备了,该方法通用

 


 

QAQ3:路由中包含code参数? 

在微信浏览器中,如果要获取用户授权,会自带一个code参数,这种情况,vue的分享路由就会出现问题,针对code 改一下截取:

JavaScript Code复制内容到剪贴板
  1.     wxShare({state,commit},params) {  
  2.         let desc = params.desc, //分享的简介  
  3.         title = params.title,//params.title, //分享的标题  
  4.         shareUrl = params.link, //分享的链接  
  5.         imgUrl = params.imgUrl; //分享的缩略图  
  6.           
  7.         let link = window.location.href; // 请求JSSDK的页面路径  
  8.         link = link.split('#')[0]; //签名需要传当前页面的url  
  9.           
  10.         request.post(global.shareUrl,{url:link}).then(response => {  
  11.             if(!response) {  
  12.                 return false;  
  13.             }  
  14.             // 请求成功后保存  
  15.             let appId = response.appId;  
  16.             let timeStamp = response.timeStamp;  
  17.             let nonceStr = response.nonceStr;  
  18.             let signature = response.signature;  
  19.               
  20.             wx.config({  
  21.                 debug: false// 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。    
  22.                 appId: appId,  
  23.                 timestamp: timeStamp,  
  24.                 nonceStr: nonceStr,  
  25.                 signature: signature,  
  26.                 jsApiList: [  
  27.                     'checkJsApi',  
  28.                     'onMenuShareTimeline'//分享到朋友圈  
  29.                     'onMenuShareAppMessage'//分享给朋友  
  30.                     'onMenuShareQQ'//分享到QQ  
  31.                     'onMenuShareWeibo'//分享到腾讯微博  
  32.                     'onMenuShareQZone'//分享到QQ空间  
  33.                 ]// 必填,需要使用的JS接口列表,所有JS接口列表见附录2  
  34.             });  
  35.   
  36.   
  37.             let code = global.GetQueryString('code'); // 定义GET参数  
  38.             if(code !=null && code.toString().length>1)    
  39.             {  
  40.                 link = link.split('?')[0];//如果有code值要截取?之前  
  41.             }else{  
  42.                 link = link.split('#')[0]; //签名需要传当前页面的url  
  43.             }  
  44.             let linkEndString = link.charAt(link.length-1);  
  45.             if(linkEndString == '?'){  
  46.                 link=link.substring(0,link.length-1)  
  47.             }  
  48.             shareUrl = link + "?#"+ shareUrl; //重新拼接分享的链接  
  49.           
  50.             let share_config = {    
  51.                     "imgUrl": imgUrl,//分享图,默认当相对路径处理,所以使用绝对路径的的话,“http://”协议前缀必须在。  
  52.                     "desc" : desc,//摘要,如果分享到朋友圈的话,不显示摘要。  
  53.                     "title" : title,//分享卡片标题  
  54.                     "link": shareUrl,//分享出去后的链接,这里可以将链接设置为另一个页面。  
  55.                     "success":function(){  
  56.                             //分享成功后的回调函数,改变当前分享状态为true,默认为false  
  57.                             commit("changeIfShare",true);  
  58.                             let instance = Toast('分享成功');  
  59.                         setTimeout(() => {  
  60.                             instance.close();  
  61.                         }, 1000);  
  62.                         return true;  
  63.   
  64.                     },  
  65.                     'cancel'function () {    
  66.                         // 用户取消分享后执行的回调函数  
  67.                         let instance = Toast('您已取消分享');    
  68.                         setTimeout(() => {    
  69.                             instance.close();    
  70.                         }, 1000);  
  71.                         return false;  
  72.                     }  
  73.             };  
  74.             wx.ready(function() {  
  75.                 //分享给朋友  
  76.                 wx.onMenuShareAppMessage(share_config);  
  77.                 wx.onMenuShareAppMessage(share_config);    
  78.                 wx.onMenuShareTimeline(share_config);  
  79.                 wx.onMenuShareQQ(share_config);  
  80.                 wx.onMenuShareWeibo(share_config);  
  81.                 wx.onMenuShareQZone(share_config);  
  82.             })  
  83. //          wx.error(function(res){  
  84. //              // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。  
  85. //              alert.log(res.errMsg);  
  86. //          });  
  87.         });  
  88.     },  

 

获取地址栏的GET参数方法:

JavaScript Code复制内容到剪贴板
  1. GetQueryString(name){  
  2.     //js获取地址栏的GET参数  
  3.     var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");    
  4.     var r = window.location.search.substr(1).match(reg);    
  5.     if(r!=null)return  unescape(r[2]); return null;    
  6. },  

 

 

在安卓的分享成功后的回调中,不仅有自己配置的分享成功,还会出现安卓本身的,已分享字样,故,增加判断设备 :

 

 


 

踩坑二:微信支付

不需要使用预先SDK的接口支持,直接引入SDK后,加点击事件:

JavaScript Code复制内容到剪贴板
  1. wx.chooseWXPay({  
  2.     appId: data.appId,  
  3.     timestamp: data.timeStamp, // 支付签名时间戳,最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符  
  4.     nonceStr: data.nonceStr, // 支付签名随机串,不长于 32 位  
  5.     package: data.package// 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)  
  6.     signType: data.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'  
  7.     paySign: data.paySign, // 支付签名  
  8.     success: function(res) {  
  9.         // 支付成功后的回调函数  
  10.         alert("支付成功");  
  11.         this.intoByType();  
  12.     }  
  13. });  

这里对这个timestamp字段,有一个争议,看到有的文档中是S大写,有的是小写,在vue的脚手架上项目开启了debug后,发现该字段赋值为underfined,在微信的debug中,也是timeStamp,在JS中却要使用小写的,具体看使用情况吧!

 

 

 

 

本文来自于:http://www.yoyo88.cn/study/vue/260.html

Powered by yoyo苏ICP备15045725号