uni-app unipay微信H5支付不支持V3

发布于 1周前 作者 phonegap100 来自 Uni-App

uni-app unipay微信H5支付不支持V3

操作步骤:

  • 在手机浏览器中运行uni-pay示例程序,打开收银台,选择微信支付,会跳转到一个/undefined路径

预期结果:

  • 正常支付

实际结果:

  • 会跳转到一个/undefined路径

bug描述:

  • 使用微信支付V3版本,PC浏览器扫码支付正常,手浏览器会跳转undefined,原因如下:
    • 文件 uni_modules/uni-pay/components/uni-pay/uni-pay.vue,方法 orderPayment 中,res.order.codeUrlres.order.mwebUrl 都是 undefined,导致 window.location.href 到一个 undefined 地址。见图1和图4。
    • 通过排查发现,在文件 uni_modules/uni-pay/uniCloud/cloudfunctions/uni-pay-co/service/pay.jscreateOrder 方法中,通过 getOrderInfo 获取的 order 对象中,只有一个 H5Url 属性。见图2。
    • 继续深入发现,在 getOrderInfo 方法中(uni_modules/uni-pay/uniCloud/cloudfunctions/common/uni-pay/index.js),order 对象是从微信接口(/v3/pay/transactions/H5)中获取的,返回的就只有 H5Url。见图3。
    • 看了下微信支付的V3文档,微信的接口返回的是一个 h5_url,为啥在 getOrderInfo 方法中又会被转成 H5Url 也是奇奇怪怪的。而 mweb_url 参数应该是V2版本的吧 https://pay.weixin.qq.com/docs/merchant/apis/h5-payment/direct-jsons/h5-prepay.html

图片

Image 1 Image 2 Image 3 Image 4


2 回复

已修复, 更新到最新版即可


在处理uni-app中unipay微信H5支付不支持V3版本的问题时,我们通常需要确保使用的是兼容当前支付接口的版本。虽然uni-app和unipay的官方文档可能已经提供了相关指引,但由于直接支持V3版本的功能可能尚未全面铺开,我们可以通过模拟V2版本的支付流程来解决兼容性问题。以下是一个简化的V2版本微信H5支付的实现代码示例,供参考:

// 引入uni-app和unipay相关模块
const uni = require('uni-app-lib');
const unipay = require('unipay-sdk');

// 配置微信H5支付参数
const wechatH5Config = {
    appId: 'your-wechat-app-id',       // 微信开放平台应用ID
    mchId: 'your-mch-id',              // 商户号
    key: 'your-api-key',               // API密钥
    notifyUrl: 'https://your-notify-url.com/callback', // 回调地址
    spbillCreateIp: '127.0.0.1'        // 终端IP
};

// 生成支付订单信息
const orderData = {
    outTradeNo: 'order-' + new Date().getTime(), // 商户订单号
    body: 'Test Order',                          // 商品描述
    totalFee: 1,                                 // 支付金额(单位:分)
    openid: 'user-openid'                        // 用户openid(对于H5支付,这里通常从前端获取)
};

// 调用unipay生成支付参数
unipay.wxH5Pay(wechatH5Config, orderData).then(payParams => {
    // 获取到支付参数后,通常需要将mwebUrl跳转到前端页面
    uni.redirectTo({
        url: payParams.mwebUrl
    });
}).catch(error => {
    console.error('支付参数生成失败:', error);
});

// 回调处理(在服务器端实现)
// 收到微信支付异步通知后,验证签名并处理订单状态
function handleNotify(req, res) {
    const notifyData = req.body;
    // 验证签名逻辑(略)
    // 更新订单状态逻辑(略)
    res.send('success'); // 微信要求返回字符串"success"以确认收到通知
}

// 注意:回调处理部分需要在服务器端实现,并且确保服务器能够访问外网以验证微信签名。

请注意,上述代码是一个简化的示例,用于展示如何在uni-app中使用unipay进行微信H5支付的基本流程。在实际应用中,你需要处理更多的细节,比如错误处理、日志记录、安全性验证等。此外,随着微信支付的更新迭代,建议定期检查并更新支付接口的使用,以确保兼容性和安全性。

回到顶部