uni-app不能直接对接“微信云支付”,实际需用云函数调用微信支付v2/v3接口生成prepay_id和签名,前端仅调用uni.requestPayment;uniCloud+uni-pay是最简路径,但须严格匹配appid、mchId、32位APIv2密钥、HTTPS notifyUrl等参数,且timestamp单位为秒、package值为"Sign=WXPay",H5端须用JS-SDK而非uni.requestPayment。

uni-app 不能直接对接“微信云支付”——微信官方没有叫这个名字的服务,你实际要对接的是微信支付 + 云函数(如 uniCloud)的组合方案,核心是用云函数调用微信支付 v2/v3 接口生成 prepay_id 和签名,前端只负责调用 uni.requestPayment。
uniCloud + unipay 是最简路径,但必须用对版本和参数
uniCloud 官方封装的 uni-pay(常被误称为“微信云支付”)本质是云函数 SDK,它帮你屏蔽了部分签名逻辑,但不等于免配置。关键点如下:
- 云函数中初始化
unipay实例时,appid必须填微信开放平台「移动应用」或「公众号/小程序」对应场景的 AppID,不能混用 -
mchId是商户号(10 位或 16 位纯数字),不是登录密码,也不是 API 密钥 -
key字段必须是商户平台「API安全」里设置的 32 位 APIv2 密钥(不是 APIv3 密钥,uni-pay当前主流程仍基于 v2) -
notifyUrl必须是已备案、支持 HTTPS 的域名,且需在微信商户平台白名单中登记,本地http://localhost或测试域名一律失败
uni.requestPayment 的 orderInfo 字段名大小写和类型极敏感
哪怕后端返回的是 timeStamp(驼峰),前端传给 uni.requestPayment 也必须映射为 timestamp(全小写),否则 iOS 真机直接静默失败。常见错误包括:
-
timestamp传了毫秒值(如Date.now()),应转为秒:Math.floor(Date.now() / 1000) -
package值不是"prepay_id=wx123...",而是空值、"Sign=WXPay"或其他字符串 → 报invalid package -
noncestr含中文、空格或长度超 32 → 微信验签拒绝 -
paySign是前端自己用 MD5 拼的 → 服务端没参与签名,errCode: -2(看似用户取消,实为签名无效)
H5 端完全不走 uni.requestPayment,必须用 JS-SDK
在浏览器打开的 H5 页面调用 uni.requestPayment 必定失败,因为该 API 在 H5 下无实现。正确做法是:
一站式排查小程序隐私授权报错(errno 104 / buttonId is wrong 等)+ 标准修改模式。适用:隐私协议配置、隐私弹窗不弹、授权报错、隐私接口调用失败。已抽离具体项目,适用于任何微信小程序。
- 确保用户访问环境是微信内置浏览器(
ua含MicroMessenger) - 前端请求后端获取 JS-SDK 签名参数(
appId、nonceStr、timestamp、url、signature) - 调用
wx.config初始化 SDK,jsApiList必须包含chooseWXPay - 用
wx.chooseWXPay发起支付,注意其参数字段名全是小写(timeStamp、paySign),和uni.requestPayment不一致
APP 端 manifest.json 配错一个字符就白忙活
Android/iOS 打包前,manifest.json 中的微信支付配置必须严格满足以下结构:
{
"app-plus": {
"distribute": {
"sdkConfigs": {
"wxpay": {
"appid": "wx499********7c70e",
"mch_id": "148*****52"
}
}
}
}
}
注意:sdkConfigs 下只能有 wxpay 键(不是 weixin 或 wechat),mch_id 是商户号(不是密钥),且配置后必须「提交云端打包」;真机调试必须用「自定义调试基座」,普通基座不含支付模块,调用会返回 provider not supported 或无任何响应。
最容易被忽略的其实是时间同步:服务端生成的 timestamp 与微信服务器时间偏差不能超过 900 秒(15 分钟),否则签名验证直接失败,而这个错误不会在前端报具体原因,只会静默失败或提示 errCode -2。


















