收藏
回答

iOS 体验版调用 wx.requestVirtualPayment 返回 errCode=4?

iOS 现网 Apple IAP 已开通,小程序简称已审核,平台路径已开启,道具已发布。

Android 现网同一 productId=trial 可正常付款并到账。

iOS 体验版调用 wx.requestVirtualPayment 返回 errCode=4,服务端未收到 xpay_goods_deliver_notify,提示微信虚拟支付未完成(4),换一个手机提示-15001

当前 signData 已简化为仅包含 offerId/buyQuantity/env/currencyType/productId/goodsPrice/outTradeNo。

请协助查询 outTradeNo=WEDP20260503164438WHBBJO 的 iOS Apple IAP/米大师侧失败原因。



现网 env=0

iOS platform=ios

苹果 IAP 支付已开通

平台路径已开启

小程序简称已审核通过

道具 trial 已发布

productId=trial

goodsPrice=990

outTradeNo=WEDP20260503151447EGSR1H

wx.requestVirtualPayment 返回 errCode=4

服务端未收到 xpay_goods_deliver_notify

体验版也不行,预览也不行


iOS 客户端调用时间

调用时间:2026-05-03 16:44 左右(北京时间,Asia/Shanghai)

测试环境:体验版

客户端:iPhone / iOS

支付方式:微信小程序虚拟支付,iOS Apple IAP

本次订单信息

outTradeNo / order_no:WEDP20260503164438WHBBJO

productId:trial

goodsPrice:990

env:0(现网)

mode:short_series_goods

offerId:1450525010

调用 wx.requestVirtualPayment 的完整请求参数

本次 iOS 为排查问题,已将 signData 简化为最小字段,不包含 platform,不包含 attach。


{

  "signData": "{\"offerId\":\"1450525010\",\"buyQuantity\":1,\"env\":0,\"currencyType\":\"CNY\",\"productId\":\"trial\",\"goodsPrice\":990,\"outTradeNo\":\"WEDP20260503164438WHBBJO\"}",

  "paySig": "请见服务端实际返回,已用现网 AppKey 计算,因涉及签名不公开完整值",

  "signature": "请见服务端实际返回,已用 wx.login/code2session 返回的 session_key 计算,因涉及用户态签名不公开完整值",

  "mode": "short_series_goods"

}

展开后的 signData:


{

  "offerId": "1450525010",

  "buyQuantity": 1,

  "env": 0,

  "currencyType": "CNY",

  "productId": "trial",

  "goodsPrice": 990,

  "outTradeNo": "WEDP20260503164438WHBBJO"

}

客户端现象

iOS 体验版点击支付后,前端提示:


微信虚拟支付未完成,请重试(4)

服务端未收到支付成功发货通知。


服务端 virtual-prepay 日志

服务端已成功创建订单并生成虚拟支付参数:


POST /ai/wedding/billing/orders HTTP/1.1 200 OK

POST /ai/wedding/billing/orders/WEDP20260503164438WHBBJO/wechat/virtual-prepay HTTP/1.1 200 OK

可补充截图:请截服务器中包含上述两行的日志。


xpay_goods_deliver_notify 未收到情况

我们服务端发货推送接口地址为:


https://api.weddinghost.xyz/ai/wedding/billing/payments/wechat/virtual/notify

该接口用于接收 xpay_goods_deliver_notify。本次订单支付失败后,服务端日志中没有出现:


POST /ai/wedding/billing/payments/wechat/virtual/notify

说明本次 iOS 支付未进入成功发货推送链路。


服务端可用以下命令过滤验证:


cd /root/wedding-host

docker compose --env-file .env.prod -f docker-compose.prod.yml logs --tail=300 kinit-api | grep "WEDP20260503164438WHBBJO\|virtual/notify\|xpay_goods_deliver_notify"

当前结果仅能看到 virtual-prepay 200 OK,看不到 virtual/notify。


苹果 IAP 支付通知地址配置确认

微信虚拟支付后台已配置并启用消息推送/发货推送地址:


https://api.weddinghost.xyz/ai/wedding/billing/payments/wechat/virtual/notify

配置情况:


消息加密方式:明文模式

数据格式:JSON

状态:已启用

苹果 IAP 支付:已开通

平台路径:已开启

小程序简称:已审核通过

该地址已通过微信后台服务器地址验证。手动测试也可访问:


curl -i -X POST https://api.weddinghost.xyz/ai/wedding/billing/payments/wechat/virtual/notify \

  -H "Content-Type: application/json" \

  -d '{}'

返回:


{"ErrCode":1,"ErrMsg":"missing OutTradeNo"}

说明接口可达,且未被登录鉴权拦截。


服务端 rid 请求标识

目前我们服务端日志中没有看到微信侧 rid 字段。virtual-prepay 是我们小程序前端请求自己后端的接口,日志中只有 HTTP 请求记录,没有微信 rid。


如果官方需要微信侧 rid,请说明该 rid 应从以下哪个位置获取:


1. iOS 微信客户端 requestVirtualPayment fail 回调对象

2. 微信开发者工具 Console

3. 微信后台交易订单详情

4. 米大师后台流水/失败记录

我们目前客户端返回只看到错误码 4,未看到 rid。

最后一次编辑于  星期一 10:40
回答关注问题邀请回答
收藏

2 个回答

  • Memory (私信不回复)
    Memory (私信不回复)
    星期一 14:50

    -15001参数错误,具体原因见err_msg 这个打印出来的错误是什么?

    星期一 14:50
    有用
    回复 3
    • 林鹏
      林鹏
      2天前
      platform=ios
      signData={"offerld":"1450525010""buyQuantity":1,"'env":0,"currencyType":"CNY","productld":"trial","goodsPrice":990,"outTradeNo":"WEDP20260503163742XDU6MF""attach":"{\"order_no\":\"WEDP20260503163742XDU6MF""plan_code\":("triall",("user_id":2y"}

      我在服务器默临时让后端在 virtual-prepay 成功时打印一行脱敏日志,显示:
      2天前
      回复
    • 林鹏
      林鹏
      2天前
      您能帮我看看吗? 后端是phython
      2天前
      回复
    • Memory (私信不回复)
      Memory (私信不回复)
      1天前回复林鹏
      报错信息呢?
      1天前
      回复
  • 智能回答 智能回答 本次回答由AI生成
    星期一 10:26
    有用
    回复
登录 后发表内容