2022-11-22 07:45:36 +00:00
|
|
|
|
/**
|
|
|
|
|
* 本模块封装微信浏览器下的一些方法。
|
|
|
|
|
* 更多微信网页开发sdk方法,详见:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html
|
2024-08-08 04:26:09 +00:00
|
|
|
|
* 有 the permission value is offline verifying 报错请参考 @see https://segmentfault.com/a/1190000042289419 解决
|
2022-11-22 07:45:36 +00:00
|
|
|
|
*/
|
|
|
|
|
|
2024-08-08 04:26:09 +00:00
|
|
|
|
import jweixin from 'weixin-js-sdk';
|
2022-11-22 07:45:36 +00:00
|
|
|
|
import $helper from '@/sheep/helper';
|
2023-12-21 13:04:19 +00:00
|
|
|
|
import AuthUtil from '@/sheep/api/member/auth';
|
2022-11-22 07:45:36 +00:00
|
|
|
|
|
|
|
|
|
let configSuccess = false;
|
|
|
|
|
|
|
|
|
|
export default {
|
2023-12-21 13:04:19 +00:00
|
|
|
|
// 判断是否在微信中
|
2022-11-22 07:45:36 +00:00
|
|
|
|
isWechat() {
|
|
|
|
|
const ua = window.navigator.userAgent.toLowerCase();
|
2023-12-21 13:04:19 +00:00
|
|
|
|
// noinspection EqualityComparisonWithCoercionJS
|
|
|
|
|
return ua.match(/micromessenger/i) == 'micromessenger';
|
2022-11-22 07:45:36 +00:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
isReady(api) {
|
|
|
|
|
jweixin.ready(api);
|
|
|
|
|
},
|
|
|
|
|
|
2023-12-21 13:04:19 +00:00
|
|
|
|
// 初始化 JSSDK
|
2022-11-22 07:45:36 +00:00
|
|
|
|
async init(callback) {
|
|
|
|
|
if (!this.isWechat()) {
|
|
|
|
|
$helper.toast('请使用微信网页浏览器打开');
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2023-12-21 13:04:19 +00:00
|
|
|
|
// 调用后端接口,获得 JSSDK 初始化所需的签名
|
2022-11-22 07:45:36 +00:00
|
|
|
|
const url = location.href.split('#')[0];
|
2023-12-21 13:04:19 +00:00
|
|
|
|
const { code, data } = await AuthUtil.createWeixinMpJsapiSignature(url);
|
|
|
|
|
if (code === 0) {
|
2022-11-22 07:45:36 +00:00
|
|
|
|
jweixin.config({
|
|
|
|
|
debug: false,
|
|
|
|
|
appId: data.appId,
|
|
|
|
|
timestamp: data.timestamp,
|
|
|
|
|
nonceStr: data.nonceStr,
|
|
|
|
|
signature: data.signature,
|
2024-08-08 04:26:09 +00:00
|
|
|
|
jsApiList: ['chooseWXPay', 'openLocation', 'getLocation','updateTimelineShareData','scanQRCode'], // TODO 芋艿:后续可以设置更多权限;
|
2023-12-21 13:04:19 +00:00
|
|
|
|
openTagList: data.openTagList
|
2022-11-22 07:45:36 +00:00
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2023-12-21 13:04:19 +00:00
|
|
|
|
// 监听结果
|
2022-11-22 07:45:36 +00:00
|
|
|
|
configSuccess = true;
|
|
|
|
|
jweixin.error((err) => {
|
|
|
|
|
configSuccess = false;
|
2023-12-21 13:04:19 +00:00
|
|
|
|
console.error('微信 JSSDK 初始化失败', err);
|
2022-11-22 07:45:36 +00:00
|
|
|
|
// $helper.toast('微信JSSDK:' + err.errMsg);
|
|
|
|
|
});
|
2023-12-21 13:04:19 +00:00
|
|
|
|
jweixin.ready(() => {
|
|
|
|
|
if (configSuccess) {
|
|
|
|
|
console.log('微信 JSSDK 初始化成功');
|
|
|
|
|
}
|
|
|
|
|
})
|
2022-11-22 07:45:36 +00:00
|
|
|
|
|
2023-12-21 13:04:19 +00:00
|
|
|
|
// 回调
|
2022-11-22 07:45:36 +00:00
|
|
|
|
if (callback) {
|
|
|
|
|
callback(data);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
2023-12-21 13:04:19 +00:00
|
|
|
|
//在需要定位页面调用 TODO 芋艿:未测试
|
2022-11-22 07:45:36 +00:00
|
|
|
|
getLocation(callback) {
|
|
|
|
|
this.isReady(() => {
|
|
|
|
|
jweixin.getLocation({
|
|
|
|
|
type: 'gcj02', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
|
|
|
|
|
success: function (res) {
|
|
|
|
|
callback(res);
|
|
|
|
|
},
|
|
|
|
|
fail: function (res) {
|
|
|
|
|
console.log('%c微信H5sdk,getLocation失败:', 'color:green;background:yellow');
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
|
2024-08-15 01:24:39 +00:00
|
|
|
|
// 获取微信收货地址
|
2022-11-22 07:45:36 +00:00
|
|
|
|
openAddress(callback) {
|
|
|
|
|
this.isReady(() => {
|
|
|
|
|
jweixin.openAddress({
|
|
|
|
|
success: function (res) {
|
|
|
|
|
callback.success && callback.success(res);
|
|
|
|
|
},
|
|
|
|
|
fail: function (err) {
|
|
|
|
|
callback.error && callback.error(err);
|
|
|
|
|
console.log('%c微信H5sdk,openAddress失败:', 'color:green;background:yellow');
|
|
|
|
|
},
|
|
|
|
|
complete: function (res) {},
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
|
2023-12-21 13:04:19 +00:00
|
|
|
|
// 微信扫码 TODO 芋艿:未测试
|
2022-11-22 07:45:36 +00:00
|
|
|
|
scanQRCode(callback) {
|
|
|
|
|
this.isReady(() => {
|
|
|
|
|
jweixin.scanQRCode({
|
|
|
|
|
needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
|
|
|
|
|
scanType: ['qrCode', 'barCode'], // 可以指定扫二维码还是一维码,默认二者都有
|
|
|
|
|
success: function (res) {
|
|
|
|
|
callback(res);
|
|
|
|
|
},
|
|
|
|
|
fail: function (res) {
|
|
|
|
|
console.log('%c微信H5sdk,scanQRCode失败:', 'color:green;background:yellow');
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
|
2023-12-21 13:04:19 +00:00
|
|
|
|
// 更新微信分享信息 TODO 芋艿:未测试
|
2022-11-22 07:45:36 +00:00
|
|
|
|
updateShareInfo(data, callback = null) {
|
|
|
|
|
this.isReady(() => {
|
|
|
|
|
const shareData = {
|
|
|
|
|
title: data.title,
|
|
|
|
|
desc: data.desc,
|
|
|
|
|
link: data.link,
|
|
|
|
|
imgUrl: data.image,
|
|
|
|
|
success: function (res) {
|
|
|
|
|
if (callback) {
|
|
|
|
|
callback(res);
|
|
|
|
|
}
|
|
|
|
|
// 分享后的一些操作,比如分享统计等等
|
|
|
|
|
},
|
|
|
|
|
cancel: function (res) {},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// 新版 分享聊天api
|
|
|
|
|
jweixin.updateAppMessageShareData(shareData);
|
|
|
|
|
// 新版 分享到朋友圈api
|
|
|
|
|
jweixin.updateTimelineShareData(shareData);
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
|
2023-12-21 13:04:19 +00:00
|
|
|
|
// 打开坐标位置 TODO 芋艿:未测试
|
2022-11-22 07:45:36 +00:00
|
|
|
|
openLocation(data, callback) {
|
|
|
|
|
this.isReady(() => {
|
|
|
|
|
jweixin.openLocation({
|
2024-08-08 04:26:09 +00:00
|
|
|
|
...data,
|
|
|
|
|
success: function (res) {
|
|
|
|
|
console.log(res);
|
|
|
|
|
}
|
2022-11-22 07:45:36 +00:00
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
|
2023-12-21 13:04:19 +00:00
|
|
|
|
// 选择图片 TODO 芋艿:未测试
|
2022-11-22 07:45:36 +00:00
|
|
|
|
chooseImage(callback) {
|
|
|
|
|
this.isReady(() => {
|
|
|
|
|
jweixin.chooseImage({
|
|
|
|
|
count: 1,
|
|
|
|
|
sizeType: ['compressed'],
|
|
|
|
|
sourceType: ['album'],
|
|
|
|
|
success: function (rs) {
|
|
|
|
|
callback(rs);
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
|
2023-12-24 03:41:17 +00:00
|
|
|
|
// 微信支付
|
2022-11-22 07:45:36 +00:00
|
|
|
|
wxpay(data, callback) {
|
|
|
|
|
this.isReady(() => {
|
|
|
|
|
jweixin.chooseWXPay({
|
|
|
|
|
timestamp: data.timeStamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
|
|
|
|
|
nonceStr: data.nonceStr, // 支付签名随机串,不长于 32 位
|
2023-12-24 03:41:17 +00:00
|
|
|
|
package: data.packageValue, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)
|
2022-11-22 07:45:36 +00:00
|
|
|
|
signType: data.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
|
|
|
|
|
paySign: data.paySign, // 支付签名
|
|
|
|
|
success: function (res) {
|
|
|
|
|
callback.success && callback.success(res);
|
|
|
|
|
},
|
|
|
|
|
fail: function (err) {
|
|
|
|
|
callback.fail && callback.fail(err);
|
|
|
|
|
},
|
|
|
|
|
cancel: function (err) {
|
|
|
|
|
callback.cancel && callback.cancel(err);
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
};
|