はじめに
- Unity で iOS のアプリ内課金をした際に、サーバーサイドでの課金内容チェックをしたメモ。
- Unity でのアプリ内課金には prime31 の iOS StoreKit In App Purchase Plugin を使用。
- サーバーサイドは PHP を使用。
Unity 側
- prime31 の iOS StoreKit In App Purchase Plugin を購入してインポート
- Asset の Plugins/StoreKit/demo/StoreKitEventListener.cs の課金成功時コールバックメソッドに、サーバーへのレシート検証リクエストのコードを追加。
void purchaseSuccessfulEvent( StoreKitTransaction transaction )
{
Debug.Log( "purchaseSuccessfulEvent: " + transaction );
string receipt = transaction.base64EncodedTransactionReceipt;
WWWForm form = new WWWForm ();
form.AddField ("receipt", receipt);
string url = "http://myserver";
StartCoroutine(this.DoWWW(new WWW(url, form), (www) => {
Debug.Log("-------- Callback Success: " + www.text);
}));
}
private delegate void WWWCallback (WWW www);
private IEnumerator DoWWW (WWW www, WWWCallback callback) {
yield return www;
bool error = false;
if (!string.IsNullOrEmpty (www.error) || string.IsNullOrEmpty (www.text)) {
error = true;
}
if (!error && callback != null)
callback (www);
}
サーバー側
<?php
$postData = json_encode(
array('receipt-data' => $_POST["receipt"])
);
$response = post("https://buy.itunes.apple.com/verifyReceipt", $postData);
if ($response->status == 21007) {
$response = post("https://sandbox.itunes.apple.com/verifyReceipt", $postData);
}
var_dump($response);
if ($response->status == 0) {
$transaction_id = $response->receipt->transaction_id;
}
private function post($endpoint_url, $postData)
{
$ch = curl_init($endpoint_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
$response = json_decode(curl_exec($ch));
curl_close($ch);
return $response;
}