合作咨询
我们的专家服务团队将竭诚为您提供专业的合作咨询服务
Qualifier and Type | Interface Name and Description |
|---|---|
interface | 定义商品类型。 |
Qualifier and Type | Method Name and Description |
|---|---|
consumeOwnedPurchase(ConsumeOwnedPurchaseReq consumeOwnedPurchaseReq) 在消耗型商品支付成功后,应用需要在发放商品成功之后调用此接口对消耗型商品执行消耗操作。 | |
createPurchaseIntent(PurchaseIntentReq purchaseIntentReq) 创建PMS托管商品订单接口,支持购买消耗型商品、非消耗型商品和订阅型商品。 | |
createPurchaseIntentWithPrice(PurchaseIntentWithPriceReq purchaseIntentWithPriceReq) 创建非PMS商品订单接口,支持购买消耗型商品、非消耗型商品,不支持订阅型商品。 注意 该接口已废弃,建议开发者替换成createPurchaseIntent接口。 | |
void | 使能延迟付款型支付。 |
| 查询用户登录的帐号服务地是否在华为IAP支付服务支持结算的国家/地区中。 | |
isSandboxActivated(IsSandboxActivatedReq isSandboxActivatedReq) 判断当前设备登录的华为帐号及应用的APK版本是否满足沙盒条件。 | |
obtainOwnedPurchaseRecord(OwnedPurchasesReq ownedPurchasesReq) 用于获取消耗型商品的历史消耗商品信息或订阅型商品的所有订阅收据。 | |
obtainOwnedPurchases(OwnedPurchasesReq ownedPurchasesReq) 查询用户已订购商品的购买数据。 对于消耗型商品,此接口仅返回用户已购但未消耗的购买数据;对于非消耗型商品,此接口返回用户所有已订购商品的购买数据;对于订阅型商品,此接口仅返回正在生效的订阅关系。 | |
obtainProductInfo(ProductInfoReq productInfoReq) 用于获取在AppGallery Connect上配置的商品的详情信息。 | |
parsePurchaseResultInfoFromIntent(Intent intent) 用于解析支付结果数据。 | |
startIapActivity(StartIapActivityReq startIapActivityReq) 用于拉起华为应用内支付的相关页面,包括编辑订阅页和管理订阅页。 |
Method |
|---|
Task<ConsumeOwnedPurchaseResult> consumeOwnedPurchase(ConsumeOwnedPurchaseReq consumeOwnedPurchaseReq) 针对消耗型商品,在商品支付成功后,应用需要在发放商品成功之后调用此接口对消耗型商品执行消耗操作。 注意
|
Parameters
Name | Description |
|---|---|
consumeOwnedPurchaseReq | 包含请求信息的ConsumeOwnedPurchaseReq对象。 |
Returns
Type | Description |
|---|---|
为Task设置回调监听可获取接口请求结果。
|
Sample code:
- // 构造一个ConsumeOwnedPurchaseReq对象
- ConsumeOwnedPurchaseReq req = new ConsumeOwnedPurchaseReq();
- String purchaseToken = "";
- try {
- // 从购买信息inAppPurchaseData中获取purchaseToken。inAppPurchaseData可从一次支付请求或者请求obtainOwnedPurchases接口获取
- InAppPurchaseData inAppPurchaseDataBean = new InAppPurchaseData(inAppPurchaseData);
- purchaseToken = inAppPurchaseDataBean.getPurchaseToken();
- } catch (JSONException e) {
- }
- req.setPurchaseToken(purchaseToken);
-
- // 获取调用接口的Activity对象
- final Activity activity = getActivity();
- // 调用consumeOwnedPurchase接口
- Task<ConsumeOwnedPurchaseResult> task = Iap.getIapClient(activity).consumeOwnedPurchase(req);
- task.addOnSuccessListener(new OnSuccessListener<ConsumeOwnedPurchaseResult>() {
- @Override
- public void onSuccess(ConsumeOwnedPurchaseResult result) {
- // 获取接口请求成功时的结果信息
- }
- }).addOnFailureListener(new OnFailureListener() {
- @Override
- public void onFailure(Exception e) {
- if (e instanceof IapApiException) {
- IapApiException apiException = (IapApiException) e;
- Status status = apiException.getStatus();
- int returnCode = apiException.getStatusCode();
- } else {
- // 其他外部错误
- }
- }
- });
- // 构造一个ConsumeOwnedPurchaseReq对象
- val req = ConsumeOwnedPurchaseReq()
- var purchaseToken = ""
- try {
- // 从购买信息inAppPurchaseData中获取purchaseToken。inAppPurchaseData可从一次支付请求或者请求obtainOwnedPurchases接口获取
- val inAppPurchaseDataBean = InAppPurchaseData(inAppPurchaseData)
- purchaseToken = inAppPurchaseDataBean.purchaseToken
- } catch (e: JSONException) {
- }
- req.setPurchaseToken(purchaseToken)
-
- // 获取调用接口的Activity对象
- val activity: Activity = getActivity()
- // 调用consumeOwnedPurchase接口
- val task = Iap.getIapClient(activity).consumeOwnedPurchase(req)
- task.addOnSuccessListener {
- // 获取接口请求成功时的结果信息
- }.addOnFailureListener { e ->
- if (e is IapApiException) {
- val apiException = e as IapApiException
- val status: Status = apiException.status
- val returnCode = apiException.statusCode
- } else {
- // 其他外部错误
- }
- }
Method |
|---|
Task<PurchaseIntentResult> createPurchaseIntent(PurchaseIntentReq purchaseIntentReq) PMS商品创建订单接口,支持购买消耗型商品、非消耗型商品、订阅型商品。 您在AppGallery Connect配置商品后,使用此接口调用华为应用内支付收银台,显示商品、价格和支付方式。华为会根据国际汇率变动进行商品价格档调整,为了保证应用内商品价格显示一致,请您同时使用obtainProductInfo接口获取商品详情,避免从自有服务端获取价格,以免在汇率变动价格调整时,导致价格显示不一致。 本接口只返回包含IAP收银台页面的Status对象,应用需要自行启动收银台页面,启动方法见PurchaseIntentResult中对Status的说明。用户完成支付后应用可以在onActivityResult回调方法中通过parsePurchaseResultInfoFromIntent获取支付结果信息。 注意
|
Parameters
Name | Description |
|---|---|
purchaseIntentReq | 包含请求信息的PurchaseIntentReq对象。 |
Returns
Type | Description |
|---|---|
为Task设置回调监听可获取接口请求结果。
|
Sample code:
- // 构造一个PurchaseIntentReq对象
- PurchaseIntentReq req = new PurchaseIntentReq();
- // 通过createPurchaseIntent接口购买的商品必须是您在AppGallery Connect网站配置的商品
- req.setProductId("CProduct1");
- // priceType: 0:消耗型商品; 1:非消耗型商品; 2:订阅型商品
- req.setPriceType(0);
- req.setDeveloperPayload("test");
- // 获取调用接口的Activity对象
- final Activity activity = getActivity();
- // 调用createPurchaseIntent接口创建PMS商品订单
- Task<PurchaseIntentResult> task = Iap.getIapClient(activity).createPurchaseIntent(req);
- task.addOnSuccessListener(new OnSuccessListener<PurchaseIntentResult>() {
- @Override
- public void onSuccess(PurchaseIntentResult result) {
- // 获取创建订单的结果
- // Status不支持序列化操作
- Status status = result.getStatus();
- if (status.hasResolution()) {
- try {
- // 6666是您自定义的常量
- // 启动IAP返回的收银台页面
- status.startResolutionForResult(activity, 6666);
- } catch (IntentSender.SendIntentException exp) {
- }
- }
- }
- }).addOnFailureListener(new OnFailureListener() {
- @Override
- public void onFailure(Exception e) {
- if (e instanceof IapApiException) {
- IapApiException apiException = (IapApiException) e;
- // Status不支持序列化操作
- Status status = apiException.getStatus();
- int returnCode = apiException.getStatusCode();
- } else {
- // 其他外部错误
- }
- }
- });
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- if (requestCode == 6666) {
- if (data == null) {
- Log.e("onActivityResult", "data is null");
- return;
- }
- // 调用parsePurchaseResultInfoFromIntent方法解析支付结果数据
- PurchaseResultInfo purchaseResultInfo = Iap.getIapClient(this).parsePurchaseResultInfoFromIntent(data);
- switch(purchaseResultInfo.getReturnCode()) {
- case OrderStatusCode.ORDER_STATE_CANCEL:
- // 用户取消
- break;
- case OrderStatusCode.ORDER_STATE_FAILED:
- case OrderStatusCode.ORDER_PRODUCT_OWNED:
- // 检查是否存在未发货商品
- break;
- case OrderStatusCode.ORDER_STATE_SUCCESS:
- // 支付成功
- String inAppPurchaseData = purchaseResultInfo.getInAppPurchaseData();
- String inAppPurchaseDataSignature = purchaseResultInfo.getInAppDataSignature();
- // 使用您应用的IAP公钥验证签名
- // 若验签成功,必须校验InAppPurchaseData中的productId、price、currency等信息的一致性,验证一致后发货
- // 若用户购买商品为消耗型商品,您需要在发货成功后调用consumeOwnedPurchase接口进行消耗
- break;
- default:
- break;
- }
- }
- }
- // 构造一个PurchaseIntentReq对象
- val req = PurchaseIntentReq()
- // 通过createPurchaseIntent接口购买的商品必须是您在AppGallery Connect网站配置的商品
- req.setProductId("CProduct1")
- // priceType: 0:消耗型商品; 1:非消耗型商品; 2:订阅型商品
- req.setPriceType(0)
- req.setDeveloperPayload("test")
- // 获取调用接口的Activity对象
- val activity: Activity = getActivity()
- // 调用createPurchaseIntent接口创建PMS商品订单
- val task = Iap.getIapClient(activity).createPurchaseIntent(req)
- task.addOnSuccessListener { result ->
- // 获取创建订单的结果
- // Status不支持序列化操作
- val status: Status = result.status
- if (status.hasResolution()) {
- try {
- // 6666是您自定义的常量
- // 启动IAP返回的收银台页面
- status.startResolutionForResult(activity, 6666)
- } catch (exp: SendIntentException) {
- }
- }
- }.addOnFailureListener { e ->
- if (e is IapApiException) {
- val apiException = e as IapApiException
- // Status不支持序列化操作
- val status: Status = apiException.status
- val returnCode = apiException.statusCode
- } else {
- // 其他外部错误
- }
- }
-
- override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
- super.onActivityResult(requestCode, resultCode, data)
- if (requestCode == 6666) {
- if (data == null) {
- Log.e("onActivityResult", "data is null")
- return
- }
- // 调用parsePurchaseResultInfoFromIntent方法解析支付结果数据
- val purchaseResultInfo = Iap.getIapClient(this).parsePurchaseResultInfoFromIntent(data)
- when (purchaseResultInfo.returnCode) {
- OrderStatusCode.ORDER_STATE_CANCEL -> {
- }
- OrderStatusCode.ORDER_STATE_FAILED, OrderStatusCode.ORDER_PRODUCT_OWNED -> {
- }
- OrderStatusCode.ORDER_STATE_SUCCESS -> {
- // 支付成功
- val inAppPurchaseData = purchaseResultInfo.inAppPurchaseData
- val inAppPurchaseDataSignature = purchaseResultInfo.inAppDataSignature
- }
- else -> {
- }
- }
- }
- }
Method |
|---|
Task<PurchaseIntentResult> createPurchaseIntentWithPrice(PurchaseIntentWithPriceReq purchaseIntentWithPriceReq) 应用可以调用此接口自行传入商品价格并完成支付,而不是从IAP PMS获取价格。此接口不提供商品信息自动全球化能力,需要您在接口中指定价格、币种和国家/地区。 本接口只返回包含IAP收银台页面的Status对象,应用需要自行启动收银台页面,启动方法见PurchaseIntentResult中对Status的说明。用户完成支付后应用可以在onActivityResult回调方法中通过parsePurchaseResultInfoFromIntent获取支付结果信息。 注意
说明
|
Parameters
Name | Description |
|---|---|
purchaseIntentWithPriceReq | 包含请求信息的PurchaseIntentWithPriceReq对象。 |
Returns
Type | Description |
|---|---|
为Task设置回调监听可获取接口请求结果。
|
Sample code:
- // 构造PurchaseIntentWithPriceReq对象
- PurchaseIntentWithPriceReq req = new PurchaseIntentWithPriceReq();
- req.setCurrency("CNY");
- req.setDeveloperPayload("test");
- // priceType: 0: 消耗型; 1: 非消耗型
- req.setPriceType(0);
- req.setSdkChannel("1");
- req.setProductName("test");
- req.setAmount("1.00");
- req.setProductId("ConsumableProduct1");
- req.setServiceCatalog("X38");
- req.setCountry("CN");
-
- // 获取调用接口的Activity对象
- final Activity activity = getActivity();
- // 调用createPurchaseIntentWithPrice接口
- Task<PurchaseIntentResult> task = Iap.getIapClient(activity).createPurchaseIntentWithPrice(req);
- task.addOnSuccessListener(new OnSuccessListener<PurchaseIntentResult>() {
- @Override
- public void onSuccess(PurchaseIntentResult result) {
- // 获取支付结果
- String paymentData = result.getPaymentData();
- String paymentSignature = result.getPaymentSignature();
- // 验证paymentData的签名
- String publicKey = "XXX";
- // CipherUtil为自定义类,需要自定义doCheck方法
- if (CipherUtil.doCheck(paymentData, paymentSignature, publicKey)) {
- // 如果成功,则启动请求返回的IAP收银台页面
- // Status不支持序列化操作
- Status status = result.getStatus();
- if (status.hasResolution()) {
- try {
- status.startResolutionForResult(activity, 6666);
- } catch (IntentSender.SendIntentException exp) {
- }
- }
- }
- }
- }).addOnFailureListener(new OnFailureListener() {
- @Override
- public void onFailure(Exception e) {
- if (e instanceof IapApiException) {
- IapApiException apiException = (IapApiException) e;
- int returnCode = apiException.getStatusCode();
- switch (returnCode) {
- case OrderStatusCode.ORDER_HWID_NOT_LOGIN:
- case OrderStatusCode.ORDER_NOT_ACCEPT_AGREEMENT:
- // 帐号未登录或用户不同意支付协议
- // Status不支持序列化操作
- Status status = apiException.getStatus();
- if (status != null && status.hasResolution()) {
- try {
- status.startResolutionForResult(activity, 8888);
- } catch (IntentSender.SendIntentException exp) {
- }
- }
- break;
- case OrderStatusCode.ORDER_PRODUCT_OWNED:
- // 检查是否存在未交付的商品
- break;
- default:
- break;
- }
- }
- }
- });
- // 支付结果回调
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (requestCode == 6666) {
- if (data == null) {
- Log.e("onActivityResult", "data is null");
- return;
- }
- PurchaseResultInfo purchaseResultInfo = Iap.getIapClient(this).parsePurchaseResultInfoFromIntent(data);
- switch(purchaseResultInfo.getReturnCode()) {
- case OrderStatusCode.ORDER_STATE_CANCEL:
- // 用户取消支付
- break;
- case OrderStatusCode.ORDER_STATE_FAILED:
- case OrderStatusCode.ORDER_STATE_DEFAULT_CODE:
- case OrderStatusCode.ORDER_PRODUCT_OWNED:
- // 检查是否存在未交付的商品
- break;
- case OrderStatusCode.ORDER_STATE_SUCCESS:
- // 支付成功
- String inAppPurchaseData = purchaseResultInfo.getInAppPurchaseData();
- String inAppPurchaseDataSignature = purchaseResultInfo.getInAppDataSignature();
- // 使用您应用的IAP公钥验证签名
- // 若验签成功,必须校验InAppPurchaseData中的productId、price、currency等信息的一致性,验证一致后发货
- // 若用户购买商品为消耗型商品,您需要在发货成功后调用consumeOwnedPurchase接口进行消耗
- break;
- default:
- break;
- }
- return;
- }
- if (requestCode == 8888) {
- int returnCode = IapClientHelper.parseRespCodeFromIntent(data);
- if (returnCode == OrderStatusCode.ORDER_STATE_SUCCESS) {
- // 请求成功,需要再次发起createPurchaseIntentWithPrice请求
- }
- return;
- }
- }
- // 构造PurchaseIntentWithPriceReq对象
- val req = PurchaseIntentWithPriceReq()
- req.setCurrency("CNY")
- req.setDeveloperPayload("test")
- // priceType: 0: 消耗型; 1: 非消耗型
- req.setPriceType(0)
- req.setSdkChannel("1")
- req.setProductName("test")
- req.setAmount("1.00")
- req.setProductId("ConsumableProduct1")
- req.setServiceCatalog("X38")
- req.setCountry("CN")
-
- // 获取调用接口的Activity对象
- val activity: Activity = getActivity()
- // 调用createPurchaseIntentWithPrice接口
- val task = Iap.getIapClient(activity).createPurchaseIntentWithPrice(req)
- task.addOnSuccessListener { result ->
- // 获取支付结果
- val paymentData = result.getPaymentData()
- val paymentSignature = result.getPaymentSignature()
- // 验证paymentData的签名
- val publicKey = "XXX"
- // CipherUtil为自定义类,需要自定义doCheck方法
- if (CipherUtil.doCheck(paymentData, paymentSignature, publicKey)) {
- // 如果成功,则启动请求返回的IAP收银台页面
- // Status不支持序列化操作
- val status: Status = result.status
- if (status.hasResolution()) {
- try {
- status.startResolutionForResult(activity, 6666)
- } catch (exp: SendIntentException) {
- }
- }
- }
- }.addOnFailureListener { e ->
- if (e is IapApiException) {
- val apiException = e as IapApiException
- val returnCode = apiException.statusCode
- when (returnCode) {
- OrderStatusCode.ORDER_HWID_NOT_LOGIN, OrderStatusCode.ORDER_NOT_ACCEPT_AGREEMENT -> {
- // 帐号未登录或用户不同意支付协议
- // Status不支持序列化操作
- val status: Status? = apiException.status
- if (status != null && status.hasResolution()) {
- try {
- status.startResolutionForResult(activity, 8888)
- } catch (exp: SendIntentException) {
- }
- }
- }
- OrderStatusCode.ORDER_PRODUCT_OWNED -> {
- }
- else -> {
- }
- }
- }
- }
-
- // 支付结果回调
- override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
- if (requestCode == 6666) {
- if (data == null) {
- Log.e("onActivityResult", "data is null")
- return
- }
- val purchaseResultInfo = Iap.getIapClient(this).parsePurchaseResultInfoFromIntent(data)
- when (purchaseResultInfo.returnCode) {
- OrderStatusCode.ORDER_STATE_CANCEL -> {
- }
- OrderStatusCode.ORDER_STATE_FAILED, OrderStatusCode.ORDER_PRODUCT_OWNED, OrderStatusCode.ORDER_STATE_DEFAULT_CODE -> {
- }
- OrderStatusCode.ORDER_STATE_SUCCESS -> {
- // 支付成功
- val inAppPurchaseData = purchaseResultInfo.inAppPurchaseData
- val inAppPurchaseDataSignature = purchaseResultInfo.inAppDataSignature
- }
- else -> {
- }
- }
- return
- }
- if (requestCode == 8888) {
- val returnCode = IapClientHelper.parseRespCodeFromIntent(data)
- if (returnCode == OrderStatusCode.ORDER_STATE_SUCCESS) {
- // 请求成功,需要再次发起createPurchaseIntentWithPrice请求
- }
- return
- }
- }
Method |
|---|
void enablePendingPurchase() 用于使能延迟付款型支付。若要在您的应用中使用延迟付款型支付功能,需要在发起购买前调用本接口。建议您在应用启动时调用本接口。 说明
|
Sample code:
- // 获取调用接口的Activity对象
- Activity activity = getActivity();
- Iap.getIapClient(activity).enablePendingPurchase();
- // 获取调用接口的Activity对象
- val activity: Activity = getActivity()
- Iap.getIapClient(activity).enablePendingPurchase()
Method |
|---|
Task<IsEnvReadyResult> isEnvReady() 通过该接口可以判断当前设备登录的帐号所在的服务国家/地区是否在华为IAP支付服务支持结算的国家/地区中。 |
Returns
Type | Description |
|---|---|
为Task设置回调监听可获取接口请求结果。
|
Sample code:
- // 获取调用接口的Activity对象
- final Activity activity = getActivity();
- Task<IsEnvReadyResult> task = Iap.getIapClient(activity).isEnvReady();
- task.addOnSuccessListener(new OnSuccessListener<IsEnvReadyResult>() {
- @Override
- public void onSuccess(IsEnvReadyResult result) {
- // 获取接口请求的结果
- String carrierId = result.getCarrierId();
- }
- }).addOnFailureListener(new OnFailureListener() {
- @Override
- public void onFailure(Exception e) {
- if (e instanceof IapApiException) {
- IapApiException apiException = (IapApiException) e;
- // Status不支持序列化操作
- Status status = apiException.getStatus();
- if (status.getStatusCode() == OrderStatusCode.ORDER_HWID_NOT_LOGIN) {
- // 未登录帐号
- if (status.hasResolution()) {
- try {
- // 6666是您自定义的常量
- // 启动IAP返回的登录页面
- status.startResolutionForResult(activity, 6666);
- } catch (IntentSender.SendIntentException exp) {
- }
- }
- } else if (status.getStatusCode() == OrderStatusCode.ORDER_ACCOUNT_AREA_NOT_SUPPORTED) {
- // 用户当前登录的华为帐号所在的服务地不在华为IAP支持结算的国家/地区中
- }
- } else {
- // 其他外部错误
- }
- }
- });
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- if (requestCode == 6666) {
- if (data != null) {
- // 使用parseRespCodeFromIntent方法获取接口请求结果
- int returnCode = IapClientHelper.parseRespCodeFromIntent(data);
- }
- }
- }
- // 获取调用接口的Activity对象
- val activity: Activity = getActivity()
- val task = Iap.getIapClient(activity).isEnvReady
- task.addOnSuccessListener { result ->
- // 获取接口请求的结果
- val carrierId = result.carrierId
- }.addOnFailureListener { e ->
- if (e is IapApiException) {
- val apiException = e as IapApiException
- // Status不支持序列化操作
- val status: Status = apiException.status
- if (status.getStatusCode() === OrderStatusCode.ORDER_HWID_NOT_LOGIN) {
- // 未登录帐号
- if (status.hasResolution()) {
- try {
- // 6666是您自定义的常量
- // 启动IAP返回的登录页面
- status.startResolutionForResult(activity, 6666)
- } catch (exp: SendIntentException) {
- }
- }
- } else if (status.getStatusCode() === OrderStatusCode.ORDER_ACCOUNT_AREA_NOT_SUPPORTED) {
- // 用户当前登录的华为帐号所在的服务地不在华为IAP支持结算的国家/地区中
- }
- } else {
- // 其他外部错误
- }
- }
- override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
- super.onActivityResult(requestCode, resultCode, data)
- if (requestCode == 6666) {
- if (data != null) {
- // 使用parseRespCodeFromIntent方法获取接口请求结果
- val returnCode = IapClientHelper.parseRespCodeFromIntent(data)
- }
- }
- }
Method |
|---|
Task<IsSandboxActivatedResult> isSandboxActivated(IsSandboxActivatedReq isSandboxActivatedReq) 通过该接口可以判断当前设备登录的华为帐号及应用的APK版本是否满足沙盒条件。 |
Parameters
Name | Description |
|---|---|
isSandboxActivatedReq | 包含请求信息的IsSandboxActivatedReq对象。 |
Return
Type | Description |
|---|---|
为Task设置回调监听可获取接口请求结果。
|
Sample code:
- // 获取调用接口的Activity对象
- final Activity activity = getActivity();
- IapClient mClient = Iap.getIapClient(activity);
- Task<IsSandboxActivatedResult> task = mClient.isSandboxActivated(new IsSandboxActivatedReq());
- task.addOnSuccessListener(new OnSuccessListener<IsSandboxActivatedResult>() {
- @Override
- public void onSuccess(IsSandboxActivatedResult result) {
- Log.i("IAP", "isSandboxActivated success");
- }
- }).addOnFailureListener(new OnFailureListener() {
- @Override
- public void onFailure(Exception e) {
- Log.e("IAP", "isSandboxActivated fail");
- if (e instanceof IapApiException) {
- IapApiException apiException = (IapApiException) e;
- int returnCode = apiException.getStatusCode();
- } else {
- // 其他外部错误
- }
- }
- });
- // 获取调用接口的Activity对象
- val activity: Activity = getActivity()
- val mClient = Iap.getIapClient(activity)
- val task = mClient.isSandboxActivated(IsSandboxActivatedReq())
- task.addOnSuccessListener { result ->
- Log.i("IAP", "isSandboxActivated success")
- }.addOnFailureListener { e ->
- Log.e("IAP", "isSandboxActivated fail")
- if (e is IapApiException) {
- val apiException = e as IapApiException
- val returnCode = apiException.statusCode
- } else {
- // 其他外部错误
- }
- }
Method |
|---|
Task<OwnedPurchasesResult> obtainOwnedPurchaseRecord(OwnedPurchasesReq ownedPurchasesReq) 此接口用于获取消耗型商品的历史消耗商品信息或订阅型商品的所有订阅收据。
说明 此接口不会返回非消耗型商品的购买信息,您需使用obtainOwnedPurchases接口获取非消耗型商品的购买记录。 |
Parameters
Name | Description |
|---|---|
ownedPurchasesReq | 包含请求信息的OwnedPurchasesReq对象。 |
Returns
Type | Description |
|---|---|
为Task设置回调监听可获取接口请求结果。
|
Sample code:
- // 构造OwnedPurchasesReq对象
- OwnedPurchasesReq req = new OwnedPurchasesReq();
- // 0:消耗型商品; 2:订阅型商品
- req.setPriceType(0);
- // 获取调用接口的Activity对象
- final Activity activity = getActivity();
- // 调用obtainOwnedPurchaseRecord接口
- Task<OwnedPurchasesResult> task = Iap.getIapClient(activity).obtainOwnedPurchaseRecord(req);
- task.addOnSuccessListener(new OnSuccessListener<OwnedPurchasesResult>() {
- @Override
- public void onSuccess(OwnedPurchasesResult result) {
- // 获取接口请求成功时的结果信息
- }
- }).addOnFailureListener(new OnFailureListener() {
- @Override
- public void onFailure(Exception e) {
- if (e instanceof IapApiException) {
- IapApiException apiException = (IapApiException) e;
- int returnCode = apiException.getStatusCode();
- } else {
- // 其他外部错误
- }
- }
- });
- // 构造OwnedPurchasesReq对象
- val req = OwnedPurchasesReq()
- // 0:消耗型商品; 2:订阅型商品
- req.setPriceType(0)
- // 获取调用接口的Activity对象
- val activity: Activity = getActivity()
- // 调用obtainOwnedPurchaseRecord接口
- val task = Iap.getIapClient(activity).obtainOwnedPurchaseRecord(req)
- task.addOnSuccessListener {
- // 获取接口请求成功时的结果信息
- }.addOnFailureListener { e ->
- if (e is IapApiException) {
- val apiException = e as IapApiException
- val returnCode = apiException.statusCode
- } else {
- // 其他外部错误
- }
- }
Method |
|---|
Task<OwnedPurchasesResult> obtainOwnedPurchases(OwnedPurchasesReq ownedPurchasesReq) 查询用户已订购商品的购买数据,包括消耗型商品、非消耗型商品和订阅型商品,一次请求只能查询一种类型的商品。
注意 如果您在消耗之后再进行发货,可能存在以下异常场景:调用消耗接口过程中,服务器消耗成功但因网络异常等原因没有成功将结果回调给端侧,从而造成服务器已经消耗但是端侧没有发货的场景。此场景后续很难处理,您需在发货成功之后再执行消耗操作。
|
Parameters
Name | Description |
|---|---|
ownedPurchasesReq | 包含请求信息的OwnedPurchasesReq对象。 |
Returns
Type | Description |
|---|---|
为Task设置回调监听可获取接口请求结果。
|
Sample code:
- // 构造一个OwnedPurchasesReq对象
- OwnedPurchasesReq ownedPurchasesReq = new OwnedPurchasesReq();
- // priceType: 0:消耗型商品; 1:非消耗型商品; 2:订阅型商品
- ownedPurchasesReq.setPriceType(0);
- // 获取调用接口的Activity对象
- final Activity activity = getActivity();
- // 调用obtainOwnedPurchases接口获取所有已购但未发货的消耗型商品
- Task<OwnedPurchasesResult> task = Iap.getIapClient(activity).obtainOwnedPurchases(ownedPurchasesReq);
- task.addOnSuccessListener(new OnSuccessListener<OwnedPurchasesResult>() {
- @Override
- public void onSuccess(OwnedPurchasesResult result) {
- // 获取执行结果
- if (result != null && result.getInAppPurchaseDataList() != null) {
- for (int i = 0; i < result.getInAppPurchaseDataList().size(); i++) {
- String inAppPurchaseData = result.getInAppPurchaseDataList().get(i);
- String InAppSignature = result.getInAppSignature().get(i);
- // 使用您应用的IAP公钥验证签名
- // 如果验签成功,确认每个商品的购买状态。确认商品已支付后,检查此前是否已发过货,未发货则进行发货操作。发货成功后执行消耗操作
- try {
- InAppPurchaseData inAppPurchaseDataBean = new InAppPurchaseData(inAppPurchaseData);
- int purchaseState = inAppPurchaseDataBean.getPurchaseState();
- } catch (JSONException e) {
- }
- }
- }
- }
- }).addOnFailureListener(new OnFailureListener() {
- @Override
- public void onFailure(Exception e) {
- if (e instanceof IapApiException) {
- IapApiException apiException = (IapApiException) e;
- Status status = apiException.getStatus();
- int returnCode = apiException.getStatusCode();
- } else {
- // 其他外部错误
- }
- }
- });
- // 构造一个OwnedPurchasesReq对象
- val ownedPurchasesReq = OwnedPurchasesReq()
- // priceType: 0:消耗型商品; 1:非消耗型商品; 2:订阅型商品
- ownedPurchasesReq.setPriceType(0)
- // 获取调用接口的Activity对象
- val activity: Activity = getActivity()
- // 调用obtainOwnedPurchases接口获取所有已购但未发货的消耗型商品
- val task = Iap.getIapClient(activity).obtainOwnedPurchases(ownedPurchasesReq)
- task.addOnSuccessListener { result ->
- // 获取执行结果
- if (result != null && result.getInAppPurchaseDataList() != null) {
- for (i in result.getInAppPurchaseDataList().indices) {
- val inAppPurchaseData = result.getInAppPurchaseDataList()[i]
- val InAppSignature = result.getInAppSignature()[i]
- // 使用您应用的IAP公钥验证签名
- // 如果验签成功,确认每个商品的购买状态。确认商品已支付后,检查此前是否已发过货,未发货则进行发货操作。发货成功后执行消耗操作
- try {
- val inAppPurchaseDataBean = InAppPurchaseData(inAppPurchaseData)
- val purchaseState = inAppPurchaseDataBean.purchaseState
- } catch (e: JSONException) {
- }
- }
- }
- }.addOnFailureListener { e ->
- if (e is IapApiException) {
- val apiException = e as IapApiException
- val status: Status = apiException.status
- val returnCode = apiException.statusCode
- } else {
- // 其他外部错误
- }
- }
Method |
|---|
Task<ProductInfoResult> obtainProductInfo(ProductInfoReq productInfoReq) 此接口用于获取在AppGallery Connect配置的商品详情。如果您使用了华为PMS系统进行商品定价,可通过此接口从华为PMS获取商品详情,以保证和华为支付收银台显示的商品信息一致。 说明 请您避免从自有服务端获取商品信息,否则可能导致应用内商品价格和收银台价格不一致。 |
Parameters
Name | Description |
|---|---|
productInfoReq | 包含请求信息的ProductInfoReq对象。 |
Returns
Type | Description |
|---|---|
为Task设置回调监听可获取接口请求结果。
|
Sample code:
- List<String> productIdList = new ArrayList<>();
- // 查询的商品必须是您在AppGallery Connect网站配置的商品
- productIdList.add("ConsumeProduct1001");
- ProductInfoReq req = new ProductInfoReq();
- // priceType: 0:消耗型商品; 1:非消耗型商品; 2:订阅型商品
- req.setPriceType(0);
- req.setProductIds(productIdList);
- // 获取调用接口的Activity对象
- final Activity activity = getActivity();
- // 调用obtainProductInfo接口获取AppGallery Connect网站配置的商品的详情信息
- Task<ProductInfoResult> task = Iap.getIapClient(activity).obtainProductInfo(req);
- task.addOnSuccessListener(new OnSuccessListener<ProductInfoResult>() {
- @Override
- public void onSuccess(ProductInfoResult result) {
- // 获取接口请求成功时返回的商品详情信息
- List<ProductInfo> productList = result.getProductInfoList();
- }
- }).addOnFailureListener(new OnFailureListener() {
- @Override
- public void onFailure(Exception e) {
- if (e instanceof IapApiException) {
- IapApiException apiException = (IapApiException) e;
- int returnCode = apiException.getStatusCode();
- } else {
- // 其他外部错误
- }
- }
- });
- val productIdList: MutableList<String> = ArrayList()
- // 查询的商品必须是您在AppGallery Connect网站配置的商品
- productIdList.add("ConsumeProduct1001")
- val req = ProductInfoReq()
- // priceType: 0:消耗型商品; 1:非消耗型商品; 2:订阅型商品
- req.setPriceType(0)
- req.productIds = productIdList
- // 获取调用接口的Activity对象
- val activity: Activity = getActivity()
- // 调用obtainProductInfo接口获取AppGallery Connect网站配置的商品的详情信息
- val task = Iap.getIapClient(activity).obtainProductInfo(req)
- task.addOnSuccessListener { result ->
- // 获取接口请求成功时返回的商品详情信息
- val productList = result.getProductInfoList()
- }.addOnFailureListener { e ->
- if (e is IapApiException) {
- val apiException = e as IapApiException
- val returnCode = apiException.statusCode
- } else {
- // 其他外部错误
- }
- }
Method |
|---|
PurchaseResultInfo parsePurchaseResultInfoFromIntent(Intent intent) 调用createPurchaseIntent接口成功并拉起页面后,会通过Activity的onActivityResult方法回调支付结果,可用此方法解析支付结果数据,结果返回一个PurchaseResultInfo对象。 |
Parameters
Name | Description |
|---|---|
intent | 包含支付结果信息的Intent对象。 |
Returns
Type | Description |
|---|---|
包含支付结果信息的对象。 |
Sample code:
- // 支付结果在拉起IAP页面的Activity对象的onActivityResult方法中返回
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- PurchaseResultInfo purchaseResultInfo = Iap.getIapClient(this).parsePurchaseResultInfoFromIntent(data);
- }
- // 支付结果在拉起IAP页面的Activity对象的onActivityResult方法中返回
- override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
- val purchaseResultInfo = Iap.getIapClient(this).parsePurchaseResultInfoFromIntent(data)
- }
Method |
|---|
Task<StartIapActivityResult> startIapActivity(StartIapActivityReq startIapActivityReq) 可用此方法拉起华为应用内支付的相关页面,包括:
说明 IAP SDK 4.0.4.300版本增加此方法,用于替换之前版本提供的订阅管理页面跳转方法。 |
Parameters
Name | Description |
|---|---|
startIapActivityReq | 包含请求信息的StartIapActivityReq对象。 |
Returns
Type | Description |
|---|---|
为Task设置回调监听可获取接口请求结果。
|
Sample code:
- // 跳转到订阅管理页
- StartIapActivityReq req = new StartIapActivityReq();
- req.setType(StartIapActivityReq.TYPE_SUBSCRIBE_MANAGER_ACTIVITY);
- // 获取调用接口的Activity对象
- final Activity activity = getActivity();
- IapClient mClient = Iap.getIapClient(activity);
- Task<StartIapActivityResult> task = mClient.startIapActivity(req);
- task.addOnSuccessListener(new OnSuccessListener<StartIapActivityResult>() {
- @Override
- public void onSuccess(StartIapActivityResult result) {
- Log.i("startIapActivity", "onSuccess");
- if (result != null) {
- result.startActivity(activity);
- }
- }
- }).addOnFailureListener(new OnFailureListener() {
- @Override
- public void onFailure(Exception e) {
- Log.e("startIapActivity", "onFailure");
- }
- });
-
- // 跳转到订阅编辑页
- StartIapActivityReq req = new StartIapActivityReq();
- req.setSubscribeProductId("XXX");
- req.setType(StartIapActivityReq.TYPE_SUBSCRIBE_EDIT_ACTIVITY);
- // 获取调用接口的Activity对象
- final Activity activity = getActivity();
- IapClient mClient = Iap.getIapClient(activity);
- Task<StartIapActivityResult> task = mClient.startIapActivity(req);
- task.addOnSuccessListener(new OnSuccessListener<StartIapActivityResult>() {
- @Override
- public void onSuccess(StartIapActivityResult result) {
- Log.i("startIapActivity", "onSuccess");
- if (result != null) {
- result.startActivity(activity);
- }
- }
- }).addOnFailureListener(new OnFailureListener() {
- @Override
- public void onFailure(Exception e) {
- Log.e("startIapActivity", "onFailure");
- }
- });
-
- // 跳转到订阅管理页
- val req = StartIapActivityReq()
- req.setType(StartIapActivityReq.TYPE_SUBSCRIBE_MANAGER_ACTIVITY)
- // 获取调用接口的Activity对象
- val activity: Activity = getActivity()
- val mClient = Iap.getIapClient(activity)
- val task = mClient.startIapActivity(req)
- task.addOnSuccessListener { result ->
- Log.i("startIapActivity", "onSuccess")
- result?.startActivity(activity)
- }.addOnFailureListener { Log.e("startIapActivity", "onFailure") }
-
- // 跳转到订阅编辑页
- val req = StartIapActivityReq()
- req.setSubscribeProductId("XXX")
- req.setType(StartIapActivityReq.TYPE_SUBSCRIBE_EDIT_ACTIVITY)
- // 获取调用接口的Activity对象
- val activity: Activity = getActivity()
- val mClient = Iap.getIapClient(activity)
- val task = mClient.startIapActivity(req)
- task.addOnSuccessListener { result ->
- Log.i("startIapActivity", "onSuccess")
- result?.startActivity(activity)
- }.addOnFailureListener { Log.e("startIapActivity", "onFailure") }