苹果IAP PHP对接需五步:一、客户端传base64收据至PHP;二、解码后用cURL向苹果沙盒/生产接口验证;三、解析响应校验商品ID、去重及订阅状态;四、自动切换环境(21007/21008触发重试);五、定期拉取latest_receipt_info处理续订与过期。

如果您正在开发一个iOS应用并需要在后端验证苹果应用内购买(IAP)的交易凭证,则PHP是常用的服务器端语言之一。以下是完成苹果应用内支付PHP对接的具体步骤:
客户端(iOS应用)在完成购买后,会收到一个base64编码的交易收据(receipt-data),该数据需提交至您的PHP服务器进行验证。服务器不应直接信任客户端传来的任何信息,必须通过与苹果服务器交互完成真实性校验。
1、iOS客户端调用SKPaymentQueue的transactionReceipt属性或使用StoreKit 2的Transaction.receipt获得原始收据数据。
2、将该收据数据以JSON格式POST至您的PHP接口,字段名建议为receipt_data。
立即学习“PHP免费学习笔记(深入)”;
3、PHP接口接收该字段值,并进行base64解码前的合法性检查,确保字符串仅含base64字符集且长度合理。
苹果提供两个环境对应的验证URL:沙盒环境用于测试,生产环境用于上线应用。PHP需根据收据来源自动选择对应地址,避免在生产中误用沙盒接口导致验证失败。
1、对客户端传入的receipt_data执行base64_decode(),获取原始二进制收据数据。
2、构造JSON请求体:array('receipt-data' => $decoded_receipt, 'password' => $shared_secret);其中shared_secret为App Store Connect中配置的共享密钥(仅适用于自动续期订阅)。
3、使用cURL向https://sandbox.itunes.apple.com/verifyReceipt(沙盒)或https://buy.itunes.apple.com/verifyReceipt(生产)发起POST请求,Content-Type设为application/json。
4、接收苹果返回的JSON响应,检查response['status']字段值:0表示验证成功,21007或21008表示需转向另一环境重试。
苹果返回的JSON中包含receipt、latest_receipt_info、pending_renewal_info等关键结构。PHP需逐层提取并比对业务所需字段,防止伪造响应。
1、若status为0,从response['receipt']['in_app']中提取所有订单记录,每条记录含product_id、transaction_id、original_transaction_id、purchase_date_ms等。
2、比对product_id是否属于您预设的有效商品列表,拒绝任何未注册的商品标识。
3、检查transaction_id是否已在本地数据库中标记为已处理,防止重复发货或重复扣费。
4、针对订阅类商品,读取response['latest_receipt']并保存用于后续续订验证;同时解析response['pending_renewal_info']判断用户当前订阅状态是否有效。
由于苹果未提供收据来源环境的明确标识,PHP需通过试探性验证实现沙盒/生产环境自动识别,避免人工配置错误导致线上验证失败。
1、首次使用生产URL验证,若返回status为21007(收据来自沙盒)或21008(收据来自未知环境),则立即切换至沙盒URL重试。
2、若两次验证均失败(如status=21002),说明收据数据损坏或被篡改,应拒绝该请求并记录日志。
3、将本次验证所用环境(sandbox或production)连同transaction_id一并存入数据库,供后续查询与审计使用。
苹果不会主动推送续订结果,PHP服务必须定期拉取最新收据并解析latest_receipt_info,才能准确掌握用户订阅生命周期变化。
1、当检测到response['receipt']['subscription_expires_date_ms']临近过期时,触发一次新的receipt验证请求,获取最新状态。
2、遍历response['latest_receipt_info']数组,查找purchase_date_ms晚于本地记录的最大值,确认最新一笔交易。
3、若发现auto_renew_status为0,或grace_period_expires_date_ms已过期且未恢复,应立即停用用户订阅权益。
4、对response['pending_renewal_info']中的expiration_intent字段进行判断,值为1表示用户主动取消,值为2表示账单问题,需差异化处理。
以上就是PHP如何对接苹果应用内支付_苹果应用内支付PHP对接指南【步骤】的详细内容,更多请关注php中文网其它相关文章!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号