import {getBaseUrl} from './api'
const wxApi = {
/**
* [wxRegister 微信Api初始化]
* @param {Function} callback [ready回调函数]
*/
wxRegister (url,sys) {
if(sys == "ios"){
url = window.entryUrl;
}
getBaseUrl('/wechatshare?url='+url).then(res=>{
wx.config({
//在测试的时候必定要开启这个 debug: true 只要有报错就必定会弹出来,
debug: false, // 开启调试模式
appId: res.appId, // 必填,公众号的惟一标识
timestamp: res.timestamp, // 必填,生成签名的时间戳
nonceStr: res.nonceStr, // 必填,生成签名的随机串
signature: res.signature, // 必填,签名,见附录1
jsApiList: [
'checkJsApi',//必填,检测api是否有权限
//自定义“分享给朋友”及“分享到QQ”按钮的分享内容
'updateAppMessageShareData',
//自定义“分享到朋友圈”及“分享到QQ空间”按钮的分享内容
'updateTimelineShareData'
] // 必填,须要使用的JS接口列表,全部JS接口列表见附录2
})
}),
wx.ready(() => {
//必定要保证分享的url和传递给后端url是一致的,若是路由发生了变化必定要获取当前的路由
let links = location.href.split('#')[0];
let optionApp = {
title: '***', // 分享标题, 请自行替换
desc:'***',
link: links,
imgUrl: 'logo.png', // 分享图标, 请自行替换,须要绝对路径
}
let optionTimeline = {
title: '***', // 分享标题, 请自行替换
link: links, // 分享连接,根据自身项目决定是否须要split
imgUrl: 'logo.png', // 分享图标, 请自行替换,须要绝对路径
desc:'***'
}
// 微信分享给朋友
wx.updateAppMessageShareData({
title: optionApp.title, // 分享标题
link: optionApp.link, // 分享连接
imgUrl: optionApp.imgUrl, // 分享图标
desc: optionApp.desc, // 分享图标
success () {
},
cancel () {
// 用户取消分享后执行的回调函数
},fail(){
// alert("分享失败!"+JSON.stringify(s));
}
}),
// 微信分享到朋友圈
wx.updateTimelineShareData({
title: optionTimeline.title, // 分享标题
link: optionTimeline.link, // 分享连接
imgUrl: optionTimeline.imgUrl, // 分享图标
desc:optionTimeline.desc,
success () {
// 用户成功分享后执行的回调函数
},
cancel () {
// 用户取消分享后执行的回调函数
},fail(){
// alert(JSON.stringify(msg));
}
})
})
wx.error(function(){
// alert(JSON.stringify(e)+'--------error')
// config信息验证失败会执行error函数,如签名过时致使验证失败,具体错误信息能够打开config的debug模式查看,也能够在返回的res参数中查看,对于SPA能够在这里更新签名。
});
},
}
export default wxApi
复制代码
import wxapi from '../request/wxapi'
//在method定义一个方法里进行验证,在mounted里面调用
methods: {
//分享前的验证签名,由于Android和IOS在进入微信后路由变化的逻辑是不一样的,因此要判断一下,IOS只能分享第一次进来时候的路由地址(IOS待验证,后面来填坑)
checkSign(){
// window.__wxjs_is_wkwebview为true 时 为 IOS 设备 false时 为 安卓 设备
if (window.__wxjs_is_wkwebview) { // IOS
if (window.entryUrl == '' || window.entryUrl == undefined) {
var url = location.href.split('#')[0]
window.entryUrl = url // 将后面的参数去除
}
wxapi.wxRegister(location.href.split('#')[0],'ios');
}else { // 安卓
setTimeout(function () {
wxapi.wxRegister(location.href.split('#')[0],'android');
}, 500);
}
},
},
mounted() {
//听说Android手机端会有延时,就加了500的延时,看状况大家加不加均可以
setTimeout(()=>{
this.checkSign();
},500)
}
复制代码
其实到这里基本就完事儿了,能够根据微信提供的debug来进行跟踪 我出现过两种错误
(1) invaild singatrue,这个错误是因为后端签名的时候把noncestr 里面的S写成大写了,通常invaild singatrue错误要不就是后端签名错误,要不就是你给后端的url与你当前的路由不匹配
使用微信自带的调试工具能够很好的解决url与你当前的路由不匹配的问题
签名错误可使用微信提供的在线签名工具生成看跟后端返回的是否匹配
(2) config:ok 可是没法调起微信的分享界面,其实最终提示config:ok的时候就说明你已经分享成功了,若是提示config:ok的话,你认为还没调起微信的分享界面的时候看下下面的话,但愿对你有所帮助!php