# 应用内支付沙盒测试常见问题及解决方案

#### 问题现象

1.  HarmonyOS应用沙盒测试环境下进行订单token校验返回错误提示{"responseCode":"1001880886","responseMessage":"IWT verification failed!"}怎么解决？
2.  iap.queryPurchases接口无法查询沙盒环境的已发货的订单信息，如何解决？
3.  在沙盒测试环境下，iap.finishPurchase接口调用后，再通过iap.queryPurchases接口查询不到已购产品？
4.  沙盒环境下查询自动续期订阅商品的订阅状态，出现报错，如何解决？

#### 背景知识

沙盒测试允许开发者在接入华为应用内支付调测过程中对订单进行虚拟支付。沙盒订单并非真实订单，无法在开发者中心->我的报表->支付报表中查询。

#### 解决方案

1.  可以按照如下方式进行排查：
    *   支付服务开关验证：检查AGC控制台是否已开通支付服务，路径：AppGallery Connect>项目>应用服务>应用内支付>管理开关，确保已开启对应环境的支付功能（开发/生产环境）。
    *   应用签名校验：确认应用签名证书与AGC后台配置一致和验证签名证书指纹是否更新至AGC后台。
    *   检查config.json中bundleName与AGC注册的包名匹配。
    *   沙箱环境配置：确保使用华为官方沙箱测试账号，测试账号需完成实名认证（身份证+银行卡）以及检查测试商品是否配置为"沙箱测试商品"，确认接口地址为沙箱专用环境地址（与生产环境区分）时间同步与证书验证。
    *   请求参数完整性：验证请求头包含正确的Authorization（需使用jwt鉴权）和检查请求体参数，purchaseToken参数必须与购买接口返回一致，purchaseOrderId必须是有效的订单号。
    *   检查服务器UTC时间误差需小于5分钟和确认JWS验签使用华为提供的公钥证书。

2.  目前非消耗性商品在沙盒状态下调用finishPurchase接口是便于下次可以重新购买，因为非消耗性商品正常情况下只能购买一次。沙盒提供该机制是为了能够方便开发者不用多次创建商品或者更换系统账号进行再次测试，若需要获取到购买数据，可以在沙盒环境下不调用finishPurchase接口。
3.  iap.finishPurchase在已购商品的发货后进行调用来指明此次购买流程结束。而iap.queryPurchases返回已购商品的订单信息，在沙盒场景下已发货状态的非消耗型商品订单信息将不返回。
4.  在沙盒环境下，由于引入“时光机”概念，订阅续订时间会比正常情况更快，沙盒环境中的订阅换算时间为10秒/天，订阅状态查询是查询最新续期商品的自动续期订阅状态，若已经自动续期，就是新的订单，若还没确认收货此时查询就会出现报错。

#### 常见FAQ

Q：发布证书打包的应用是否可以使用沙盒测试？

A：沙盒测试本质是在调试开发阶段使用的，需要使用调试证书，发布证书无法使用，如需在正式环境下测试，可以使用邀请测试或者公开测试进行验证支付，然后申请退款。

Q：沙盒测试无法查询和购买已配置的商品，提示1001860001错误码，如何解决？

A：检查是否有开启和激活应用内购买服务。

Q：沙盒环境是否有关键事件通知重试机制？

A：沙盒环境下是没有的，正式环境是有的，限制是48小时内，间隔不是固定的，开始是按秒级发送的，后面是小时级发送的。只要返回非200就会重发。

Q：华为应用内支付服务如何配置沙盒测试？

A：在AppGallery Connect后台开通应用内支付服务并创建虚拟商品和配置沙盒测试。

Q：应用内支付报错提示1001860058:The HUAWEI ID is not test account？

A：该账号不是测试账号，新增沙盒测试账号，需要在AppGallery Connect网站左侧导航栏点击新增测试账号。