微信 JS-SDK chooseWXPay 与 WeixinJSBridge.invoke

微信 JS-SDK chooseWXPay 与 appId 关系说明文档

1. 概述

在微信 JS-SDK 【res.wx.qq.com/open/js/jwe... appId 配置。即使在调用 wx.chooseWXPay() 时没有显式传递 appId,它仍然需要在 wx.config() 阶段正确配置 appId,否则支付会失败。

2. 核心流程分析

2.1 config 阶段配置

当调用 wx.config() 方法时:

javascript 复制代码
wx.config({
    appId: 'your_app_id',  // 必须配置
    timestamp: timestamp,
    nonceStr: nonceStr,
    signature: signature,
    jsApiList: ['chooseWXPay']
});

在 jweixin-1.6.0.js 源码中:

javascript 复制代码
config: function(e) {
    C("config", h = e);  // 将配置参数保存到全局变量 h 中
    // ...
}

2.2 chooseWXPay 调用过程

当调用 wx.chooseWXPay() 时:

javascript 复制代码
wx.chooseWXPay({
    timestamp: payTimestamp,
    nonceStr: payNonceStr,
    package: package,
    signType: 'MD5',
    paySign: paySign
});

在 jweixin-1.6.0.js 源码中:

javascript 复制代码
chooseWXPay: function(e) {
    k(a.chooseWXPay, x(e), e),
    B({
        jsApiName: "chooseWXPay"
    })
},

2.3 参数处理流程

  1. chooseWXPay 调用 k 函数
  2. k 函数调用 P 函数处理参数
  3. P 函数将全局配置的 appId 添加到参数中
javascript 复制代码
function k(n, e, i) {
    r.WeixinJSBridge ? WeixinJSBridge.invoke(n, P(e), function(e) {
        V(n, e, i)
    }) : C(n, i)
}

function P(e) {
    return (e = e || {}).appId = h.appId,  // 从全局变量 h 中获取 appId
    e.verifyAppId = h.appId,
    e.verifySignType = "sha1",
    e.verifyTimestamp = h.timestamp + "",
    e.verifyNonceStr = h.nonceStr,
    e.verifySignature = h.signature,
    e
}

3. 图解说明

lua 复制代码
+------------------+     +------------------+     +------------------+
|   wx.config()    |     |  wx.chooseWXPay()|     | 微信客户端API调用 |
|                  |     |                  |     |                  |
| 设置配置参数     |     | 设置支付参数     |     |                  |
| (包含appId)      |     | (不含appId)      |     |                  |
+--------+---------+     +--------+---------+     +--------+---------+
         |                        |                          |
         | 保存到全局变量 h       |                          |
         +----------->------------+                          |
                                    |                          |
                                    | 调用 k 函数              |
                                    +------------->----------+
                                                         |
                                                         | 调用 P 函数处理参数
                                                         +----------->---------+
                                                                               |
                                                                               | 添加 appId 等验证信息
                                                                               +----------->---------+
                                                                                             |
                                                                                             | 调用微信 JSBridge.invoke
                                                                                             +----------->---------+
                                                                                                           |
                                                                                                           v
                                                                                             +----------------------+
                                                                                             | 微信客户端处理支付请求 |
                                                                                             +----------------------+

4. 关键代码路径

  1. 配置保存

    javascript 复制代码
    config: function(e) {
        C("config", h = e);  // h 是全局变量,保存 config 参数
    }
  2. 支付调用

    javascript 复制代码
    chooseWXPay: function(e) {
        k(a.chooseWXPay, x(e), e)  // 调用 k 函数
    }
  3. 参数处理

    javascript 复制代码
    function k(n, e, i) {
        r.WeixinJSBridge ? WeixinJSBridge.invoke(n, P(e), function(e) {
            V(n, e, i)  // 调用 P 函数处理参数
        }) : C(n, i)
    }
    
    function P(e) {
        return (e = e || {}).appId = h.appId,  // 从全局 h 中获取 appId
        // ... 其他验证参数
        e
    }
  4. wx.chooseWXPay 调用链

less 复制代码
wx.chooseWXPay(parameters)
        ↓
k("getBrandWCPayRequest", x(parameters), callback)
        ↓
WeixinJSBridge.invoke("getBrandWCPayRequest", P(x(parameters)), callback)
        ↓
微信客户端处理支付请求
  1. 直接调用 WeixinJSBridge.invoke
arduino 复制代码
WeixinJSBridge.invoke("getBrandWCPayRequest", parameters, callback)
        ↓
微信客户端处理支付请求

5. 常见问题及解决方案

5.1 问题:config 中未配置 appId 导致支付失败

原因P 函数从全局变量 h 中获取 appId,如果 config 阶段未配置,则 h.appId 为 undefined

解决方案

javascript 复制代码
// 正确的配置方式
wx.config({
    debug: false,
    appId: 'your_app_id',  // 必须配置
    timestamp: timestamp,
    nonceStr: nonceStr,
    signature: signature,
    jsApiList: ['chooseWXPay']
});

// 正确的支付调用方式
wx.chooseWXPay({
    timestamp: payTimestamp,
    nonceStr: payNonceStr,
    package: package,
    signType: 'MD5',
    paySign: paySign,
    success: function(res) {
        // 支付成功回调
    },
    fail: function(res) {
        // 支付失败回调
    }
});

6. 总结

虽然在 wx.chooseWXPay() 调用中没有显式传递 appId,但微信 JS-SDK 通过全局配置和参数处理机制,在底层自动将 appId 添加到支付请求中。因此,必须确保在 wx.config() 阶段正确配置 appId,否则支付功能将因权限验证失败而无法使用。

相关推荐
今天也在研究公众号1 小时前
Apple同款SVG,怎么写出来?手写+编辑器,两张方法都能搞定!
微信
半开半落4 小时前
uniapp通过npm使用第三方库兼容微信小程序
微信小程序·npm·uni-app
随笔记5 小时前
HbuilderX载入项目,运行后唤起微信开发者工具,提示:Error: Fail to open IDE,唤醒不起来怎么办
javascript·微信小程序·uni-app
Lsx_5 小时前
一文读懂 Uniapp 小程序登录流程
前端·微信小程序·uni-app
集成显卡8 小时前
AI取名大师 | uni-app 微信小程序打包 v-bind、component 动态组件问题
人工智能·微信小程序·uni-app
千寻技术帮18 小时前
50022_基于微信小程序同城维修系统
java·mysql·微信小程序·小程序·同城维修
云起SAAS2 天前
名字姓名起名打分评分抖音快手微信小程序看广告流量主开源
微信小程序·小程序·ai编程·看广告变现轻·名字姓名起名打分评分
开发加微信:hedian1162 天前
短剧小程序开发全攻略:技术选型与实现思路
微信·小程序·架构·aigc·交互
李纲明2 天前
Wordpress如何选择适合外贸的模板主题?
微信小程序·php