V2EX 09月30日 10:55
iOS内购服务器通知处理指南
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文档旨在解答关于iOS内购服务器通知的常见疑问,特别是针对App Store Connect后台配置的生产和沙盒环境回调地址,以及TestFlight测试中的实际情况。文章详细阐述了如何确认支付完成、处理退款以及解决生产环境接口配置后回调地址依然指向沙盒的问题。通过对JWT的signedPayload和signedTransactionInfo的解析,明确了支付成功与否的判断依据,并提供了退款通知的可能性分析。同时,针对提审阶段可能遇到的回调地址错乱问题,提出了解决方案,以确保内购功能顺利通过审核。

✅ **支付完成确认**: 收到苹果服务器关于`ONE_TIME_CHARGE`(一次性收费)的通知,并成功解析出`signedTransactionInfo`,通常可以认为该订单已完成支付。然而,为了绝对确认,建议在接收到通知后,通过苹果提供的服务器端API(如App Store Server API)对`signedTransactionInfo`进行二次验证,以确保其有效性和完整性,并检查`transactionStatus`是否为已完成状态。

💰 **退款处理机制**: 当用户发起退款时,苹果服务器会发送相应的通知。对于一次性购买,退款会触发`REFUND`(退款)或`REVOKE`(撤销)类型的通知。虽然沙盒环境可能无法完全模拟所有退款场景,但一旦用户在生产环境中退款,您的服务器也会收到类似的通知,此时应根据通知类型更新订单状态,例如标记为已退款,并酌情禁用相应内容的使用权。

🔄 **提审与回调地址问题**: 在提审阶段,如果生产环境接口已配置,但TestFlight版本仍接收到沙盒回调,这确实可能导致订单标识不匹配。为避免审核不通过,建议在提审前,确保所有测试(包括内购流程)均在生产环境服务器URL下进行。可以通过以下方式解决:1. **确保TestFlight使用的App配置指向生产环境**: 检查App Store Connect中的内购项配置,确保其已关联到生产环境。2. **服务器端逻辑适配**: 在服务器端,根据接收到的回调地址(生产或沙盒)来判断是哪个环境的通知,并相应地匹配订单。或者,在提审前,临时将沙盒URL指向一个能够正确响应的测试服务器,并在审核通过后再切换回生产环境URL。

现在是在 App Store Connect 后台开启了 App Store 服务器通知

填写了 生产环境服务器 URL沙盒环境服务器 URL 两个回调地址

生产环境服务器 URL: https://prod.xxx.com/iapNotify

沙盒环境服务器 URL: https://test.xxx.com/iapNotify

在开发过程中,测试同事使用 TestFlight 安装了最新版本的 app

当客户端完成支付时,沙盒环境服务器 URL 会收到苹果服务器通知,一个是 JWT 字符串

signedPayload解出来是下面这样的:

{  "notificationType": "ONE_TIME_CHARGE",  "notificationUUID": "d03b3bae-a63c-4fd3-ad4f-69e52fb966fd",  "data": {    "appAppleId": 6751180999,    "bundleId": "xx.yy.zz",    "bundleVersion": "62",    "environment": "Sandbox",    "signedTransactionInfo": "eyJhbG..."  },  "version": "2.0",  "signedDate": 1759197475796}

再把signedTransactionInfo解出来是这样的:

{  "transactionId": "2000001023950888",  "originalTransactionId": "2000001023950888",  "bundleId": "xx.yy.zz",  "productId": "xx.yy.zz.product_01",  "purchaseDate": 1759197470000,  "originalPurchaseDate": 1759197470000,  "quantity": 1,  "type": "Consumable",  "appAccountToken": "856bb959-ae22-4711-2005-af69286aceed",  "inAppOwnershipType": "PURCHASED",  "signedDate": 1759197475796,  "environment": "Sandbox",  "transactionReason": "PURCHASE",  "storefront": "CHN",  "storefrontId": "143465",  "price": 6000,  "currency": "CNY",  "appTransactionId": "704888381761368888"}

appAccountToken 是我们的订单唯一标识

问题:

1.怎么确认这个订单已完成支付

是只要有这个回调就认为是支付成功了吗?

2.如果订单退款是怎么处理

沙盒环境好像不能测试内购的退款流程,如果上线了退款时,也会有这种服务器通知吗

3.现在要提审 app ,更换了生产环境接口 https://prod.xxx.com ,在 TestFlight 里更新到最新版

支付完成后,App Store 的服务器通知还是会请求到 沙盒环境服务器 https://test.xxx.com ,这样订单标识就对不上了。那 App Store 的审核人员审核内购时会审核不通过吧。

首次对接 iOS 内购,问题有点多,希望各位大佬赐教

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

iOS内购 App Store Connect 服务器通知 TestFlight 退款 支付验证 内购审核 iOS In-App Purchase Server Notifications Refund Payment Verification App Review
相关文章