diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index c19840b28f771db778bb5abf497f226e930b7e1d..ef567d0bd8b415a4ddc6791bba0434d7c573e702 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -7,6 +7,10 @@ ## [Unreleased] +### Added + +- 新增移动端微信mobWeChatAppId环境参数,值为微信公众号appId或微信小程序appid + ## [0.7.41-alpha.18] - 2025-08-14 ### Fixed diff --git a/packages/core/src/environment/environment.ts b/packages/core/src/environment/environment.ts index 2bd0815f2f468b310d84dfb1d299f03aa5d38279..d1d8ccb239175294153ec18f3900ea7740dca72f 100644 --- a/packages/core/src/environment/environment.ts +++ b/packages/core/src/environment/environment.ts @@ -54,4 +54,5 @@ export const Environment: IEnvironment = { aMapSecurityJsCode: '', aMapKey: '', runContainer: 'DYNAENGINE', + mobWeChatAppId: '', }; diff --git a/packages/core/src/interface/api/environment/i-environment.ts b/packages/core/src/interface/api/environment/i-environment.ts index a1237862fe19c712ad6ed9a72ad2a313c7256dec..644ae6cf3579e411e740d55df4123d588a108627 100644 --- a/packages/core/src/interface/api/environment/i-environment.ts +++ b/packages/core/src/interface/api/environment/i-environment.ts @@ -376,4 +376,11 @@ export interface IEnvironment { * @memberof IEnvironment */ runContainer?: 'DYNAENGINE' | 'FULLCODE'; + + /** + * @description 移动端微信appid + * @type {string} + * @memberof IEnvironment + */ + mobWeChatAppId?: string; } diff --git a/packages/runtime/CHANGELOG.md b/packages/runtime/CHANGELOG.md index f1eddfe33439a4899b09c1af0f67c459cf5d4b51..41daf998bb089989a026745a2d1470e6badca4fb 100644 --- a/packages/runtime/CHANGELOG.md +++ b/packages/runtime/CHANGELOG.md @@ -7,6 +7,13 @@ ## [Unreleased] +### Added + +- 新增移动端mobGetSignUrl全局参数,根据该值获取微信授权签名数据 +- 新增移动端mobGetSignMethod全局参数,控制移动端授权签名数据获取方式 +- 新增移动端mobWeChatDebug全局参数,控制是否开启微信js-sdk的debug模式 +- 新增微信工具类,包含获取签名getSign、配置微信授权config方法 + ## [0.7.41-alpha.22] - 2025-08-29 ### Added diff --git a/packages/runtime/src/config/global-config.ts b/packages/runtime/src/config/global-config.ts index 65a4d342e3e548ac09cad99d21587880e1d1a928..fa1a56102ef7a97fd65f3576587217ce6a1d6522 100644 --- a/packages/runtime/src/config/global-config.ts +++ b/packages/runtime/src/config/global-config.ts @@ -151,5 +151,8 @@ export class GlobalConfig implements IGlobalConfig { mob: IGlobalMobConfig = { mobShowAppTitle: true, mobHomeRouteMode: 'default', + mobGetSignUrl: '', + mobGetSignMethod: 'post', + mobWeChatDebug: false, }; } diff --git a/packages/runtime/src/global/global-util/global-util.ts b/packages/runtime/src/global/global-util/global-util.ts index 3954915def06afa69263f5098059ab9ad70d0e77..e8ddde886eecea17b4531f67464888d1ae388fad 100644 --- a/packages/runtime/src/global/global-util/global-util.ts +++ b/packages/runtime/src/global/global-util/global-util.ts @@ -24,6 +24,7 @@ import { VoiceUtil, EncyptionUtil, WaterMarkUtil, + WeChatUtil, } from '../../utils'; /** @@ -147,6 +148,12 @@ export class GlobalUtil implements IApiGlobalUtil { */ readonly watermark = new WaterMarkUtil(); + /** + * @description 微信工具类 + * @memberof GlobalUtil + */ + readonly weChat = new WeChatUtil(); + constructor() { this.error.register(new DefaultErrorHandler()); } diff --git a/packages/runtime/src/interface/api/common/global-config/i-api-global-mob-config.ts b/packages/runtime/src/interface/api/common/global-config/i-api-global-mob-config.ts index 6fbeb8ac0b993355b7bf971bef4abf0b49fd3b26..8cebb2af0ec363503d8cc811d80d1021bdac81d4 100644 --- a/packages/runtime/src/interface/api/common/global-config/i-api-global-mob-config.ts +++ b/packages/runtime/src/interface/api/common/global-config/i-api-global-mob-config.ts @@ -19,4 +19,28 @@ export interface IApiGlobalMobConfig { * @memberof IApiGlobalMobConfig */ mobHomeRouteMode: 'default' | 'replace'; + + /** + * @description 获取微信授权签名请求路径 + * @type {string} + * @default '' + * @memberof IApiGlobalMobConfig + */ + mobGetSignUrl: string; + + /** + * @description 获取微信授权签名请求方式 + * @type {string} + * @default post + * @memberof IApiGlobalMobConfig + */ + mobGetSignMethod: string; + + /** + * @description 是否开启微信调试模式 + * @type {boolean} + * @default false + * @memberof IApiGlobalMobConfig + */ + mobWeChatDebug: boolean; } diff --git a/packages/runtime/src/interface/api/util/i-api-global-util.ts b/packages/runtime/src/interface/api/util/i-api-global-util.ts index df286a8aa7d2182362a8fc60720a542420612d77..061bb0a259366c597a75a03e35acd9ce10defa03 100644 --- a/packages/runtime/src/interface/api/util/i-api-global-util.ts +++ b/packages/runtime/src/interface/api/util/i-api-global-util.ts @@ -8,6 +8,7 @@ import { IApiFileUtil } from './i-api-file-util'; import { IApiHtml2canvasUtil } from './i-api-html2canvas-util'; import { IApiVoiceUtil } from './i-api-voice-util'; import { IApiWaterMarkUtil } from './i-api-water-mark-util'; +import { IApiWeChatUtil } from './i-api-wechat-util'; /** * @description 全局工具接口 @@ -85,6 +86,13 @@ export interface IApiGlobalUtil { */ readonly watermark: IApiWaterMarkUtil; + /** + * @description 微信工具类 + * @type {IApiWeChatUtil} + * @memberof IApiGlobalUtil + */ + readonly weChat: IApiWeChatUtil; + /** * @description 设置浏览器标题 * @param {string} title diff --git a/packages/runtime/src/interface/api/util/i-api-wechat-util.ts b/packages/runtime/src/interface/api/util/i-api-wechat-util.ts new file mode 100644 index 0000000000000000000000000000000000000000..28d8458828cf7c37e5712b513f73edf6f573bc40 --- /dev/null +++ b/packages/runtime/src/interface/api/util/i-api-wechat-util.ts @@ -0,0 +1,28 @@ +/** + * @description 微信工具类 + * @export + * @interface IApiWeChatUtil + */ +export interface IApiWeChatUtil { + /** + * @description 获取微信授权签名 + * @param {IData} data + * @returns {*} {(Promise)} + * @memberof IApiWeChatUtil + */ + getSign(data: IData): Promise; + + /** + * @description 配置微信授权 + * @param {string[]} [jsApiList=[]] 使用js-sdk的api列表 + * @param {IData} signData 获取授权签名请求数据 + * @param {IData} [fieldMap={}] 授权签名数据与ws.config的属性映射表,分别为timestamp(时间戳属性)、nonceStr(随机字符串属性)、signature(签名属性) + * @returns {*} {Promise} + * @memberof IApiWeChatUtil + */ + config( + jsApiList?: string[], + signData?: IData, + fieldMap?: IData, + ): Promise; +} diff --git a/packages/runtime/src/interface/api/util/index.ts b/packages/runtime/src/interface/api/util/index.ts index 717692f441ae0029253147a2dfabed91300f51b0..0c9f454e1577fdd17e8a4e8a1a4393df530c842d 100644 --- a/packages/runtime/src/interface/api/util/index.ts +++ b/packages/runtime/src/interface/api/util/index.ts @@ -29,3 +29,4 @@ export type { IApiChangeTracker, } from './i-api-change-tracker'; export type { IApiWaterMarkUtil } from './i-api-water-mark-util'; +export type { IApiWeChatUtil } from './i-api-wechat-util'; diff --git a/packages/runtime/src/utils/index.ts b/packages/runtime/src/utils/index.ts index aeb7ebf537c9e2197e2e451049d4f6b8613e3f1e..254e8a6142ec0d0d6c9ec0059787eadf18ea4da7 100644 --- a/packages/runtime/src/utils/index.ts +++ b/packages/runtime/src/utils/index.ts @@ -38,3 +38,4 @@ export { ChangeTracker } from './change-tracker/change-tracker'; export { ViewShellHooks } from './view-shell-hooks/view-shell-hooks'; export { WaterMarkUtil } from './water-mark-util/water-mark-util'; export * from './map-util/map-util'; +export * from './wechat-util/wechat-util'; diff --git a/packages/runtime/src/utils/wechat-util/wechat-util.ts b/packages/runtime/src/utils/wechat-util/wechat-util.ts new file mode 100644 index 0000000000000000000000000000000000000000..8578196f9e2fa452c00c968639e7e8d36f5814cf --- /dev/null +++ b/packages/runtime/src/utils/wechat-util/wechat-util.ts @@ -0,0 +1,76 @@ +import { IApiWeChatUtil } from '../../interface'; + +/** + * @description 微信工具类 + * @export + * @class WeChatUtil + * @implements {IApiWeChatUtil} + */ +export class WeChatUtil implements IApiWeChatUtil { + /** + * @description 获取微信授权签名数据 + * @param {IData} data + * @returns {*} {(Promise)} + * @memberof WeChatUtil + */ + async getSign(data: IData): Promise { + const result = await ibiz.net.request(ibiz.config.mob.mobGetSignUrl, { + method: ibiz.config.mob.mobGetSignMethod, + data, + }); + if (result.ok) { + return result.data; + } + } + + /** + * @description 配置微信授权 + * @param {string[]} [jsApiList=[]] 使用js-sdk的api列表 + * @param {IData} signData 获取授权签名请求数据 + * @param {IData} [fieldMap={}] 授权签名数据与ws.config的属性映射表,分别为timestamp(时间戳属性)、nonceStr(随机字符串属性)、signature(签名属性) + * @returns {*} {Promise} + * @memberof WeChatUtil + */ + config( + jsApiList: string[] = [], + signData: IData = {}, + fieldMap: IData = {}, + ): Promise { + return new Promise((resolve, reject) => { + // 先获取授权签名 + this.getSign(signData) + .then((data: IData | undefined) => { + if (data) { + // 微信授权签名数据与config的映射关系字段 + const timestampField = fieldMap.timestamp || 'timestamp'; + const nonceStrField = fieldMap.nonceStr || 'nonceStr'; + const signatureField = fieldMap.signature || 'signature'; + // wx为引入的微信sdk,wx为全局变量,具体请查看微信sdk文档 + (window as IData).wx.config({ + debug: ibiz.config.mob.mobWeChatDebug, + appId: ibiz.env.mobWeChatAppId, + timestamp: data[timestampField], + nonceStr: data[nonceStrField], + signature: data[signatureField], + jsApiList, + }); + (window as IData).wx.ready((event: IData) => { + // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后, + // config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口, + // 则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中 + resolve(event); + }); + (window as IData).wx.error((error: IData) => { + // config信息验证失败会执行error函数,如签名过期导致验证失败, + // 具体错误信息可以打开config的debug模式查看, + // 也可以在返回的res参数中查看,对于SPA可以在这里更新签名。 + reject(error); + }); + } + }) + .catch(error => { + reject(error); + }); + }); + } +}