服务器到服务器检查 - 服务器
如何使用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.
参数:
packageName
和 productId
包含在 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": string,
"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
。
Updated 1 day ago