s***@udeer.ai
s***@udeer.ai
  • 发布:46 分钟前
  • 更新:45 分钟前
  • 阅读:36

【热更新异常】同机型整包1.6.4正常,升级wgt(1.6.10)后 uni.requestMerchantTransfer 变 undefined

分类:uni-app

复现问题描述

我们遇到一个稳定可复现的问题:同一台设备安装整包 1.6.4 时,微信提现功能正常;升级到热更新包 1.6.10.wgt 后,调用 uni.requestMerchantTransfer 报错 is not a function。

复现步骤

  1. 安装整包 1.6.4(HBuilderX 5.24 打包)。
  2. 进入提现页面,调用微信提现,功能正常。
  3. 下发并安装 1.6.10 的 wgt 热更新包。
  4. 再次进入提现并调用,报错:
    uni.requestMerchantTransfer is not a function. (In  
    'uni.requestMerchantTransfer({mchId:i,appId:"wx074b893eda4920ab",package:o,success:  
    ()=>{uni.hideLoading(),uni.showToast({title:n("reindeer.common.transferSuccess"),icon:"none"}),uni.navigateTo(  
    {url:`${qa}?orderNo=${e}`})},fail:e=>{uni.hideLoading();let  
    t=e.errMsg;"requestMerchantTransfer:fail cancel"===t&&(t=n("reindeer.common.transferCancel")  
    ),uni.showToast({title:t,icon:"none"}),C("error",", at  
    components/pages/reindeer/withdraw/hooks/  
    useWXTransfer.ts:44","转账失败",e),a(e)},complete:  
    ()=>{t.value=!1}})', 'uni.requestMerchantTransfer' is  
    undefined)

实际结果

热更新后微信提现失败,uni.requestMerchantTransfer 在运行时为 undefined。

期望结果

整包 1.6.4 已可用的前提下,升级同项目同链路 wgt 后,uni.requestMerchantTransfer 仍应可用,不应变为 undefined。

已确认信息

  • 项目内已安装 uni-requestMerchantTransfer(src/uni_modules/uni-requestMerchantTransfer 存在)。
  • manifest 中已配置 oauth.weixin、payment.weixin。
  • 整包可用,仅 wgt 后异常。

环境信息

  • HBuilderX:5.24
  • 平台:App(iOS)
  • Appid:UNIBC9C094

报错代码

const requestMerchantTransfer = (  
  orderNo: string,  
  mchId: string,  
  packageInfo: string,  
) => {  
  return new Promise<void>((resolve, reject) => {  
    uni.requestMerchantTransfer({  
      mchId,  
      appId: WX_TRANSFER_APP_ID,  
      package: packageInfo,  
      success: () => {  
        uni.hideLoading();  
        uni.showToast({  
          title: t('reindeer.common.transferSuccess'),  
          icon: 'none',  
        });  
        uni.navigateTo({  
          url: `${RouterEnum.ReindeerWithdrawDetail}?orderNo=${orderNo}`,  
        });  
        resolve();  
      },  
      fail: (err) => {  
        uni.hideLoading();  
        let errMsg = err.errMsg;  
        if (errMsg === 'requestMerchantTransfer:fail cancel') {  
          errMsg = t('reindeer.common.transferCancel');  
        }  
        uni.showToast({ title: errMsg, icon: 'none' });

咨询问题

  1. 在“整包可用、wgt 后失效”的场景下,官方建议的排查顺序/修复方案是什么?
  2. 是否有已知版本或配置可规避该问题?
46 分钟前 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。

根据您描述的场景(整包正常,仅 wgt 热更新后 API 丢失),这是典型的 wgt 热更新与原生插件/uts 插件不兼容 问题。以下是官方建议的排查顺序与修复方案:

一、问题根因分析

1. wgt 热更新的本质限制
wgt 热更新仅更新前端 JS/CSS/页面资源,不包含原生 SDK、uts 插件编译产物或 Info.plist 等原生配置的更新

uni.requestMerchantTransferuni ext api,属于依赖原生环境的 uts 插件。根据知识库记载,App 平台在旧版本中确实存在 "wgt热更新后无法调用 uts 加密插件" 的 Bug(参见 4.06 版本修复记录),同类机制可能导致 uni-requestMerchantTransfer 在热更新后无法被正确注册。

2. 版本匹配机制
wgt 包升级意味着编译 wgt 的 HBuilderX 版本与手机端已存在的整包版本可能不匹配。如果 uniRuntimeVersion(手机端)与 uniCompileVersion(wgt 包)不一致,会导致 API 注册异常(参考 wgt热更新造成的版本差异)。

二、官方排查顺序与修复方案

第一步:确认插件引入方式

  • 错误方式uni.requestMerchantTransfer(...) 全局调用(在 wgt 场景下易丢失)
  • 正确方式:必须显式引入插件(参考 uni-requestMerchantTransfer 插件文档):
    
    import { requestMerchantTransfer } from "@/uni_modules/uni-requestMerchantTransfer"  

// 使用
requestMerchantTransfer({
mchId: "mchId",
appId: "微信开发者平台对应app的APPID",
package: "package",
success: (res) => { console.log(res) },
fail: (res) => { console.log(res.errMsg) }
})


> **本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用[uni-agent](https://uniapp.dcloud.net.cn/ai/)**  

**第二步:检查 iOS 原生配置**  
iOS 平台必须在项目根目录下的 **Info.plist** 文件中配置微信 APPID 和通用链接(Universal Links),且 **wgt 热更新无法更新此文件**:  
- 在 `WeChat` 节点下配置 `appid` 和 `universalLink`  
- 在 `CFBundleURLTypes` 节点下配置 scheme 数据  
- 配置后需**提交云端打包**生效(仅 wgt 更新不会生效)  

**第三步:验证 HBuilderX 版本兼容性**  
- 检查编译 wgt 的 HBuilderX 版本是否与打整包时的版本一致。如果不一致,建议:  
  1. 使用与整包相同的 HBuilderX 版本重新编译 wgt  
  2. 或升级用户端整包(推荐,避免版本碎片化)  

**第四步:修复方案选择**  
- **方案 A(推荐)**:对涉及 `uni-requestMerchantTransfer` 的更新,**使用整包更新(ipa/apk)而非 wgt 热更新**,确保原生插件正确注册。  
- **方案 B**:确保使用 **HBuilderX 4.06+** 版本编译 wgt(该版本修复了 wgt 热更新后无法调用 uts 插件的 Bug),并严格按照显式引入方式调用 API。  
- **方案 C**:如必须使用 wgt,需在 manifest 中配置取消版本不匹配弹框,并充分测试 uts 插件在热更新后的可用性。  

### 三、已知版本与配置规避  

1. **版本规避**:避免在 HBuilderX 4.06 之前的版本中使用 wgt 热更新包含 uts 插件的功能。  
2. **配置规避**:无特殊配置可绕过,**涉及原生插件(uts)的功能变更,原则上不建议使用 wgt 热更新**。  
3. **热更新回退**:若已发布问题 wgt,建议立即发布整包更新强制覆盖,或回退到整包版本的 wgt 资源。  

**总结**:对于依赖原生 SDK 的 `uni.requestMerchantTransfer`,在整包可用而 wgt 失效的场景下,最稳妥的方案是**放弃 wgt 热更新,改用整包更新**,并确保代码中使用 `import { requestMerchantTransfer } from "@/uni_modules/uni-requestMerchantTransfer"` 的显式引入方式。
内容为 AI 生成,仅供参考

要回复问题请先登录注册