微信小程序无法前端发红包,必须由企业认证服务号+商户号的后端通过微信支付V2 API调用;uni-app仅负责触发请求,后端需签名、证书、IP白名单校验,并使用商户号下有效openid。

微信小程序不支持直接调用红包接口
uni-app 无法在微信小程序端直接实现“发红包”功能,因为微信官方明确禁止小程序前端(包括 uni-app 编译后的 WXML/JS)调用红包相关支付能力。微信红包(sendRedPack、sendGroupRedPack)仅开放给**企业认证的微信服务号 + 微信支付商户号**,且必须由**后端服务器**通过微信支付 V2 API 发起,签名、证书、IP 白名单等全部校验都在服务端完成。
常见错误现象:
— 在 uni.request 中直连微信红包接口,返回 {"errcode":40163,"errmsg":"invalid signature"} 或 40001(未授权);
— 尝试在小程序端加载微信支付 SDK 的红包方法,报错 undefined is not a function(微信小程序基础库根本不提供该 API)。
uni-app 正确接入路径:前端只负责触发 + 后端代理
uni-app 的角色只是发起一个业务请求(比如“用户点击发红包”),真正调用微信红包接口的是你自己的后端服务。关键点在于:后端必须使用微信支付 V2 版本(不是 V3),且需配置好商户证书(apiclient_cert.pem + apiclient_key.pem)和 API 密钥。
实操建议:
- 前端(uni-app)用
uni.request调你自己的后端接口(如/api/redpack/send),传入必要参数:openid(用户在当前商户号下的 openid)、total_amount、send_name、act_name等; - 后端收到请求后,组装 XML 请求体,用商户私钥签名,通过 HTTPS POST 到微信地址
https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack; - 后端必须校验
openid是否属于当前商户号(不能用公众号 openid 或其他商户号的 openid); - 微信要求红包发放 IP 必须在商户平台「API 安全」中提前配置白名单,否则返回
INVALID_REQUEST; - 注意:红包金额单位为分,且必须是 100 的整数倍(最小 100 分 = 1 元)。
uni-app 获取用户 openid 的坑:不能用 uni.login() 直接拿
uni.login() 返回的是微信小程序的登录凭证 code,它只能换取当前小程序的 openid(即 appid 对应的 openid),而微信红包要求的是「该用户在你微信支付商户号下的 openid」——二者不同。必须用「公众号/小程序绑定同一主体」+「unionid 体系」或「通过微信支付授权获取」才能拿到正确 openid。
可行方案:
- 如果你的小程序和微信支付商户号同主体(都是企业),且已开通「微信支付授权目录」,可在后端用
code调用微信https://api.weixin.qq.com/sns/jscode2session,但注意:该接口返回的openid是小程序 openid,仍不等于商户号 openid; - 更可靠方式:后端调用微信支付「授权获取 openid」接口(
https://api.mch.weixin.qq.com/tools/authcodetoopenid),需用户提供auth_code(通过小程序wx.chooseInvoiceTitle或自定义授权页获取,实际较重); - 最常用兜底方案:在用户首次支付时,从微信支付异步通知(
notify_url)里提取openid并存库,后续发红包时直接查表复用 —— 这个 openid 才是有效的商户号 openid。
红包到账延迟与状态回查必须由后端承担
微信红包接口是异步的:调用成功只代表“受理成功”,不代表用户已收到。实际到账可能延迟几秒到几分钟,失败也不会实时回调。uni-app 前端绝不能依赖接口返回就提示“红包已发”,必须配合后端做轮询或监听微信回调。
关键动作:
- 后端调用
sendredpack后,保存微信返回的mch_billno(商户订单号)和send_time; - 微信会向你配置的
notify_url(需在商户平台设置)推送红包发放结果(XML 格式),后端必须验签并更新数据库状态; - 若长时间未收到通知,后端应主动调用查询接口
https://api.mch.weixin.qq.com/mmpaymkttransfers/gethbinfo,传入mch_billno查询结果; - uni-app 前端可定时轮询你自己的
/api/redpack/status?billno=xxx,但轮询间隔建议 ≥15 秒,避免触发微信限频。
最容易被忽略的一点:微信红包不支持部分退款、不支持撤回、不支持修改金额,所有逻辑必须在调用前由后端严格校验,前端只做轻量输入校验(比如金额格式、必填项),别信前端传来的任何关键参数。



















