跳到主要内容
版本:v7

开发指南

查询商品信息

通过该接口可以查询 Apple Store/Google Play/Steam/XDSDK 网页等各平台的商品信息,游戏可以通过这些信息来展示给用户。注意传入的 productId 参数需要和各平台后台配置的商品 ID 保持一致。

// PaymentActivity.java

import com.xd.sdk.common.base.XDGError;
import com.xd.sdk.payment.XDGPayment;
import com.xd.sdk.payment.callback.PaymentResultCallback;
import com.xd.sdk.payment.entities.XDGProductInfo;


import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
import java.util.List;

// ...

private void queryProducts() {
// 当 XDConfig.json 配置的 regionType 为 Global 且初始化参数指定的 packageType 为 PackageType.GooglePlay 时查询的是 Google 的商品;
// 其他情况查询的是在平台配置的商品
List<String> productIdList = new ArrayList<>();
productIdList.add("product_id_1");
XDGPayment.queryWithProductIds(productIdList, new PaymentResultCallback<List<XDGProductInfo>>() {
@Override
public void onSuccess(@NotNull List<XDGProductInfo> xdgProductInfos) {
if (xdgProductInfos.isEmpty()) {
// 查询商品为空
} else {
// 查询成功
for (XDGProductInfo info : xdgProductInfos) {
String productId = info.getProductId();
String displayPrice = info.getDisplayPrice();
String title = info.getTitle();
String description = info.getDescription();
}
}
}

@Override
public void onError(@NotNull XDGError xdgError) {

}
});
}

发起支付

  • SDK 会根据初始化时的信息来自动决定使用哪个支付渠道进行支付。
  • 游戏传入的支付参数会在支付完成时通过 s2s 的形式透传回游戏的服务器以便游戏进行校验和发货。
  • 支付参数中的数量字段只支持苹果支付,Google Pay 的批量支付请参考Google Pay 接入指引,其他渠道不支持批量购买。
  • SDK 的支付成功回调请看作支付完成,具体支付是否成功请以服务端推送数据为准。
  • 由于 Apple 支付票据有概率会出现多票据合并的情况,此时会丢失游戏传入的 orderId,并由平台随机生成一个唯一的 orderId
// PaymentActivity.java

import android.util.Log;

import com.xd.sdk.common.base.XDGError;
import com.xd.sdk.payment.XDGPayment;
import com.xd.sdk.payment.api.XDGPaymentParams;
import com.xd.sdk.payment.callback.PaymentResultCallback;
import com.xd.sdk.payment.entities.XDGOrderInfo;

import org.jetbrains.annotations.NotNull;

// ...

private void payWithParams() {
// 当 XDConfig.json 配置的 regionType 为 CN 发起的是国内支付宝&微信支付;
// regionType 为 Global 时:
// - 初始化参数指定的 packageType 为 PackageType.GooglePlay 时发起的是 Google 结算库购买
// - 其他,发起网页支付
XDGPaymentParams params = XDGPaymentParams.newBuilder()
.setGameOrderId("game_order_id") // 订单 ID
.setProductId("product_id") // 商品 ID
.setRoleId("game_role_id") // 角色 ID
.setServerId("game_server_id") // 服务器 ID
.setExt("extra_info") // 附加信息
.build();
XDGPayment.payWithParams(PaymentActivity.this, params, new PaymentResultCallback<XDGOrderInfo>() {
@Override
public void onSuccess(@NotNull XDGOrderInfo xdgOrderInfo) {
// 支付成功
Log.i("PaymentActivity", "支付订单数据: " + xdgOrderInfo);
}

@Override
public void onError(@NotNull XDGError xdgError) {
// 支付失败
int code = xdgError.getCode();
String message = xdgError.getMessage();
}
});
}

应用外购买或掉单

当游戏需要支持 Apple 提供的商店兑换码(暂不支持 Google 商店)进行内购或者处理异常情况下的消费掉单时,需要使用如下的两个方法进行处理。

首先使用【查询接口】获取当前已知的兑换码订单或者掉单数据,游戏需要通过返回结果内的数据来和玩家确认商品信息和发放角色,然后使用【兑换或补单接口】进行订单确认和消费。

查询订单数据

[XDGPayment queryPendingPurchases:^(NSArray<XDGPendingPurchase *> * _Nonnull result) {
for (XDGPendingPurchase *purchase in result) {
NSString *productId = purchase.productId; // 商品ID
NSString *purchaseToken = purchase.pendingPurchaseToken; // 订单标识符
}
}];

礼包码兑换或掉单补单

在上述方法中返回的未完成订单,游戏可传入对应的参数进行 Apple/Google 的商品消费确认以保证用户购买的商品正常使用。

XDGPaymentParams *params = [XDGPaymentParams new];
params.gameOrderId = @"可选,游戏侧订单号,不填会自动生成随机订单号";
params.productId = @"必须,在苹果后台配置的商品 ID";
params.roleId = @"必须,角色 ID";
params.serverId = @"必须,服务器 ID";
params.extra = @"可选,透传参数";
params.quantity = 1;
params.pendingPurchaseToken = @"未完成订单标识符,从查询未完成订单接口获取";
[XDGPayment handlePendingPurchase:params completionHandler:^(XDGOrderInfo * _Nullable orderInfo, NSError * _Nullable error) {
if (error) {
// 兑换或补单失败
} else {
// 兑换或补单成功
}
}];