アプリの受信を確認しようとすると、常に 21002 エラー (不正な形式) が発生します。しかし、同じ php コードを使用してトランザクションの受信を確認することは問題なく機能します。
Xamarin C# (Objective-C と同じコード) の RestoreTransaction コールバックで、サンドボックス アプリの領収書を取得します。
NSUrl receiptURL = NSBundle.MainBundle.AppStoreReceiptUrl;
NSData receipt = NSData.FromUrl(receiptURL);
String receiptData = receipt.GetBase64EncodedString(NSDataBase64EncodingOptions.None);
sendToBackend(receiptData);
php:
$endpoint = 'https://sandbox.itunes.apple.com/verifyReceipt';
//$app_rec_data is receiptData from C#, it is base64 encoded
$receipt = json_encode(["receipt-data" => $app_rec_data]);
$ch = curl_init($endpoint);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $receipt);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
以前の 7.0 スタイルのトランザクション レシート:
public async void CompleteTransaction(SKPaymentTransaction transaction)
{
var receipt = transaction.TransactionReceipt.GetBase64EncodedString(NSDataBase64EncodingOptions.None);
sendToBackend(receiptData);
}
同じ php コードで、Apple は成功を返します。SO と Apple のドキュメントを 1 日中読んでいますが、すべて問題ないように見えますが、新しいアプリの領収書は常に 21002 を返します。