对于 iOS7,您无需向服务器发送 SKPaymentTransaction 的 transactionReceipt,而是发送应用收据(在 base64 编码后,就像您使用 transactionReceipt 一样)。
您可以尝试在此answer 中运行实现,以查看如何发送它并查看您从 App Store 返回的 JSON 响应的结构。
JSON 响应有一个 latest_receipt_info 字段,其中包含用户进行的应用内购买的列表以及有关其到期的信息,例如:
"latest_receipt_info":({
"数量":"1",
"product_id":"com.example.subscription_30",
"transaction_id":"1000000097606958",
"original_transaction_id":"1000000097606821",
"purchase_date":"2014-01-01 13:22:25 等/格林威治标准时间",
"purchase_date_ms":"1388582545000",
"purchase_date_pst":"2014-01-01 05:22:25 America/Los_Angeles",
"original_purchase_date":"2014-01-01 11:10:40 Etc/GMT",
"original_purchase_date_ms":"1388574640000",
"original_purchase_date_pst":"2014-01-01 03:10:40 America/Los_Angeles",
"expires_date":"2014-01-01 11:14:35 等/格林威治标准时间",
"expires_date_ms":"1388574875000",
"expires_date_pst":"2014-01-01 03:14:35 America/Los_Angeles",
"web_order_line_item_id":"1000000027707568"},
...)
JSON 响应还包括一个 latest_receipt 字段,其中包含您可以存储在服务器上并发送到 Apple 验证服务器的收据(base64 编码),就像您使用存储的 iOS6 收据一样。
您似乎需要手动计算是否有任何有效订阅。也许是这样的(未经测试):
$desired_product_identifier = <identifier of your in-app purchase>;
$response = <JSON response you get from Apple verification server>;
$receipt = json_decode($response);
$latest_expiration_interval_since_1970 = 0;
for ($receipt_info in $receipt['latest_receipt_info']) {
if ($receipt_info['product_id'] != $desired_product_identifier)
continue;
$expiration_interval_since_1970 = intval(doubleval($receipt_info['expires_date_ms']) / 1000.0);
if ($expiration_interval_since_1970 > $latest_expiration_interval_since_1970) {
$latest_expiration_interval_since_1970 = $expiration_interval_since_1970;
}
}
$is_subscription_active = ($latest_expiration_interval_since_1970 > time());
如果这不起作用并且您需要为 iOS7 执行本地应用收据验证,您可以查看我的 github library 以获得自动更新订阅或 RMStore。希望这会有所帮助!