《Android Google Play 支付SDK接入指南》编辑专家助您轻松接入

访客 492 0
```html

前端

这里需要接入Google应用内支付。

1. 在app模块的build.gradle文件中引入最新版本的Google Billing 4.0,并同时引入Google服务,如下所示:

```
implementation 'com.google.android.gms:play-services-wallet:19.0.0'
implementation 'com.android.s' 
 

前端流程

1. 如需连接至Google支付服务,请检查以下事项: - 确保您的设备已成功连接至Google支付服务。 - 若无法连接,请参考以下检查步骤:

  • 连接的网络不能使用国内的,可以使用港澳台漫游网络,vpn有时候也不顶用
  • 使用的海外手机,并且安装有google服务套件(google play ,google sever)
  • 登录的google账号得是海外账号(港澳台的也行),必须海外注册的账号,不然不可用
  • 可以登录google支付商店查看付费项能否正常显示

2. 首先,查询是否存在上次未消费的商品。如果有未消费的商品,立即通知服务器,并进行消费处理。这是因为国外的支付环境与国内不同,他们可以在线下单后前往便利店进行支付,所以存在未消费商品的情况。 3. 使用google play console后台配置的商品id来启动支付流程。 4. 支付完成后,及时通知后端并查询结果进行验证,确保商品已成功消费。

前端核心代码

