微信小程序红包接口不支持uni-app直接调用,必须由后端调用微信官方api,前端仅负责获取openid、提交参数并轮询结果;关键参数如sign和nonce_str须后端生成,且后端需配置证书、https及白名单。

微信小程序红包接口不支持 uni-app 直接调用
微信官方明确限制:sendRedPacket 接口仅开放给已认证的企业主体、且完成微信支付商户号开通的「服务号 + JSAPI 支付」场景,**小程序(包括 uni-app 编译的小程序)无法直接调用该接口**。uni-app 本身也不提供封装层,所有尝试在 uni.request 中直连微信红包 API 的做法都会因签名失败、域名未备案、证书缺失或跨域拦截而报错 request:fail net::ERR_CONNECTION_REFUSED 或 401 Unauthorized。
真实可行路径只有一条:由你的后端服务调用微信红包接口(https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack),uni-app 前端只负责触发请求、传递必要参数(如用户 openid、金额、备注)、并轮询或监听结果。
uni-app 前端必须传给后端的关键参数
前端不能生成签名,也不能接触证书,但需准确采集并透传以下字段给后端:
-
openid:当前用户的微信小程序 openid(必须通过uni.login+ 后端jscode2session换取,不能用uni.getUserInfo的 fakeId) -
amount:整数,单位为分(例如 100 元 → 传10000),必须是 100 的整数倍且 ≥100 -
client_ip:用户发起请求时的真实 IP(uni-app 无法直接获取,需后端从请求头X-Real-IP或X-Forwarded-For提取) -
act_name和remark:活动名称与发放备注(纯文本,长度限制严格,超长会被截断或拒收) -
nonce_str和sign:这两个必须由后端生成,前端传空或忽略
常见错误:前端试图自己拼接 sign —— 微信红包要求使用商户 API 证书(apiclient_cert.pem + apiclient_key.pem)参与签名,uni-app 运行环境无文件系统、无私钥加载能力,强行实现等于伪造签名,必然失败。
后端调用红包 API 的硬性前提
你的服务器必须满足以下全部条件,缺一不可:
- 已配置微信支付商户号,并在「产品中心」开通「现金红包」权限
- 已下载并部署微信支付 API 证书(
apiclient_cert.pem和apiclient_key.pem),且证书未过期 - 后端调用地址必须是 HTTPS,且域名已在微信商户平台「API 安全」中白名单备案
- 请求头
Content-Type必须为application/xml,且 XML 请求体需严格按微信文档格式拼接(字段顺序、CDATA 包裹、空格/换行敏感) - 每次请求的
nonce_str需随机生成(32 位以内字母数字),不能复用
性能注意:微信红包接口响应较慢(平均 800ms–2s),建议后端采用异步处理 + 状态轮询,前端不要阻塞等待。返回 return_code=SUCCESS 仅表示微信接收成功,还需检查 result_code=SUCCESS 和 send_time 字段确认真正发放成功。
uni-app 中如何安全触发与状态同步
前端只需做三件事:拉取 openid、提交发放请求、轮询结果。示例逻辑如下:
// 1. 获取 openid(需先 wx.login)
uni.login({
success: (loginRes) => {
uni.request({
url: 'https://your-api.com/api/get-openid',
method: 'POST',
data: { code: loginRes.code },
success: (res) => {
const openid = res.data.openid;
// 2. 发起红包申请
uni.request({
url: 'https://your-api.com/api/send-redpack',
method: 'POST',
data: { openid, amount: 10000, remark: '感谢支持' },
success: (sendRes) => {
if (sendRes.data.status === 'accepted') {
// 3. 开始轮询(最多 5 次,间隔 2s)
let count = 0;
const poll = () => {
if (count >= 5) return;
uni.request({
url: `https://your-api.com/api/redpack-status?sn=${sendRes.data.sn}`,
success: (r) => {
if (r.data.status === 'success') {
uni.showToast({ title: '红包已发出' });
} else if (r.data.status === 'pending') {
count++;
setTimeout(poll, 2000);
}
}
});
};
poll();
}
}
});
}
});
}
});
容易被忽略的点:微信红包发放成功后,用户不会实时收到通知,需依赖微信服务号模板消息或小程序订阅消息补发提醒;另外,同一 openid 24 小时内最多领取 10 个红包,超出将返回 SENDNUM_LIMIT 错误,前端应提前做好限制提示。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











