服务器到服务器检查 - 服务器

如何使用Catappult的API进行验证?

为了用Catappult的API验证交易,您需要从您的服务器向我们的API发送请求。 作为响应,您将收到有关交易的信息。收到此响应意味着此笔购买是有效的。

收据

在客户端应用中完成购买后,您将收到如下所示的收据。 这将是您调用我们的API的信息来源。

{
  "Store": "storeName",
  "TransactionID": "anIdWithNumbersAndLetters",
  "Payload": {
    "ItemType": "inapp",
    "ProductId": "full_trajectory",
    "GameOrderId": "anIdWithNumbersAndLetters",
    "OrderQueryToken": "aLargeIdWithNumbersAndLetters",
    "StorePurchaseJsonString": {
      "developerPayload": "unity://unity3d.comcpOrderId=anIdWithNumbersAndLetters&payload=",
      "itemType": "inapp",
      "orderId": "catappult.inapp.purchase.anIdWithNumbersAndLetters",
      "originalJson": {
        "orderId ": "anIdWithNumbersAndLetters",
        "packageName": "your.package.name",
        "productId ": "yourSKU",
        "purchaseTime": 123456789,
        "purchaseToken": "catappult.inapp.purchase.anIdWithNumbersAndLetters",
        "purchaseState": 0,
        "developerPayload":"unity://unity3d.com?cpOrderId=anIdWithNumbersAndLetters&payload="
      }
    }
  }
}

API 请求 URL

从该收据中,您可以检索必要的信息,使用以下GET请求的 URL 作为参数来调用我们的API:

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

说明: Web service to validate the purchase and consumption status of an in-app item.

参数:

packageNameproductId 包含在 originalJson 字段内。 可以从originalJson字段或 StorePurchaseJsonString(名称为orderId)中获得purchaseToken

  • packageName 购买产品时使用的应用程序的包名(例如 “com.appcoins.trivialdrivesample”)
  • productId 应用内产品的 SKU(例如,“gas”)
  • purchaseToken 购买产品时提供给用户设备的令牌。

以下是一些用几种语言编写的如何执行此请求的代码片段:

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))
 
    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);
    HttpGet request = new HttpGet(apiPurchaseUrl);

    Request request = new Request.Builder()
                .url(apiPurchaseUrl)
                .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

    curl_setopt($ch, CURLOPT_URL, $apiPurchaseUrl);
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_NOBODY, true);
    $response = curl_exec($ch);
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    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:购买完成时所在地点的地区代码。

订阅

验证订阅遵循完全相同的逻辑,仅对URL端点进行了很微小的更改。

GET https://api.catappult.io/product/8.20191001/google/inapp/v3/applications/**packageName**/purchases/subscriptions/**productId**/tokens/**token**

URL的唯一的区别是:用subscriptions代替了purchases