You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel集成iOS内购服务器通知:无法获取GRACE_PERIOD相关通知

解决iOS内购宽限期通知(DID_FAIL_TO_RENEW + GRACE_PERIOD)接收问题

1. 确认宽限期生效前提

  • 只有自动续期订阅的首次续费失败才会触发宽限期,后续多次续费失败不会进入宽限期,而是直接到期。先确认你的订阅属于自动续期类型,且测试场景是首次续费失败。
  • 检查App Store Connect的订阅设置:确保是针对当前测试的订阅产品开启宽限期,路径为「App Store Connect → 你的App → 订阅 → 对应订阅组 → 订阅产品 → 订阅设置 → 宽限期」,确认已开启并设置了有效时长(如6天)。

2. 修正测试场景

沙盒环境的自动续期循环会快速触发多次DID_RENEW,但无法模拟真实的续费失败场景。正确测试步骤:

  • 在沙盒购买自动续期订阅,等待订阅接近到期(沙盒周期短,如1分钟)。
  • 提前将测试账号的支付方式设置为无效(沙盒测试账号管理中选择「无」或模拟支付失败)。
  • 等待订阅到期,此时应触发DID_FAIL_TO_RENEW且subtype为GRACE_PERIOD的通知,而非多次DID_RENEW后直接进入EXPIRED。

3. 排查Laravel端接收逻辑

  • 检查Webhook路由是否误过滤了DID_FAIL_TO_RENEW类型的请求,比如是否存在类似if ($notificationType !== 'DID_RENEW') return;的代码,导致目标通知被丢弃。
  • 查看Laravel日志(storage/logs/laravel.log),确认是否有DID_FAIL_TO_RENEW类型的请求被接收但处理出错,或根本未收到该请求:
    • 若日志无记录:问题在Apple通知发送环节;
    • 若有记录但未处理:检查代码逻辑是否忽略了subtype为GRACE_PERIOD的情况。
  • 验证Webhook签名逻辑,确认签名验证未误判DID_FAIL_TO_RENEW类型的通知,避免因签名失败导致请求被拒绝。

4. 确认Apple通知状态

  • Apple通知可能存在延迟,测试后等待10-15分钟再检查日志。
  • 在App Store Connect的「Webhook」页面(路径:App Store Connect → 你的App → 更多 → Webhook)查看发送记录,若存在HTTP 4xx/5xx错误,说明服务器返回异常,Apple会重试,但多次失败后可能停止发送,需修复服务器响应逻辑。

5. 代码调试建议

在Webhook控制器中添加全量日志,记录所有接收的通知内容,明确是否收到目标通知:

public function handleIosNotification(Request $request)
{
    $payload = $request->all();
    Log::info('iOS IAP Notification Received', [
        'notificationType' => $payload['notification_type'] ?? 'unknown',
        'subtype' => $payload['subtype'] ?? 'none',
        'fullPayload' => $payload
    ]);
    // 后续业务处理逻辑
}

内容的提问来源于stack exchange,提问作者Zain ul Abdeen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 01:20:09