跳到主要内容
版本: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();
double price = info.getPrice();
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 商店)进行内购或者处理异常情况下的消费掉单时,需要使用如下的两个方法进行处理。

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

查询订单数据​

// 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.XDGPendingPurchase;

import org.jetbrains.annotations.NotNull;

import java.util.List;

// ...

private void queryPendingPurchase() {
XDGPayment.queryPendingPurchase(new PaymentResultCallback<List<XDGPendingPurchase>>() {
@Override
public void onSuccess(@NotNull List<XDGPendingPurchase> purchases) {
if (purchases.isEmpty()) {
// 没有未完成的订单
return;
}
for (XDGPendingPurchase purchase : purchases) {
String productId = purchase.getProductId();
String purchaseToken = purchase.getPurchaseToken();
}
}

@Override
public void onError(@NotNull XDGError xdgError) {
// 查询失败
}
});
}

礼包码兑换或掉单补单​

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

// PaymentActivity.java

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 org.jetbrains.annotations.NotNull;

// ...

private void handlePendingPurchase() {
XDGPaymentParams params = XDGPaymentParams.newBuilder()
.setGameOrderId("game_order_id") // 订单 ID,可空,为空时 SDK 生成随机订单号
.setProductId("product_id") // 商品 ID
.setRoleId("game_role_id") // 角色 ID
.setServerId("game_server_id") // 服务器 ID
.setExt("extra_info") // 附加信息
.setPendingPurchaseToken("purchase_token") // 查询未完成订单得到的 token
.build();
XDGPayment.handlePendingPurchase(PaymentActivity.this, params, new PaymentResultCallback<Object>() {
@Override
public void onSuccess(@NotNull Object result) {
// 兑换或补单成功,发货请等待服务端回调
}

@Override
public void onError(@NotNull XDGError xdgError) {
// 兑换或补单失败
}
});
}