uni-app调用wx.requestpayment前必须由后端调用/unifiedorder接口获取prepay_id并签名返回,前端需严格按签名字段(appid、timestamp字符串、noncestr、package="prepay_id=xxx"、signtype、paysign)原样传入,且真机需校验appid绑定与支付目录配置,success回调不等于支付成功,须以微信服务端异步通知为准。

uni-app调用wx.requestPayment前必须先获取prepay_id
微信小程序支付不是直接传金额就能唤起支付,uni.requestPayment 只负责拉起支付界面,真正的支付凭据(prepay_id)必须由后端签名后返回。前端若跳过这步、自己拼接 timeStamp 或 paySign,必然失败——微信校验的是服务端用商户私钥对统一下单返回数据的二次签名。
常见错误现象:requestPayment:fail invalid sign 或 支付验证失败,请稍后重试,基本都是前端试图自己算签名,或后端没按微信文档要求对 appId、timeStamp、nonceStr、package、signType 五字段做字典序拼接再签名。
- 后端必须调用微信
/pay/unifiedorder接口,传入trade_type=JSAPI(小程序场景),并确保openid正确(需用用户在当前公众号/小程序的 openid,不能混用) - 后端返回给前端的数据结构里,必须包含
appId、timeStamp(字符串格式的秒级时间戳)、nonceStr、package(固定为prepay_id=xxx)、signType(推荐MD5或HMAC-SHA256)、paySign -
timeStamp必须是字符串,不是数字;package的值必须严格为prepay_id=xxx,多空格、少等号、带引号都会导致签名失败
uni.requestPayment参数必须与后端签名字段完全一致
哪怕后端签名时用了 nonceStr,前端传入 nonceStr 就必须是同一个值;timeStamp 同理。不一致会导致微信端验签失败,错误提示常为 invalid signature 或静默失败。
实操建议:后端把签名所需全部字段(包括 appId、timeStamp、nonceStr、package、signType、paySign)一次性返回给前端,前端原样透传,不要重新生成或格式化任何字段。
- 调用示例(注意所有字段名大小写、类型、值格式):
uni.requestPayment({
provider: 'wxpay',
orderInfo: {
appId: res.appId,
timeStamp: res.timeStamp, // 字符串,如 "1715823496"
nonceStr: res.nonceStr,
package: res.package, // 如 "prepay_id=wx1234567890"
signType: res.signType, // 如 "MD5"
paySign: res.paySign
},
success: (res) => {
console.log('支付成功', res)
},
fail: (err) => {
console.error('支付失败', err)
}
})
注意:orderInfo 是 uni-app 特有字段名,不是微信原生字段;内部字段名(如 timeStamp)必须与微信要求完全一致(驼峰、大小写敏感)。
name wechat-article-writer-pro description 微信公众号文章完整生成技能(专业版)。输入主题即自动完成:信息调研、文章撰写(含章节配图)、5个备选爆款标题、封面图生成、带格式排版的DOCX文档输出。触发词:写公众号文章、生成公众号内容、做微信推文、公众号文章完整版。 agent_created true 微信公众号文章完整生成技能(专业版) 概述 本技能提供微信公众号文章从主题到成品的完整生成流程,在基础版之上增加:章节配图、DOCX 格式输出(含彩色重点文字和表格
真机调试时务必检查 AppID 和支付目录配置
开发工具能调起支付不代表真机能行。最常被忽略的两点:appid 是否与微信开放平台绑定的小程序一致;支付目录是否在微信支付商户平台「产品中心 → 开发配置」中正确填写。
- 支付目录必须精确到页面路径(如
https://yourdomain.com/pages/pay/index),且协议、域名、路径全部匹配(末尾斜杠也要一致) - 如果用的是 uni-app 的 H5 模式,微信支付不可用——
uni.requestPayment在 H5 下 provider 为alipay或其它,wxpay仅在微信小程序、App(iOS/Android 微信内置浏览器)环境有效 - 云函数或代理接口若跨域,需确保后端已配置
Access-Control-Allow-Origin,否则 prepay_id 获取请求会因 CORS 失败
支付回调逻辑不能只依赖 success 回调
uni.requestPayment 的 success 仅表示用户点击了“确认支付”并输入密码(或指纹),不代表扣款成功。网络中断、用户取消、银行侧失败等情况都可能让前端收不到结果,但后端已收到微信异步通知。
真正可靠的支付完成状态,必须以你服务器收到微信 https://yourdomain.com/pay/callback 的 POST 通知为准,并校验 sign 和 return_code/result_code。前端可轮询订单状态,或等 WebSocket 推送,但绝不能把 requestPayment success 当作最终支付成功。
容易被忽略的点:fail 回调里包含 errCode: 3003(用户取消)、errCode: 3002(支付失败),但这些只是客户端视角;微信后台仍可能在几秒后发出支付成功的通知,所以前后端状态必须以服务端通知为准。










