メインコンテンツまでスキップ

リモートチェック

Aptoide Connect の API で検証するには?

Aptoide Connect の API でトランザクションを検証するには、サーバーから当社の API にリクエストを送信する必要があります。レスポンスとして、トランザクションに関する情報を受け取り、購入が有効であることが確認されます。

クライアント

Swift クライアント

クライアントアプリで購入を完了すると、AppCoins Billing SDK が購入の署名を検証できたかどうかを示すオブジェクト VerificationResult を受け取ります。この検証が成功すると、VerificationResult.verified には、次のクラスに属する属性 purchase が含まれます。

public class Purchase: Codable {
public let uid: String
public let sku: String
public var state: String
public let orderUid: String
public let payload: String?
public let created: String
public let verification: PurchaseVerification

public class PurchaseVerification: Codable {
public let type: String
public let data: PurchaseVerificationData
public let signature: String
}

public class PurchaseVerificationData: Codable {
public let orderId: String
public let packageName: String
public let productId: String
public let purchaseTime: Int
public let purchaseToken: String
public let purchaseState: Int
public let developerPayload: String
}
}

このオブジェクトから、サーバー側で購入を検証するために必要なすべてのパラメータを抽出する必要があります。これらのパラメータは、purchase.verification.data.packageNamepurchase.verification.data.productIdpurchase.verification.data.purchaseToken です。

クライアントで関連するパラメータを取得したら、次に示すようにこの情報をサーバーに渡します。

let result = await products?.first?.purchase()

switch result {
case .success(let verificationResult):

switch verificationResult {
case .verified(let purchase):

if await verify_purchase_on_server(package_name: purchase.verification.data.packageName, product_id: purchase.verification.data.productId, purchase_token: purchase.verification.data.purchaseToken) {
// Purchase is verified!
}
}
}

サーバー側の検証を完了するには、サーバーのロジックに従って verify_purchase_on_server メソッドを実装してください。

Unity プラグインクライアント

AppCoins SDK Unity Plugin を統合したアプリケーションで購入を完了すると、次のクラスに属する属性 Purchase を含むオブジェクト PurchaseResult を受け取ります。

[Serializable]
public class PurchaseData
{
public string UID;
public string Sku;
public string State;
public string OrderUID;
public string Payload;
public string Created;
public PurchaseVerification Verification;

[Serializable]
public class PurchaseVerification
{
public string Type;
public string Signature;
public PurchaseVerificationData Data;
}

[Serializable]
public class PurchaseVerificationData
{
public string OrderId;
public string PackageName;
public string ProductId;
public int PurchaseTime;
public string PurchaseToken;
public int PurchaseState;
public string DeveloperPayload;
}
}

このオブジェクトから、サーバー側で購入を検証するために必要なすべてのパラメータを抽出する必要があります。これらのパラメータは、Purchase.Verification.Data.PackageNamePurchase.Verification.Data.ProductIdPurchase.Verification.Data.PurchaseToken です。

クライアントで関連するパラメータを取得したら、次に示すようにこの情報をサーバーに渡します。

var purchaseResponse = await AppCoinsSDK.Instance.Purchase("antifreeze");

if (purchaseResponse.State == AppCoinsSDK.PURCHASE_STATE_SUCCESS)
{

string packageName = purchaseResponse.Purchase.Verification.Data.PackageName;
string productId = purchaseResponse.Purchase.Verification.Data.ProductId;
string purchaseToken = purchaseResponse.Purchase.Verification.Data.PurchaseToken;

bool isValid = await VerifyPurchaseOnServer(packageName, productId, purchaseToken);
}

サーバー側の検証を完了するには、サーバーのロジックに従って VerifyPurchaseOnServer メソッドを実装してください。

サーバー

クライアントで取得してサーバーに渡したパラメータを使用して、次の GET リクエスト URL を構築し、当社の API を呼び出すことができます。

GET https://api.catappult.io/product/8.20191001/google/inapp/v3/applications/**packageName**/purchases/products/**productId**/tokens/**token**?platform=IOS

説明: アプリ内アイテムの購入および消費ステータスを検証するための Web サービス。

