V2EX 09月30日 12:07
iOS内购服务器通知处理详解
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文档旨在解答关于iOS内购服务器通知的几个关键问题,包括如何确认支付成功、退款处理流程以及生产环境与沙盒环境的切换问题。当客户端完成支付后,App Store服务器会发送包含JWT的通知到指定的生产或沙盒环境URL。文档详细解析了JWT的解密过程,并重点探讨了如何依据收到的回调来判断支付状态,以及在收到退款通知时的处理策略。同时,针对提审阶段生产环境接口切换后,TestFlight版本仍接收到沙盒通知的疑惑,提供了解决方案,以确保内购审核顺利通过。

🔑 **确认订单支付完成:** 收到App Store服务器的通知,特别是包含`signedTransactionInfo`的通知,是判断内购支付成功的关键依据。虽然收到回调通常意味着支付流程已启动,但最终的支付状态确认还需要解析`signedTransactionInfo`中的`transactionId`、`productId`等信息,并与应用内部的订单状态进行比对。仅凭回调本身并不足以完全断定支付成功,建议结合服务器端验证机制,例如使用App Store Server API来验证交易的有效性,以防止欺诈。

💸 **退款通知与处理:** 当用户发起退款时,App Store服务器同样会发送服务器通知,这通常会体现在`notificationType`字段中,例如`REFUND`或`REVOKE`。对于这些通知,开发者需要在服务器端进行相应的处理,例如标记订单为已退款,并相应地扣除用户获得的虚拟商品或服务。虽然沙盒环境可能无法完全模拟所有退款场景,但在生产环境中,退款通知会以类似支付通知的格式发送,只是`transactionReason`可能表明是退款行为。

🔄 **环境切换与审核:** 在提审阶段,将生产环境的服务器URL配置完成后,TestFlight版本仍可能指向沙盒环境,这会导致支付完成后通知发送到错误的地址。为解决此问题,建议在提审前,确保所有测试设备上的TestFlight版本已更新至最新,并且在App Store Connect中正确配置了生产环境的回调地址。对于审核人员而言,他们会使用生产环境进行测试。如果测试过程中发现服务器通知未能正确到达生产环境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 生产环境 沙盒环境 JWT signedTransactionInfo appAccountToken 内购审核
相关文章