准备工作

1、手机上安装Google服务
2、一个绑定信用卡的Google账号;
3、Google play客户端;
4.、Google Play开发者后台创建应用
5、科学上网的工具
…等等 这些就不详细说 主要写一下客户端sdk接入

客户端接入

集成依赖库(支付)

module的 build.gradle 添加下面代码(这里我用的是4.0版本)

 implementation "com.android.billingclient:billing:4.0.0"

初始化 BillingClient

 /*** 初始化BillingClient*/public void initBillingClient() {if(purchasesUpdatedListener==null){purchasesUpdatedListener = new PurchasesUpdatedListener() {@Overridepublic void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {// To be implemented in a later section.//购买完成回调if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && purchases != null) {Log.e("TAG", "购买成功 ");for (Purchase purchase : purchases) {Log.e("TAG", "购买成功111 ");handlePurchase(purchase);}} else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.USER_CANCELED) {// Handle an error caused by a user cancelling the purchase flow.Log.e("TAG", "购买成功111 ");} else {// Handle any other error codes.AppActivity.appActivity.runOnGLThread(new Runnable() {@Overridepublic void run() {Cocos2dxJavascriptJavaBridge.evalString("SystemBridge.OnPayFail()");}});}}};}if(mBillingClient==null){mBillingClient = BillingClient.newBuilder(AppActivity.appActivity).setListener(purchasesUpdatedListener).enablePendingPurchases().build();}startConnection();}

与 Google Play 建立连接

/*** 连接到google*/private void startConnection() {Log.e("TAG", "startConnection: 连接" );mBillingClient.startConnection(new BillingClientStateListener() {@Overridepublic void onBillingSetupFinished(@NonNull BillingResult billingResult) {Log.e("TAG", "startConnection: 连接成功111: " + billingResult.getResponseCode());//链接成功最好去查询订单,做掉单处理if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {Log.e("TAG", "startConnection: 连接成功: ");s_isConnectGooglePlay = true;
//                    querySkuDetailsAsync();queryAndConsumePurchase();}}@Overridepublic void onBillingServiceDisconnected() {Log.e("TAG", "startConnection: 连接失败: ");s_isConnectGooglePlay = false;startConnection();}});}

购买商品(这个函数由ts这边调用)

 /*** 购买商品*/public static void GooglePay(String googleId,String orderId) {Log.e("TAG", "GooglePay: " + googleId + "orderId:"+ orderId);List skuList = new ArrayList<>();skuList.add(googleId);SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);GooglePay.getInstace().mBillingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() {@Overridepublic void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> skuDetailsList) {Log.e("TAG", "billingResult " + billingResult.getResponseCode() );Log.e("TAG", "onSkuDetailsResponse: "+ skuDetailsList);if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && skuDetailsList != null) {Log.e("TAG", "启动购买 ");for (SkuDetails skuDetails : skuDetailsList) {
//                        if (googleId.equals(skuDetails.getSku())) {Log.e("TAG", "启动购买 " + skuDetails.getSku());BillingFlowParams flowParams = BillingFlowParams.newBuilder().setSkuDetails(skuDetails).setObfuscatedAccountId(orderId).build();int responseCode = GooglePay.getInstace().mBillingClient.launchBillingFlow(AppActivity.appActivity, flowParams).getResponseCode();if (responseCode == BillingClient.BillingResponseCode.OK) {Log.i("TAG", "成功启动google支付");} else {//BILLING_RESPONSE_RESULT_OK    0   成功//BILLING_RESPONSE_RESULT_USER_CANCELED   1   用户按上一步或取消对话框//BILLING_RESPONSE_RESULT_SERVICE_UNAVAILABLE   2   网络连接断开//BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE 3   所请求的类型不支持 Google Play 结算服务 AIDL 版本//BILLING_RESPONSE_RESULT_ITEM_UNAVAILABLE    4   请求的商品已不再出售//BILLING_RESPONSE_RESULT_DEVELOPER_ERROR 5   提供给 API 的参数无效。此错误也可能说明应用未针对 Google Play 结算服务正确签名或设置,或者在其清单中缺少必要的权限。//BILLING_RESPONSE_RESULT_ERROR   6   API 操作期间出现严重错误//BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED  7   未能购买,因为已经拥有此商品//BILLING_RESPONSE_RESULT_ITEM_NOT_OWNED   8   未能消费,因为尚未拥有此商品Log.i("TAG", "LaunchBillingFlow Fail,code=" + responseCode);}//                        }}}}});}

消耗商品

 //消耗商品private void handlePurchase(Purchase purchase) {// Purchase retrieved from BillingClient#queryPurchasesAsync or your PurchasesUpdatedListener.
//         Purchase purchase = ...;// Verify the purchase.// Ensure entitlement was not already granted for this purchaseToken.// Grant entitlement to the user.ConsumeParams consumeParams = ConsumeParams.newBuilder().setPurchaseToken(purchase.getPurchaseToken()).build();ConsumeResponseListener listener = new ConsumeResponseListener() {@Overridepublic void onConsumeResponse(BillingResult billingResult, String purchaseToken) {if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {// Handle the success of the consume operation.Log.e("TAG", "onConsumeResponse: "+purchaseToken );AppActivity.appActivity.runOnGLThread(new Runnable() {@Overridepublic void run() {Cocos2dxJavascriptJavaBridge.evalString("SystemBridge.OnGooglePaySuccess(\""+purchaseToken+ "\")");}});}}};mBillingClient.consumeAsync(consumeParams, listener);}

查询购买

 //查询最近的购买交易,并消耗商品private void queryAndConsumePurchase() {//queryPurchases() 方法会使用 Google Play 商店应用的缓存,而不会发起网络请求GooglePay.getInstace().mBillingClient.queryPurchaseHistoryAsync(BillingClient.SkuType.INAPP,new PurchaseHistoryResponseListener() {@Overridepublic void onPurchaseHistoryResponse(BillingResult billingResult,List<PurchaseHistoryRecord> purchaseHistoryRecordList) {{if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && purchaseHistoryRecordList != null) {for (PurchaseHistoryRecord purchaseHistoryRecord : purchaseHistoryRecordList) {// Process the result.//确认购买交易,不然三天后会退款给用户try {Purchase purchase = new Purchase(purchaseHistoryRecord.getOriginalJson(), purchaseHistoryRecord.getSignature());if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) {//消耗品 开始消耗handlePurchase(purchase);//确认购买交易  这里是针对订阅类型商品 由于我这里没有 暂时注释
//                                            if (!purchase.isAcknowledged()) {
//                                                acknowledgePurchase(purchase);
//                                            }}} catch (JSONException e) {e.printStackTrace();}}}}}});}

完整代码

我是直接新建一个google pay 类 可以直接复制拿过去用 主要通过Cocos2dxJavascriptJavaBridge.evalString(“SystemBridge.OnGooglePaySuccess(”"+purchaseToken+ “”)"); 把purchaseToken回传给服务器验证就可以了

package org.cocos2dx.javascript;import android.os.Handler;
import android.support.annotation.NonNull;
import android.util.Log;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.PurchaseHistoryRecord;
import com.android.billingclient.api.PurchaseHistoryResponseListener;
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.cocos2dx.lib.Cocos2dxJavascriptJavaBridge;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONStringer;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class GooglePay {public PurchasesUpdatedListener purchasesUpdatedListener = null;public BillingClient  mBillingClient = null;private Handler handler = new Handler();private final int consumeImmediately = 0;private final int consumeDelay = 1;private  boolean s_isConnectGooglePlay = false;private Map<String, SkuDetails> skuDetailsMap = new HashMap();public static GooglePay Instance;public static GooglePay getInstace(){if(Instance==null){Instance = new GooglePay();}return Instance;}/*** 初始化BillingClient*/public void initBillingClient() {if(purchasesUpdatedListener==null){purchasesUpdatedListener = new PurchasesUpdatedListener() {@Overridepublic void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {// To be implemented in a later section.//购买完成回调if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && purchases != null) {Log.e("TAG", "购买成功 ");for (Purchase purchase : purchases) {Log.e("TAG", "购买成功111 ");handlePurchase(purchase);}} else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.USER_CANCELED) {// Handle an error caused by a user cancelling the purchase flow.Log.e("TAG", "购买成功111 ");} else {// Handle any other error codes.AppActivity.appActivity.runOnGLThread(new Runnable() {@Overridepublic void run() {Cocos2dxJavascriptJavaBridge.evalString("SystemBridge.OnPayFail()");}});}}};}if(mBillingClient==null){mBillingClient = BillingClient.newBuilder(AppActivity.appActivity).setListener(purchasesUpdatedListener).enablePendingPurchases().build();}startConnection();}/*** 连接到google*/private void startConnection() {Log.e("TAG", "startConnection: 连接" );mBillingClient.startConnection(new BillingClientStateListener() {@Overridepublic void onBillingSetupFinished(@NonNull BillingResult billingResult) {Log.e("TAG", "startConnection: 连接成功111: " + billingResult.getResponseCode());//链接成功最好去查询订单,做掉单处理if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {Log.e("TAG", "startConnection: 连接成功: ");s_isConnectGooglePlay = true;
//                    querySkuDetailsAsync();queryAndConsumePurchase();}}@Overridepublic void onBillingServiceDisconnected() {Log.e("TAG", "startConnection: 连接失败: ");s_isConnectGooglePlay = false;startConnection();}});}/*** 查询应用内商品详细信息 并且返回给客户端显示价格*/public void querySkuDetailsAsync() {Log.e("TAG", "GooglePay: ");List skuList = new ArrayList<>();
//        skuList.add("premium_upgrade");
//        skuList.add("gas");SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);//INAPP应用内支付mBillingClient.querySkuDetailsAsync(params.build(),new SkuDetailsResponseListener() {@Overridepublic void onSkuDetailsResponse(BillingResult billingResult,List<SkuDetails> skuDetailsList) {
//                int resultCode = billingResult.getResponseCode();// Process the result.Log.e("TAG", "onSkuDetailsResponse: "+billingResult );if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.SERVICE_DISCONNECTED) {//未连接s_isConnectGooglePlay = false;return;}else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {for(SkuDetails skuDetails : skuDetailsList)if (!skuDetailsMap.containsKey(skuDetails.getSku())) {skuDetailsMap.put(skuDetails.getSku(), skuDetails);}}}});}/*** 购买商品*/public static void GooglePay(String googleId,String orderId) {Log.e("TAG", "GooglePay: " + googleId + "orderId:"+ orderId);List skuList = new ArrayList<>();skuList.add(googleId);SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);GooglePay.getInstace().mBillingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() {@Overridepublic void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> skuDetailsList) {Log.e("TAG", "billingResult " + billingResult.getResponseCode() );Log.e("TAG", "onSkuDetailsResponse: "+ skuDetailsList);if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && skuDetailsList != null) {Log.e("TAG", "启动购买 ");for (SkuDetails skuDetails : skuDetailsList) {
//                        if (googleId.equals(skuDetails.getSku())) {Log.e("TAG", "启动购买 " + skuDetails.getSku());BillingFlowParams flowParams = BillingFlowParams.newBuilder().setSkuDetails(skuDetails).setObfuscatedAccountId(orderId).build();int responseCode = GooglePay.getInstace().mBillingClient.launchBillingFlow(AppActivity.appActivity, flowParams).getResponseCode();if (responseCode == BillingClient.BillingResponseCode.OK) {Log.i("TAG", "成功启动google支付");} else {//BILLING_RESPONSE_RESULT_OK    0   成功//BILLING_RESPONSE_RESULT_USER_CANCELED   1   用户按上一步或取消对话框//BILLING_RESPONSE_RESULT_SERVICE_UNAVAILABLE   2   网络连接断开//BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE 3   所请求的类型不支持 Google Play 结算服务 AIDL 版本//BILLING_RESPONSE_RESULT_ITEM_UNAVAILABLE    4   请求的商品已不再出售//BILLING_RESPONSE_RESULT_DEVELOPER_ERROR 5   提供给 API 的参数无效。此错误也可能说明应用未针对 Google Play 结算服务正确签名或设置,或者在其清单中缺少必要的权限。//BILLING_RESPONSE_RESULT_ERROR   6   API 操作期间出现严重错误//BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED  7   未能购买,因为已经拥有此商品//BILLING_RESPONSE_RESULT_ITEM_NOT_OWNED   8   未能消费,因为尚未拥有此商品Log.i("TAG", "LaunchBillingFlow Fail,code=" + responseCode);}//                        }}}}});}//消耗商品private void handlePurchase(Purchase purchase) {// Purchase retrieved from BillingClient#queryPurchasesAsync or your PurchasesUpdatedListener.
//         Purchase purchase = ...;// Verify the purchase.// Ensure entitlement was not already granted for this purchaseToken.// Grant entitlement to the user.ConsumeParams consumeParams = ConsumeParams.newBuilder().setPurchaseToken(purchase.getPurchaseToken()).build();ConsumeResponseListener listener = new ConsumeResponseListener() {@Overridepublic void onConsumeResponse(BillingResult billingResult, String purchaseToken) {if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {// Handle the success of the consume operation.Log.e("TAG", "onConsumeResponse: "+purchaseToken );AppActivity.appActivity.runOnGLThread(new Runnable() {@Overridepublic void run() {Cocos2dxJavascriptJavaBridge.evalString("SystemBridge.OnGooglePaySuccess(\""+purchaseToken+ "\")");}});}}};mBillingClient.consumeAsync(consumeParams, listener);}//查询最近的购买交易,并消耗商品private void queryAndConsumePurchase() {//queryPurchases() 方法会使用 Google Play 商店应用的缓存,而不会发起网络请求GooglePay.getInstace().mBillingClient.queryPurchaseHistoryAsync(BillingClient.SkuType.INAPP,new PurchaseHistoryResponseListener() {@Overridepublic void onPurchaseHistoryResponse(BillingResult billingResult,List<PurchaseHistoryRecord> purchaseHistoryRecordList) {{if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && purchaseHistoryRecordList != null) {for (PurchaseHistoryRecord purchaseHistoryRecord : purchaseHistoryRecordList) {// Process the result.//确认购买交易,不然三天后会退款给用户try {Purchase purchase = new Purchase(purchaseHistoryRecord.getOriginalJson(), purchaseHistoryRecord.getSignature());if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) {//消耗品 开始消耗handlePurchase(purchase);//确认购买交易
//                                            if (!purchase.isAcknowledged()) {
//                                                acknowledgePurchase(purchase);
//                                            }//TODO:这里可以添加订单找回功能,防止变态用户付完钱就杀死App的这种}} catch (JSONException e) {e.printStackTrace();}}}}}});}
}

这里支付基本上完工了!

cocos creator Android 接入Google支付sdk相关推荐

  1. cocos creator Android 接入Google登陆sdk

    准备工作 这里就不详细介绍,主要说一下客户端sdk接入 1.手机上安装Google服务 2.一个绑定信用卡的Google账号: 3.Google play客户端: 4..Google Play开发者后 ...

  2. Cocos Creator Android 平台 Google 原生登录

    在海外项目中,我们通常需要接入 Google 帐号登录,这样可以提高应用使用率. 下面以 Android 平台 接入 Google 原生登录为例,进行详细说明. 一.准备工作 1.需要 Android ...

  3. Unity接入微信支付SDK

    最近1年转了UE开发,博客更新的比较少,技术栈宽了不少,以后有空尽量多更新,也方便总结记忆 Unity接入微信支付整个过程坑比较多,网上之前的教程要么比较老,要么比较零碎,只能东拼西凑摸索,跑通后还是 ...

  4. Android 接入支付宝支付实现

    接上篇android接入微信支付文章,这篇我们带你来接入支付宝支付服务 简介 首先要说明的是个人感觉接入支付宝比微信简单多了,很轻松的,所以同学们不要紧张~ 当然还是老规矩啦,上来肯定的贴上官网地址, ...

  5. Android接入支付宝支付实现

    接上篇android接入微信支付文章,这篇我们带你来接入支付宝支付服务 简介 首先要说明的是个人感觉接入支付宝比微信简单多了,很轻松的,所以同学们不要紧张~ 当然还是老规矩啦,上来肯定的贴上官网地址, ...

  6. Android接入stripe支付

    Android接入stripe支付 阅读之前请大家先了解流程哦(适用于先绑卡后扣款的情况) stripe国际化支付流程: 1.初始化stripe,创建stripe对象: 2.检索后台SetupInte ...

  7. cocos creator ios 接入 facebook sdk login

    主程序是cocos creator 发布ios时要接facebook登录的sdk cocos creator 发布ios版本后 按官方文档配置接入,碰到以下问题 执行 sudo gem install ...

  8. 接入Google Play SDK

    更新 好消息:Unity5.3添加了google play.Mac .AppStore.windows store的IPA接口,我们做内购日后方便多啦!关于国内渠道的接入,推荐通用SDK平台,比如an ...

  9. android 添加ga_android开发步步为营之70:android接入Google Analytics总结

    求人不如求己,今天项目里要接入Google Analytics,这个是做应用统计分析用的,可以查看当前手机活跃用户,事件点击等等数据,先看看效果: 之前eclipse里面接入已经成功,昨天项目组决定项 ...

最新文章

  1. 改变myeclipse北京颜色
  2. 模板 - FHQ - treap 无旋平衡树
  3. MySql 中锁的定义
  4. 《大型网站技术架构》1:概述
  5. linux smb 启动失败,[已解决]windows能看到smb,但是打不开
  6. Android系统下内存使用情况与监测
  7. 深圳不完全启示录之初来乍到----1
  8. Anaconda+Win10安装
  9. DreamFacotry 第4章 如何保护REST API
  10. Zend Framework实例教程三
  11. Androidstudio查不出具体哪行报错解决办法
  12. java的properties文件中的换行书写
  13. 国民经济行业分类 GB/T 4754-2017 最新2017版 代码整理
  14. 问卷分析SPSS+AMOS实证步骤
  15. 手把手教你破解无线路由器密码
  16. 世界上最伟大的巫师「咪蒙」
  17. 【Java】P1957 口算练习题—(洛谷OJ)
  18. 用Python写糖豆人小游戏 你学“废”了么?
  19. 微信公众号开发部署服务器
  20. 【FPGA】QuartusII13.0实现组合逻辑 3/8 译码器

热门文章

  1. AI边缘计算(嵌入式AI)硬件信息汇总
  2. AI电销机器人开源源码系统二次开发中
  3. 2021年高压电工考试报名及高压电工试题及解析
  4. 汽车几种变速器的结构特点
  5. 恒星物联-河道水系监测系统方案 水质监测
  6. perl mysql 数据推拉_科学网—从MySQL数据库中提取序列并进行引物设计的perl脚本 - 闫双勇的博文...
  7. 基于word2vec的虚假新闻检测系统
  8. 软件测试之Web测试方法总结
  9. 人体工程学游戏椅行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  10. 130个微信小程序源码资源免费领取