1.初始化BillingClient,并注册商品变动监听 商品状态发生变化都会走这个监听

 public BillingClient mBillingclient; mBillingclient=BillingClient.newBuilder(context).setListener(mPurchasesUpdatedListener).enablePendingPurchases().build(); private PurchasesUpdatedListener mPurchasesUpdatedListener=new PurchasesUpdatedListener() {        @Override        public void onPurchasesUpdated(@NonNull BillingResult billingResult, @Nullable List<Purchase> list) {            String debugMessage = billingResult.getDebugMessage();            if (list != null && list.size() > 0) {                if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {                    for (Purchase purchase : list) {                        if(purchase == null || purchase.getPurchaseState() != Purchase.PurchaseState.PURCHASED) continue;                        //通知服务器支付成功,服务端验证后,消费商品                        //TODO客户端同步回调支付成功                    }                }            } else {                switch (billingResult.getResponseCode()) {                    case BillingClient.BillingResponseCode.SERVICE_TIMEOUT: //服务连接超时                        break;                    case BillingClient.BillingResponseCode.FEATURE_NOT_SUPPORTED:                        break;                    case BillingClient.BillingResponseCode.SERVICE_DISCONNECTED: //服务未连接                        break;                    case BillingClient.BillingResponseCode.USER_CANCELED: //取消                        break;                    case BillingClient.BillingResponseCode.SERVICE_UNAVAILABLE: //服务不可用                        break;                    case BillingClient.BillingResponseCode.BILLING_UNAVAILABLE: //购买不可用                        break;                    case BillingClient.BillingResponseCode.ITEM_UNAVAILABLE: //商品不存在                        break;                    case BillingClient.BillingResponseCode.DEVELOPER_ERROR: //提供给 API 的无效参数                        break;                    case BillingClient.BillingResponseCode.ERROR: //错误                         break;                    case BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED: //未消耗掉                     queryPurchases();                        break;                    case BillingClient.BillingResponseCode.ITEM_NOT_OWNED: //不可购买                        break;                }            }        }    };

2.支付操作,支付前查询商品详情
cpOrder:这里用的是我们服务端生成的订单号,可不传
productId:这是在google后台填的商品id

```java
public void pay(final String cpOrder, final String productId) {
    if (mBillingclient == null || !mBillingclient.isReady()) {
        // TODO: The client failed to pay due to the inability to connect to Google or use Google's payment services.
        mBillingclient.startConnection(new BillingClientStateListener() {
            // Reconnect
            @Override
            public void onBillingServiceDisconnected() {
                // Try restarting the next request for connection
                // Google plays by calling the startConnection() method.
            }
        });
    }
}
```

改写后的版本:

```java
public void pay(final String cpOrder, final String productId) {
    if (mBillingclient == null || !mBillingclient.isReady()) {
        // TODO: The payment failed because the client cannot connect to Google or use Google's payment services.
        mBillingclient.startConnection(new BillingClientStateListener() {
            @Override
            public void onBillingServiceDisconnected() {
                // Attempting to restart the next connection request
                // by calling startConnection() method from Google Play.
            }
        });
    }
}
``` 
void querySkuDetailsAsync(final String cpOrder, final String productId) {
    List skuList = new ArrayList();
    skuList.add(productId);
    
    SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
    params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);
    
    mBillingclient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() {
        @Override
        public void onSkuDetailsResponse(SkuDetailsResult result) {
            // TODO: Implement response handling logic
        }
    });
} 
/**
 * 拉取Google支付页面
 * @param cpOrder 你自己的订单号或者用户id,用于关联到对应的用户,发放道具时使用
 * @param skuDetails 商品详情
 */
void launchBillingFlow(String cpOrder, SkuDetails skuDetails) {
    mBillingclient.launchBillingFlow(
        (Activity) context,
        BillingFlowParams.newBuilder()
            .setSkuDetails(skuDetails)
            .build()
    );
} 
public void consumePurchase(final Purchase purchase) {
    if (mBillingclient == null || purchase == null || purchase.getPurchaseState() != Purchase.PurchaseState.PURCHASED) return;
    Log.i(Tag, 消耗商品:商品id: + purchase.getSkus() +  商品OrderId: + purchase.getOrderId() +  token: + purchase.getPurchaseToken());
    ConsumeParams consumeParams = ConsumeParams.newBuilder()
            .setPurchaseToken(purchase.getPurchaseToken())
            ...
} 
/**
 * 补单操作:查询已支付的商品,并通知服务器后消费(在Google支付中,没有消费的商品不能再次购买)
 */
private void queryPurchases() {
    PurchasesResponseListener mPurchasesResponseListener = new PurchasesResponseListener() {
        @Override
        public void onQueryPurchasesResponse(@NonNull BillingResult billingResult, @NonNull List purchasesResult) {
            if (billingResult.getResponseCode() != BillingClient.BillingResponseCode.OK || purchasesResult == null) return;
            // TODO: Add your code here
        }
    };
} 

服务端

1. 在Google Play Console 后台创建应用,请点击此链接:https://play.google.com/console 2. 在Google Cloud Platform 创建 API 项目,请点击此链接:https://console.cloud.google.com/ 3. 进入 Google Play Console 后台的 API 权限页面,并将其与该 API 项目关联起来。 4. 启用 Google Play Android Developer API。 5. 设置 OAuth 同意屏幕。 6. 创建 OAuth 2.0 客户端 ID,用于 web 应用程序。 7. 引导用户到授权页面,并使用 Google 开发者账号为该项目授权,以获取 code。

具体参考这篇博客:https://www.cnblogs.com/xiaogou/p/15568393.html

查询

1. 获取code 地址:https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/androidpublisher&response_type=code&access_type=offline&redirect_uri={填写的重定向地址}&client_id={创建的clientId} 将上面的{XX}替换成创建API项目时填写的重定向地址和Client ID,然后将连接放到浏览器中打开,就会弹出授权界面,使用你的开发者账号进行授权登录。 请求方式:浏览器中打开 请求完重定向地址上有两个参数code和scope,我们只需要获取到的code即可。 2. 获取refreshToken 使用获取到的code来换取refreshToken。 地址:https://accounts.google.com/o/oauth2/token 请求方式:POST 参数:grant_type=authorization_code, code={获取到的c}

注意

1. 完成SDK接入后,将APP Bundle上传至Google Play Console的内部测试环节。在此处添加测试人员,并发送邀请和测试链接,即可开始进行沙盒测试。 2. 如果支付功能无法正常启动,请检查以下事项:

  • 连接的网络不能使用国内的,可以使用港澳台漫游网络,vpn有时候也不顶用
  • 使用的海外手机,并且安装有google服务套件(google play ,google sever)
  • 登录的google账号得是海外账号(港澳台的也行),必须海外注册的账号,不然不可用
  • 可以登录google支付商店查看付费项能否正常显示

常见报错(FAQ)

1. In-app Billing API version is less than 3: - Please check if your Google Play app is up to date and if you are using an overseas account. - Make sure you are connected to a network that allows access to international services, such as Hong Kong, Macau, or Taiwan roaming. 2. Error when querying orders: The current user has insufficient permissions to perform the requested operation. - This error occurs because the account used to obtain the refreshToken does not have Service Account permissions. - To resolve this issue, please follow these steps: - Go to Google Cloud Platform and create a service account. - Grant necessary permissions for the service account. - Add roles and grant Service Account permission using the account that obtained the refreshToken. 3. An internal error occurred: - This error may be caused by network issues. - Please check if your device has internet connectivity and try accessing other paid apps that use Google Pay.

官方文档链接:https://developer.android.google.cn/google/play/billing/integrate

标签: 商品 账号 地址

发表评论 (已有0条评论)

还木有评论哦,快来抢沙发吧~