接收 Apple 回调
WARNING
Apple 的实现由 AI 生成并经人工审核,但由于测试资源限制,尚未经过实际测试,请在充分验证后再用于生产环境。
| 方法名 | 参数 | 返回值 |
|---|---|---|
| callback | 无/array/ServerRequestInterface | Collection |
例子
php
Pay::config($this->config);
// 是的,你没有看错,就是这么简单!
$result = Pay::apple()->callback();参数
第一个参数
null
如果您没有传参,或传 null,则 yansongda/pay 会自动识别请求并处理,通过 Collection 实例返回 App Store Server Notifications V2 通知参数
WARNING
建议仅在 php-fpm 下使用,swoole 方式请使用 ServerRequestInterface 参数传递方式
ServerRequestInterface
推荐在 swoole 环境下传递此参数,传递此参数后,yansongda/pay 会自动进行后续处理
array
也可以自行解析请求参数(如 ['signedPayload' => '...']),传递一个 array 会自动进行后续处理
通知类型
回调通知为 App Store Server Notifications V2(body 为 {"signedPayload": "<JWS>"}),验签解码后可通过 notificationType 字段区分通知类型,常见类型如下:
REFUND:退款REFUND_DECLINED:退款被拒绝CONSUMPTION_REQUEST:消费请求SUBSCRIBED:订阅成功DID_CHANGE_RENEWAL_STATUS:续订状态变更EXPIRED:订阅过期REVOKED:订阅被撤销
更多类型与字段说明请参考 官方文档。
幂等处理
通知可能重复投递,建议业务层以 notificationUUID 为主键做幂等去重(SDK 原样返回该字段,不做持久化)。
归属校验
验签通过后,SDK 会自动进行归属校验(对齐 Apple 官方库行为,防「真实 Apple 签名但错误归属」的伪造通知):
- 若配置了
bundle_id,则通知内的bundleId必须与之一致,否则抛出验签异常 - 通知内的
environment必须与mode匹配(PayMode::SANDBOX对应Sandbox,PayMode::NORMAL/PayMode::SERVICE对应Production),否则抛出验签异常;TestFlight(Xcode)与本地 StoreKit 测试(LocalTesting)的通知会被拒绝
未配置 App Store Server API 四件套(issuer_id 等)的租户会跳过 bundleId 校验,但 environment 校验始终执行。
确认回调
php
Pay::config($this->config);
return Pay::apple()->success();