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

 

本文档旨在解答开发者在对接 iOS 内购时遇到的服务器通知相关问题。当客户端完成支付后,App Store 会向配置的回调地址发送服务器通知,其中包含 JWT 字符串。开发者需要解析此通知以确认支付状态、处理退款,并解决生产环境与沙盒环境回调地址不匹配的问题,以确保 App 顺利通过审核。

✅ **支付完成确认**:收到 Apple 服务器的通知(包含 `notificationType` 为 `ONE_TIME_CHARGE` 且 `environment` 为 `Sandbox` 或 `Production`)表明支付流程已启动。然而,要最终确认订单支付成功,还需要进一步验证 `signedTransactionInfo` 中的信息,特别是 `transactionId` 和 `purchaseDate`,并与自己系统中的订单状态进行比对。仅仅收到回调通知并不直接等同于支付成功,需要结合业务逻辑进行判断。

💰 **退款处理机制**:当用户申请退款且 Apple 批准后,Apple 服务器会发送包含 `notificationType` 为 `REFUND` 的服务器通知。开发者需要接收并解析该通知,根据 `transactionId` 找到对应的订单,并更新订单状态为已退款。虽然沙盒环境可能无法直接模拟退款流程,但生产环境中的退款会触发相应的服务器通知,因此应确保系统能够正确处理 `REFUND` 类型的通知。

🔄 **环境回调地址匹配**:在 App 提审阶段,将生产环境服务器 URL(`https://prod.xxx.com/iapNotify`)配置到 App Store Connect 后,Apple 在审核内购时,即使通过 TestFlight 安装的最新版本,也应会根据审核环境(通常是生产环境)将通知发送到配置的生产环境 URL。如果支付完成后通知仍发送到沙盒环境 URL(`https://test.xxx.com/iapNotify`),这通常意味着 App Store Connect 的配置尚未完全生效,或者 App 中存在硬编码的沙盒 URL。请仔细检查 App Store Connect 中生产环境服务器 URL 的配置,并确保 App 中没有使用硬编码的沙盒 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 支付确认 退款处理 回调地址 App审核 iOS In-App Purchase Server Notification App Store Connect TestFlight Payment Confirmation Refund Handling Callback URL App Review
相关文章