PHP怎么验证苹果支付收据_苹果支付收据PHP验证技巧【教程】

23次阅读

苹果收据验证需区分沙盒与生产环境,通过官方接口curl安全请求、第三方SDK、本地签名验证及订阅收据链解析五种方式综合校验有效性与真实性。

PHP怎么验证苹果支付收据_苹果支付收据PHP验证技巧【教程】

如果您在php后端接收到苹果应用内购买的收据数据,但无法确认其有效性与真实性,则可能是由于未正确调用苹果验证接口或未处理沙盒/生产环境切换逻辑。以下是验证苹果支付收据的多种方法:

一、使用苹果官方验证接口(基础http请求方式)

苹果提供两个验证端点:沙盒环境用于测试,生产环境用于正式发布。需根据收据内容自动识别并选择对应URL,避免硬编码导致验证失败。

1、提取收据数据中的base64编码字符串,确保未被截断或添加额外空格。

2、构造jsON请求体:{“receipt-data”: “原始base64字符串“, “password“: “共享密钥(仅适用于自动续订订阅)“}

立即学习PHP免费学习笔记(深入)”;

3、向https://sandbox.itunes.apple.com/verifyReceipt发起POST请求;若返回status为21007,则改用https://buy.itunes.apple.com/verifyReceipt重试。

4、检查响应中status字段值:21000表示格式错误,21002表示收据数据损坏,21003表示签名无效,21004表示共享密钥不匹配,21005表示apple服务器不可用,21006表示收据有效但已过期(仅限旧版收据),21008表示收据来自沙盒但提交至生产环境

二、使用cURL配合ssl证书校验(增强安全性)

直接使用file_get_contents可能忽略SSL证书验证,存在中间人攻击风险。通过cURL显式设置CURLOPT_SSL_VERIFYPEER和CURLOPT_CaiNFO可提升通信安全性。

1、下载最新apple根证书(AppleIncRootCertificate.cer)并转换为PEM格式。

2、初始化cURL句柄,设置CURLOPT_URL为目标验证地址,CURLOPT_POST为true,CURLOPT_POSTFIELDS为json数据。

3、启用SSL验证:CURLOPT_SSL_VERIFYPEER设为true,CURLOPT_CAINFO指向本地PEM证书路径

4、执行请求并捕获响应,使用json_decode解析结果,检查receipt属性是否存在且包含in_app数组。

三、引入第三方SDK(如joshcam/php-apple-receipt-validator)

该库封装了环境自动检测、重试机制及常见status码映射,减少手动处理逻辑出错概率。

1、通过composer安装:composer require joshcam/apple-receipt-validator

PHP怎么验证苹果支付收据_苹果支付收据PHP验证技巧【教程】

Studio Global

Studio Global AI 是一个内容生成工具,帮助用户客制化生成风格和内容,以合理价格提供无限生成,希望将 AI 带给全世界所有人。

PHP怎么验证苹果支付收据_苹果支付收据PHP验证技巧【教程】 405

查看详情 PHP怎么验证苹果支付收据_苹果支付收据PHP验证技巧【教程】

2、实例化Validator类,并传入base64收据字符串与共享密钥(如有)。

3、调用validate()方法,返回对象包含isValid()布尔值、getLatestReceiptInfo()获取最新交易记录、getEnvironment()返回’development’或’production’

4、检查getLatestReceiptInfo()中expires_date_ms是否大于当前时间戳,确认订阅未过期。

四、本地收据解析与签名验证(离线辅助手段)

苹果收据本质是PKCS#7签名容器,可使用OpenSSL命令或PHP openssl_pkcs7_verify函数进行本地签名验证,作为网络验证失败时的辅助判断依据。

1、将base64收据解码后保存为.der文件。

2、执行命令openssl pkcs7 -inform DER -in receipt.der -print -noout,确认输出含signer info及certificate sections。

3、在PHP中调用openssl_pkcs7_verify(),指定临时文件路径与CA证书路径,返回true表示签名由Apple证书链签发且未篡改

4、注意此方法无法验证交易状态或过期时间,仅能确认收据来源可信性。

五、处理自动续订订阅的最新收据链(多层嵌套验证)

对于ios 11+的订阅收据,latest_receipt字段包含完整收据链base64,latest_receipt_info数组按时间倒序排列所有历史交易,需逐条比对product_id与original_transaction_id。

1、解析response中latest_receipt_info数组,取第一条记录作为最新有效交易。

2、比对product_id是否与预期商品标识一致,original_transaction_id必须与首次购买时返回值完全相同

3、计算expires_date_ms与当前毫秒时间戳差值,若小于0则视为已过期。

4、检查cancellation_date_ms字段是否存在,若存在则说明用户已主动取消,但当前周期仍有效直至expires_date_ms。

以上就是PHP怎么验证

text=ZqhQzanResources