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

远程验证

如何使用 Aptoide Connect 的 API 进行验证?

要使用 Aptoide Connect 的 API 验证交易,您需要从您的服务器向我们的 API 发送请求。作为响应,您将收到有关该交易的信息,确认购买有效。

客户端

Swift 客户端

在您的客户端应用中完成购买后,您将收到一个 VerificationResult 对象,它指示 AppCoins Billing SDK 是否能够验证购买的签名。如果此验证成功,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 的应用程序中完成购买后,您将收到一个 PurchaseResult 对象,它包含一个属性 Purchase,该属性属于以下类:

[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:购买商品的应用程序的 bundle 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:进行购买的地点的地区代码。