苹果内购沙盒验证失败需检查收据地址、密钥及环境标识:一、创建沙盒测试员账户;二、配置App内购买项目;三、启用App Store服务器通知并获取.p8密钥;四、PHP使用sandbox.itunes.apple.com接口验证收据;五、真机运行开发签名App并登录沙盒账号。

如果您正在为 iOS 应用集成苹果内购(IAP),但服务器端 PHP 无法正确验证沙盒环境的收据,则可能是由于收据提交地址、密钥配置或环境标识错误导致。以下是完成苹果支付 PHP 沙盒环境配置的具体步骤:
一、在 App Store Connect 中创建并管理沙盒 Apple 账户
沙盒账户是专用于测试内购流程的独立账号,不与真实 Apple ID 关联,且仅可在开发签名的 App 中使用。必须由具备“账户持有人”“管理”“App 管理”或“开发者”职能的人员操作。
1、登录 https://appstoreconnect.apple.com,进入“用户和访问”页面。
2、在左侧边栏中点击“沙盒”下方的“测试员”,再点击右上角“+”按钮。
立即学习“PHP免费学习笔记(深入)”;
3、填写测试员邮箱(需为未注册过 Apple ID 的新邮箱)、姓名、国家/地区,设置密码后提交。
4、确认该邮箱已收到激活邮件并完成激活,该账户即创建成功。
二、配置 App 内购买项目(In-App Purchase)
每个商品必须在 App Store Connect 中明确定义,包括唯一 product ID、类型(消耗型/非消耗型/订阅型)及定价等级。沙盒环境仅识别此处配置的商品 ID。
1、在 App Store Connect 中进入目标 App 页面,点击“App 内购买项目”。
2、点击左上角“+”按钮,选择商品类型,填写描述、本地化名称、价格等级(沙盒环境支持全部定价等级,无需实际扣款)。
3、设置唯一的 Product ID(如 com.example.app.coin100),确保与客户端代码中请求的 ID 完全一致。
4、保存并提交审核状态(沙盒测试无需等待审核通过,保存后即可在开发版 App 中调用)。
三、启用并配置 App Store 服务器通知(Server-to-Server Notifications)
该配置使苹果能主动向您的 PHP 服务端推送交易状态变更(如购买成功、续订、退款),是实现自动发货与状态同步的关键环节。
1、在 App Store Connect 中进入 App 页面,点击“App Store 服务器通知”。
2、点击“配置”按钮,选择“沙盒环境”作为当前配置目标。
3、输入您的 PHP 接收接口 URL(如 https://api.yourdomain.com/apple/webhook/sandbox),确保该地址支持 HTTPS 且可公网访问。
4、生成并下载密钥文件(.p8),同时记录 Issuer ID 和 Key ID,后续 PHP 验证收据时必需使用。
四、PHP 后端配置沙盒收据验证逻辑
苹果沙盒收据必须提交至沙盒验证接口,不可混用生产环境地址;PHP 需根据 receipt-data 字段内容动态选择验证端点,并携带共享密钥(Shared Secret)或 JWT 认证凭证。
1、将下载的 .p8 私钥文件安全存放于服务器可读路径(如 /var/www/config/AuthKey_XXXXXX.p8)。
2、在 PHP 中使用 https://sandbox.itunes.apple.com/verifyReceipt 作为沙盒验证 URL。
3、构造 JSON 请求体,包含 receipt-data(Base64 编码的原始收据字符串)与 password(若配置了 Shared Secret)或使用 JWT 签名头(推荐)。
4、发起 POST 请求,检查响应中 status 字段是否为 0;若返回 21007,则说明误将沙盒收据发往生产接口,需立即修正 URL。
五、设备与 App 运行环境准备
沙盒测试严格依赖真机运行环境与开发签名配置,模拟器和发布版 App 均无法触发沙盒流程。
1、确保测试设备已开启“开发者模式”:设置 → 隐私与安全性 → 开发者模式 → 启用。
2、Xcode 中构建并安装开发签名版本(Development Signing)的 App 至真机,禁止使用 Ad Hoc 或 App Store 分发证书。
3、在设备“设置 → Apple ID”中退出所有正式 Apple ID,然后在 App 内首次触发购买时,系统将自动提示登录沙盒账户。
4、登录所创建的沙盒 Apple ID,完成购买流程;此时 PHP 接口应接收到沙盒收据并完成验证。