パラメータ:

  • packageName: 製品が購入されたアプリケーションのバンドル ID(例: "com.appcoins.trivialdrivesample")
  • productId: アプリ内製品の SKU(例: "gas")
  • purchaseToken: 製品が購入されたときにユーザーのデバイスに提供されたトークン。
    当社の購入トークンは常に catappult.inapp.purchase で始まります。

クエリパラメータ:

クエリパラメータ platform を追加して IOS に設定することで、これが iOS の購入であることを示す必要があります。

📘
認証は不要です

iOS の購入検証エンドポイントは認証不要です。Android の検証フローとは異なり、このリクエストで API キーや OAuth ヘッダーを送信する必要はありません。購入トークン自体がトランザクションを識別します。

以下は、このリクエストを実行する方法を複数の言語で示したスニペットです。

def validate_purchase(self, package_name: str, sku: str,
purchase_token: str, access_token: str) -> bool:

api_purchase_url = "https://api.catappult.io/product/8.20191001/google/inapp/v3/" \
"applications/{packageName}/purchases/products/{productId}/tokens/" \
"{purchaseToken}"

response = requests.get(api_purchase_url
.format(packageName=package_name, productId=sku,
purchaseToken=purchase_token),
params={'platform': 'iOS'})

if response.status_code == 200:
return True
else:
return False
private boolean validatePurchase(String packageName, String sku, 
String purchaseToken, String accessToken
) throws Exception {
String apiPurchaseUrl = String.format("https://api.catappult.io/product/8.20191001/" +
"inapp/google/v3/applications/%s/purchases/products/%s/tokens/%s",
packageName, sku, purchaseToken);

// Add the query parameter `platform=iOS` to the URL
String urlWithParams = apiPurchaseUrl + "?platform=iOS";

Request request = new Request.Builder()
.url(urlWithParams)
.build();
try (Response response = httpClient.newCall(request).execute()) {
return response.isSuccessful();
}
}
function validatePurchase($packageName, $sku, 
$purchaseToken, $accessToken) {
$curl = curl_init();
$apiPurchaseUrl =
'https://api.catappult.io/product/8.20191001/inapp/google/v3/applications/' .
$packageName . '/purchases/products/' . $sku . '/tokens/' .
$purchaseToken . '?platform=iOS';

curl_setopt($curl, CURLOPT_URL, $apiPurchaseUrl);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_NOBODY, true);
$response = curl_exec($curl);
$httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($httpcode == 200) {
return true;
} else {
return false;
}
}

レスポンス

リクエストからステータスコード 200 OK を取得した場合、購入が正常に検証されたことを意味します。

レスポンスには、トランザクションに関するさまざまな情報を提供する複数のフィールドがあります。以下は、各パラメータの説明を含むサンプルレスポンスです。

{
"resource": {
"kind": "androidpublisher#productPurchase",
"purchaseTimeMillis": long,
"purchaseState": integer,
"consumptionState": integer,
"developerPayload": string,
"orderId": string,
"acknowledgementState": integer,
"purchaseToken": string,
"productId": string,
"regionCode": string
}
}

各フィールドの説明は次のとおりです。

  • kind: productPurchase を表します。
  • purchaseTimeMillis: 製品が購入された時刻(ミリ秒単位)。
  • purchaseState: 注文の購入状態。
    可能な値は次のとおりです:
    • 0 (購入済み)
    • 1 (キャンセル済み)
  • consumptionState: アプリ内製品の消費状態。
    可能な値は次のとおりです:
    • 0 (未消費)
    • 1 (消費済み)
  • developerPayload: 注文に関する補足情報を含む、開発者が指定した文字列。
  • orderId: アプリ内製品の購入に関連付けられた注文 ID。
  • acknowledgementState: アプリ内製品の確認状態。
    可能な値は次のとおりです:
    • 0 (未確認)
    • 1 (確認済み)
  • purchaseToken: 製品が購入されたときにユーザーのデバイスに提供されたトークン。
  • productID: 購入される製品の製品 ID
  • regionCode: 購入が行われた場所のリージョンコード。