PHP怎么处理苹果支付状态变更_苹果支付状态变更PHP处理步骤【指南】

2次阅读

苹果 支付状态变更需五步处理:一、用 php://input 解析jsON;二、验证 signingCertURL 证书及 signature;三、用 sharedSecret 和 IV 解密 AES-GCM 加密的 data;四、依 status 更新订单并保证事务原子性;五、5 秒内返回空http 200 响应。

PHP 怎么处理苹果支付状态变更_苹果支付状态变更 PHP 处理步骤【指南】

苹果 支付(apple Pay)完成交易后,服务器会收到状态变更通知,PHP 需要正确验证并处理这些通知。以下是处理苹果支付状态变更的具体步骤:

一、接收并解析苹果支付回调请求

苹果支付通过 https POST 方式向您的服务器发送状态变更通知,内容为json 格式的原始数据,需读取原始输入流并解码。

1、使用php://input 获取原始 POST 数据,避免因 Content-Type 非application/x-www-form-urlencoded 导致 $_POST 为空。

2、调用 json_decode(file_get_contents(‘php://input’), true) 将 JSON字符串 转为 关联数组

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

3、检查是否成功解码,若返回 NULL 则说明 JSON 格式错误或为空,此时应立即返回 HTTP 400状态码

二、验证苹果签名与证书链

苹果在通知中附带 signingCertURL、signature、notificationType 和 data 字段,需下载证书、验证签名以确保通知真实来自 apple 服务器。

1、从 signingCertURL 下载证书内容,使用 file_get_contents 获取 PEM 格式证书字符串。

2、使用 openssl_x509_read()加载证书,并用 openssl_x509_parse()提取公钥信息。

3、拼接 data 字段与 notificationType 字段(按字典序排序后拼接),使用 openssl_verify()验证 signature 是否匹配该数据与证书公钥。

4、若签名验证失败,必须拒绝该通知并返回 HTTP 401状态码

三、解密加密的 data 字段

苹果将敏感业务数据(如 transactionId、status 等)使用 AES-GCM 加密后放入 data 字段,需使用通知中提供的 sharedSecret 及 IV 进行解密。

1、从通知中提取 data、version、transactionId、bundleId 字段,并确认 version 为 ”EC_v1″。

2、从 环境配置 中读取与 App ID 绑定的 sharedSecret(即 App Store Connect 中配置的密钥)。

3、对 data 字段进行 Base64 解码,分离出 nonce(前 12字节 )、authTag(后 16 字节)和 ciphertext(中间部分)。

4、使用 openssl_decrypt()配合 aes-128-gcm算法、sharedSecret 作为 key、nonce 作为 iv 进行解密,传入 authTag 用于完整性校验。

5、解密失败时不得记录任何敏感字段,且必须返回 HTTP 400

四、解析解密后的业务数据并更新订单状态

解密后获得标准 JSON 结构,包含 transactionId、originalTransactionId、productId、status、purchaseDate 等关键字段,用于匹配本地订单并更新状态。

1、根据 transactionId 或 originalTransactionId 查询本地订单记录,优先使用 originalTransactionId 匹配订阅续订场景

2、校验 productId 是否与订单预期一致,防止越权篡改商品标识。

3、依据 status 字段值执行对应操作:状态为 0 表示购买成功,1 表示取消,2 表示 退款 ,3 表示 退款 已恢复,5 表示订阅过期。

4、对 status 为 0 的订单,更新 数据库 中订单状态为“已支付”,并记录 purchaseDate 与 expiresDate(若存在)。

5、所有状态变更操作必须在数据库事务中完成,确保原子性

五、向苹果服务器返回确认响应

苹果要求在收到通知后 5 秒内返回 HTTP 200 响应,且响应体必须为空,否则视为未确认,将在后续重发通知。

1、在完成全部验证与业务处理逻辑后,调用 http_response_code(200)设置状态码。

2、清除所有输出缓冲区,使用 ob_end_clean()防止意外输出干扰响应。

3、直接调用 exit 或 return 终止脚本执行,禁止输出任何字符(包括空格、bom、换行)

4、记录日志时仅写入文件或远程服务,不得使用echoprint、var_dump 等输出函数。

以上就是 PHP 怎么处理

站长
版权声明:本站原创文章,由 站长 2025-12-23发表,共计1883字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
1a44ec70fbfb7ca70432d56d3e5ef742
text=ZqhQzanResources