V2EX 09月30日 11:26
iOS 内购服务器通知及退款处理详解
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文档详细介绍了App Store Connect后台开启App Store服务器通知后的配置与处理流程。当客户端完成支付后,苹果服务器会向配置的回调地址发送包含JWT签名的通知。文档重点阐述了如何解析JWT以获取订单信息,并深入探讨了支付完成的确认方式、退款的处理机制,以及在提审App过程中,生产环境与沙盒环境回调地址可能出现的冲突问题。对于首次对接iOS内购的开发者,提供了关键的指导和注意事项,旨在帮助开发者顺利完成内购功能的集成与测试。

✅ **支付完成确认**:收到苹果服务器的通知,特别是包含 `notificationType: 'ONE_TIME_CHARGE'` 且 `signedTransactionInfo` 可被成功解析,通常意味着该订单已完成支付。然而,为确保万无一失,建议结合 `transactionReason: 'PURCHASE'` 等字段进行综合判断,并与自身业务逻辑中的支付状态进行比对。纯粹收到回调不应直接等同于支付成功,后台应进一步验证交易的有效性。

💸 **退款处理机制**:订单退款时,苹果服务器同样会发送服务器通知,通知类型可能为 `REFUND` 或 `REVOKE` 等。开发者需要在回调接口中处理这些特定类型的通知,并据此更新订单状态,例如将已退款的订单标记为无效或已取消。虽然沙盒环境可能无法直接测试内购退款流程,但上线后,退款通知的机制与正常支付通知类似,会发送至配置的生产环境服务器 URL。

🔄 **环境切换与提审问题**:在提审App时,将生产环境服务器 URL(如 `https://prod.xxx.com/iapNotify`)配置到App Store Connect后台后,苹果在审核内购时,理论上应向生产环境发送通知。如果TestFlight版本仍向沙盒环境发送通知,这可能表明App Store Connect中的配置未完全生效,或TestFlight版本与App Store Connect后台配置存在不同步。通常,审核人员在审核时会使用生产环境进行测试。为避免订单标识对不上,确保App Store Connect后台的生产环境URL配置正确且已生效至关重要,一旦配置更新,苹果应会使用新的生产环境URL。若依然出现问题,可能需要联系Apple Developer Support进行排查。

现在是在 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服务器通知 JWT解析 退款处理 TestFlight 生产环境 沙盒环境 应用提审 回调地址 appAccountToken transactionId signedTransactionInfo notificationType iOS In-App Purchase App Store Server Notifications JWT Parsing Refund Handling Production Environment Sandbox Environment App Submission Callback URL
相关文章