手机充值在uni-app中属微信小程序支付业务场景,需后端生成订单并返回uni.requestpayment参数,严格校验openid、金额、时效及运营商类目资质。

手机充值功能在 uni-app 中不是独立支付类型,它本质是「微信小程序支付」的一个业务场景,和买商品、缴水电费流程完全一致。唯一区别是后端订单生成时,商品描述写“话费充值”,金额按运营商规则(如 10 元、50 元、100 元档位),且需确保微信商户号已开通「虚拟类目」或「通信服务」资质。
uni.requestPayment 的五个参数必须由后端返回
前端绝不能自己拼 package 或算 paySign。常见错误是开发者试图用前端 JS 算签名,结果因缺少私钥、时钟偏差、编码不一致直接失败。
-
timeStamp:秒级时间戳(Math.floor(Date.now() / 1000)),不是毫秒 -
nonceStr:32 位以内纯字母数字随机串(推荐用Math.random().toString(36).substr(2, 15)) -
package:固定格式字符串prepay_id=wx1234567890abcdef1234567890abcdef,来自微信统一下单接口的prepay_id字段 -
signType:必须为HMAC-SHA256(微信 v3 接口强制要求,v2 已停用) -
paySign:由后端用商户私钥对上述四字段 + appId + mchId 拼接后签名得出,前端只负责透传
后端必须完成 JSAPI 支付全流程(不能跳过 openid)
用户点击充值按钮时,若后端没拿到该用户的 openid,支付会直接报错 INVALID_REQUEST: invalid openid。而 openid 不是前端能直接提供的,必须走标准链路:
- 前端调用
uni.login({ provider: 'weixin' })拿到code - 前端把
code发给后端(建议走 HTTPS,带 token 鉴权) - 后端用
code+appid+appsecret向微信接口https://api.weixin.qq.com/sns/jscode2session换取openid - 后端创建订单时,把
openid作为必填参数传给微信统一下单接口(trade_type=JSAPI)
充值订单要防重、防改、有时效
手机充值对幂等性和时效敏感——同一手机号重复充、金额被篡改、预支付单过期都会导致用户投诉。
- 后端生成订单号必须全局唯一(推荐用
yyyyMMddHHmmss + 6位随机数或雪花 ID) - 金额字段必须服务端校验:前端传 100,后端得查数据库确认该档位是否允许、是否在活动价范围内
- 微信预支付单默认 2 小时失效,但充值类业务建议设为 15 分钟(下单时传
time_expire参数) - 回调地址(notify_url)必须验签、解密,并且只处理
return_code=SUCCESS & result_code=SUCCESS的通知 - 收到回调后,必须再调一次微信的
https://api.mch.weixin.qq.com/v3/pay/transactions/id/{transaction_id}主动查单,避免假通知
最容易被忽略的是:微信要求充值类订单的 description 字段必须包含运营商名称(如“中国移动话费充值”),且不能含营销话术;另外,个体工商户主体的小程序,若未在微信支付后台勾选「通信服务」类目,即便代码全对,也会被静默拦截。这类配置项藏得深,得进「微信支付商户平台 → 产品中心 → 开发配置 → 类目管理」里手动开。











