前言:
对于新手或没直接对接过谷歌内置支付的技术来说,总是会碰到各种坑,所以由于我刚从坑里爬出来的菜鸟吐槽一下对接流程吧。
嗯,里面整体的对接流程和注意事项,我就不多说了,网上甚至谷歌官网都有不少说明。我就直接封装了一下支付类。直接上代码。能通过本菜鸟的代码看懂谷歌支付的话。也算本菜鸟对刚跌落坑中的大神们做了垫脚的石头,早日爬出坑中。
就两个类,一个支付类,一个httpUtils工具类。
1.引用谷歌支付版本:
implementation("com.android.billingclient:billing:3.0.0")
2.支付类,不用多说。我直接上代码。
多说一句,在启动程序初始化支付的时候,会自动监听到相关事件来进行补单操作的,所以,一般注意初始化支付类的时候位置。选择在哪里初始化,看个人的,而我选择在登录账号后初始化支付类。
//这个地方是包名,我把我的包名隐藏了哈,免得你们是美女的来找我处对象
import android.app.Activity;
import android.os.Build;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import com.android.billingclient.api.AccountIdentifiers;
import com.android.billingclient.api.AcknowledgePurchaseParams;
import com.android.billingclient.api.AcknowledgePurchaseResponseListener;
import com.android.billingclient.api.BillingClient;
import com.android.billingclient.api.BillingClientStateListener;
import com.android.billingclient.api.BillingFlowParams;
import com.android.billingclient.api.BillingResult;
import com.android.billingclient.api.ConsumeParams;
import com.android.billingclient.api.ConsumeResponseListener;
import com.android.billingclient.api.Purchase;
import com.android.billingclient.api.PurchasesUpdatedListener;
import com.android.billingclient.api.SkuDetails;
import com.android.billingclient.api.SkuDetailsParams;
import com.android.billingclient.api.SkuDetailsResponseListener;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* 谷歌支付封装类
* **/
public class GooglePay implements PurchasesUpdatedListener {
private static String TAG = "GooglePay";
/*客户端*/
private BillingClient billingClient;
private final Activity mActivity;
//是否连接成功
private boolean mIsServiceConnected;
//商品列表
private final List<Purchase> PurchaseList = new ArrayList<>();
//消耗令牌
private Set<String> mTokensToBeConsumed;
private String reqHtpps = "请求服务器验证签名并发货的地址";
private String errorUrl = "连续递增请求都失败上报日志的地址";
/**
* 初始化支付类
* @param activity
* **/
public GooglePay(Activity activity){
mActivity = activity;
if(billingClient!=null)destroy();
billingClient = BillingClient.newBuilder(mActivity).enablePendingPurchases().setListener(this).build();
Log.d(TAG, "开始设置信息");
startServiceConnection(new Runnable() { //连接 GooglePlay服务器
@Override
public void run() {
Log.d(TAG, "设置客户端成功,开始请求商品库存");
OnQueryPurchases();
}
});
}
/**
* 连接谷歌服务器
* @param executeOnSuccess 连接上后执行回调的方法
* **/
public void startServiceConnection(final Runnable executeOnSuccess){
billingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(BillingResult billingResult) {
Log.d(TAG, "Setup finished. Response code: " + billingResult.getResponseCode());
if(billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK){
mIsServiceConnected = true;
if(executeOnSuccess != null){
executeOnSuccess.run();
}
}
}
@Override
public void onBillingServiceDisconnected() {
mIsServiceConnected = false;
}
});
}
/**
* 请求查询商品库存
* **/
public void OnQueryPurchases() {
Runnable queryToExecute = new Runnable() {
@Override
public void run() {
//系统当前时间
long time = System.currentTimeMillis();
//请求内购商品
Purchase.PurchasesResult purchasesResult = billingClient.queryPurchases(BillingClient.SkuType.INAPP);
Log.i(TAG, "请求请内购商品花费时间:" + (System.currentTimeMillis() - time) + "ms");
//支持订阅
if(areSubscriptionsSupported()){
Purchase.PurchasesResult subscriptionResult = billingClient.queryPurchases(BillingClient.SkuType.SUBS);
Log.i(TAG, "请求订阅商品后花费的时间: "
+ (System.currentTimeMillis() - time) + "ms");
if(subscriptionResult.getResponseCode() == BillingClient.BillingResponseCode.OK){