121 lines
4.2 KiB
JavaScript
121 lines
4.2 KiB
JavaScript
"use strict";
|
||
Object.defineProperty(exports, "__esModule", { value: true });
|
||
exports.WechatSdk = void 0;
|
||
const tslib_1 = require("tslib");
|
||
const Feature_1 = require("oak-frontend-base/es/types/Feature");
|
||
const utils_1 = require("oak-frontend-base/es/utils/utils");
|
||
const promisify_1 = require("oak-frontend-base/es/utils/promisify");
|
||
const lodash_1 = require("oak-domain/lib/utils/lodash");
|
||
const weixin_js_sdk_1 = tslib_1.__importDefault(require("weixin-js-sdk"));
|
||
class WechatSdk extends Feature_1.Feature {
|
||
cache;
|
||
storage;
|
||
environment;
|
||
landingUrl; //解决在IOS上,无论路由切换到哪个页面,实际真正有效的的签名URL是【第一次进入应用时的URL】;
|
||
lastConfigUrl;
|
||
constructor(cache, storage, environment) {
|
||
super();
|
||
this.cache = cache;
|
||
this.storage = storage;
|
||
this.landingUrl = undefined;
|
||
this.environment = environment;
|
||
}
|
||
async signatureJsSDK(url) {
|
||
const env = await this.environment.getEnv();
|
||
const { result } = await this.cache.exec('signatureJsSDK', {
|
||
url,
|
||
env: env,
|
||
});
|
||
return result;
|
||
}
|
||
async getConfig(config) {
|
||
return new Promise((resolve, reject) => {
|
||
weixin_js_sdk_1.default.config(config);
|
||
weixin_js_sdk_1.default.ready(() => {
|
||
console.log('调用wx.config通过');
|
||
resolve('');
|
||
});
|
||
weixin_js_sdk_1.default.error((err) => {
|
||
const error = `调用wx.config出错: ${JSON.stringify(err)},请重新尝试`;
|
||
reject(error);
|
||
});
|
||
});
|
||
}
|
||
setLandingUrl(url) {
|
||
if (utils_1.isIos && utils_1.isWeiXin) {
|
||
this.landingUrl = url;
|
||
}
|
||
}
|
||
initedApiList = [];
|
||
async init(options) {
|
||
if (!utils_1.isWeiXin) {
|
||
console.warn('只能在微信客户端初始化JSSDK');
|
||
return;
|
||
}
|
||
const { name } = options || {};
|
||
let url = window.location.href;
|
||
//在ios上 实际真正有效的的签名URL是【第一次进入应用时的URL】
|
||
if (utils_1.isIos && !utils_1.isWeiXinDevTools && this.landingUrl) {
|
||
url = this.landingUrl;
|
||
}
|
||
if (this.initedApiList.includes(name) && this.lastConfigUrl === url) {
|
||
return;
|
||
}
|
||
const splitUrl = url.split('#')[0];
|
||
const result = await this.signatureJsSDK(splitUrl); // 接口回来的是noncestr 不是nonceStr
|
||
const dftApiList = [
|
||
'updateAppMessageShareData',
|
||
'updateTimelineShareData',
|
||
'onMenuShareTimeline',
|
||
'onMenuShareAppMessage',
|
||
'onMenuShareQQ',
|
||
'onMenuShareWeibo',
|
||
'getLocation',
|
||
'chooseWXPay',
|
||
'scanQRCode',
|
||
'openLocation',
|
||
'chooseImage',
|
||
'previewImage',
|
||
'uploadImage',
|
||
'downloadImage',
|
||
];
|
||
const jsApiList = (0, lodash_1.uniq)(this.initedApiList.length > 0 ? this.initedApiList.concat([name]) : dftApiList.concat([name]));
|
||
/**
|
||
* https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_Open_Tag.html
|
||
* 文档中有四个,ts声明可能不及时
|
||
* by Xc 20240321
|
||
*/
|
||
const openTagList = [
|
||
'wx-open-launch-weapp',
|
||
'wx-open-launch-app',
|
||
'wx-open-subscribe',
|
||
'wx-open-audio'
|
||
];
|
||
await this.getConfig({
|
||
debug: process.env.NODE_ENV === 'development',
|
||
appId: result.appId,
|
||
timestamp: result.timestamp,
|
||
nonceStr: result.noncestr,
|
||
signature: result.signature,
|
||
jsApiList,
|
||
openTagList,
|
||
});
|
||
this.initedApiList = jsApiList;
|
||
this.lastConfigUrl = url;
|
||
}
|
||
/**
|
||
* 微信jssdk 传入方法名
|
||
*/
|
||
async loadWxAPi(name, options) {
|
||
await this.init({ name });
|
||
const wxFn = (0, promisify_1.promisify)(weixin_js_sdk_1.default[name]);
|
||
const result = await wxFn(options);
|
||
return result;
|
||
}
|
||
async subscribeMpMessage(messageTypes, haveToAccept, tip) {
|
||
console.error('native无需该操作');
|
||
return true;
|
||
}
|
||
}
|
||
exports.WechatSdk = WechatSdk;
|