App 内购买项目允许顾客通过访问 App Store 购买 App 中的内容、功能或服务,并安全处理来自用户的付款。本文主要记录IAP数据处理的一些主要逻辑和官方文档概要,会持续完善。
自动续订服务端通知
App Store Server-to-Server Notifications 官方文档
通知类型 文档通知类型的值(notification_type)CANCEL表示Apple客户支持取消了订阅或用户升级了订阅。 cancel_date键包含更改的日期和时间。
DID_CHANGE_RENEWAL_PREF指示客户对其订购计划进行了更改,该更改在下一次续订时生效。 当前有效的计划不受影响。
DID_CHANGE_RENEWAL_STATUS指示订阅续订状态的更改。 在JSON响应中,检查auto_renew_status_change_date_ms以了解上一次状态更新的日期和时间。 检查auto_renew_status以了解当前的续订状态。
DID_FAIL_TO_RENEW表示由于计费问题而无法续订的订阅。 检查is_in_billing_retry_period以了解订阅的当前重试状态。 如果订阅处于计费宽限期内,请检查grace_period_expires_date以了解新服务的到期日期。
DID_RECOVER表示成功的自动更新已过期的订阅,而该订阅过去无法更新。 检查expires_date,以确定下一个续订日期和时间。
DID_RENEW表示客户的订阅已成功自动续订了新的交易期。
INITIAL_BUY在用户最初购买订阅时发生。 通过在App Store上对其进行身份验证,可以将Latest_receipt作为令牌存储在服务器上,以随时验证用户的订阅状态。
INTERACTIVE_RENEWALI表示客户使用您的应用程序界面或在“帐户订阅设置”中的App Store上以交互方式续订了订阅。 立即提供服务。
PRICE_INCREASE_CONSENT表示App Store已开始要求客户同意您的应用的订阅价格上涨。 在Unified_receipt.Pending_renewal_info对象中,price_consent_status值为0,表示App Store正在征求客户的同意,但尚未收到。 除非用户同意新价格,否则订阅不会自动续订。 当客户同意提价时,系统将price_consent_status设置为1。使用verifyReceipt检查收货以查看更新的价格同意状态。
REFUND表示App Store已成功退款交易。 cancel_date_ms包含已退款交易的时间戳。 original_transaction_id和product_id标识原始交易和产品。 cancel_reason包含原因。
RENEWAL (DEPRECATED IN SANDBOX)表示成功的自动更新已过期的订阅,而该订阅过去无法更新。 检查expires_date,以确定下一个续订日期和时间。 此通知在沙盒环境中已弃用,计划于2021年3月在生产中弃用。更新现有代码以改为依赖DID_RECOVER通知类型。
处理通知事件
订阅或应用内购买活动
触发通知类型
客户完成了对订阅的初次购买
INITIAL_BUY
订阅处于活动状态; 用户升级到另一个SKU
CANCEL, DID_CHANGE_RENEWAL_STATUS, INTERACTIVE_RENEWAL
订阅处于活动状态; 用户降级到另一个SKU
DID_CHANGE_RENEWAL_PREF
订阅已过期; 用户重新订阅了相同的SKU
DID_CHANGE_RENEWAL_STATUS
订阅已过期; 用户重新订阅了另一个SKU(升级或降级)
INTERACTIVE_RENEWAL, DID_CHANGE_RENEWAL_STATUS
用户在App Store帐户的“订阅”设置中禁用了自动续订的订阅,从而有效地取消了订阅
DID_CHANGE_RENEWAL_STATUS
AppleCare退还了订阅
CANCEL, DID_CHANGE_RENEWAL_STATUS
由于结算问题,订阅无法续订
DID_FAIL_TO_RENEW
App Store通过计费重试恢复了已过期的订阅
DID_RECOVER
失败的帐单重试尝试后,订阅流失
DID_CHANGE_RENEWAL_STATUS
AppleCare成功退还了有关消耗性,非消耗性或非续订订阅的交易
REFUND
您已经提高了订阅价格,并且客户必须同意涨价后才能自动续订订阅
PRICE_INCREASE_CONSENT
订阅成功自动续订
DID_RENEW
使用沙盒测试通知事件沙箱中提供以下通知类型:INITIAL_BUY,DID_CHANGE_RENEWAL_PREF,DID_CHANGE_RENEWAL_STATUS,DID_RENEW和INTERACTIVE_RENEWAL。
有关测试应用内购买的更多信息,请参阅使用沙盒测试应用内购买。
Receipt验证数据解析当完成支付或更新订单状态后,从沙箱中读取到支付凭证(Receipt)
[[NSBundle mainBundle] appStoreReceiptURL]
将receipte数据使用base64编码字符串,和共享秘钥一起,拼接成json。使用POST请求向Apple服务器获取验证数据。
1234{ "receipt-data" : "BASE64 RECEIPT", "password" : "SHARED KEY"}
向Apple服务器验证receipt沙箱验证地址https://sandbox.itunes.apple.com/verifyReceipt正式验证地址https://buy.itunes.apple.com/verifyReceipt