首页 > 编程语言 >在直播系统源码中接入谷歌支付

在直播系统源码中接入谷歌支付

时间:2023-08-09 16:15:03浏览次数:37  
标签:TAG billingResult 谷歌 param 直播 billingListener 源码 null public

支付在直播系统源码中有很重要的作用,在直播平台中,送礼物、买东西等很多功能都需要用到支付这个功能,支付方式上的接入服务也是越来越来,下面就给大家介绍下载直播系统源码中接入谷歌支付的过程。

android同胞我相信很多人跟我一样谷歌支付运行自己的直播系统源码的时候调用支付发现都是出现一个问题签名不同我们今天就来解决这个问题先正常导入接入流程后面会提到问题的解决

1、直播系统源码中,首先,导入依赖

//谷歌支付
    def billing_version = "5.0.0"
    implementation "com.android.billingclient:billing-ktx:$billing_version"
   

2、直播系统源码中清淡文件添加权限

 

<uses-permission android:name="com.android.vending.BILLING" />
<uses-permission android:name="com.farsitel.bazaar.permission.PAY_THROUGH_BAZAAR" />

3、直播系统源码中代码接入kotlin的代码是在activity里面写

companion object {
        private val billProxy = GoogleBillHelper()
        private var billingListenerImpl: GoogleBillingListenerImpl? = null
    }
//初始化
billingListenerImpl = GoogleBillingListenerImpl(this)
        //建立连接
        GoogleBillingManager.getInstance().createClient(this)
//调用方法
                onClickGooglePlay()
/**
     * 点击购买
     * 换起Google 支付面前 ,需要查询是否有对应的APP商品
     * @param view
     */
    private fun onClickGooglePlay() {
        billProxy
            .onQuerySkuDetailsAsync(
                billingListenerImpl,
                BillingClient.ProductType.INAPP,
                "fzvip_weak")
    }
    //事件监听
    private class GoogleBillingListenerImpl(private val activity: Activity) : GoogleBillingListener {
        /**
         * 产品查询成功
         *
         * @param list
         */
        override fun onProductDetailsSus(list: List<ProductDetails>) {
            if (null == list || list.size <= 0) {
                Log.e("TAG", "没有查询到相关产品~~~~")
                return
            }
            //查询方法中只传了一个商品,所以直接取第一个了
            //根据实际情况处理~
            Log.e(TAG, "onProductDetailsSus: " )
            list.forEach {
                Log.e(TAG, "onProductDetailsSus: "+it )
                billProxy.onOpenGooglePlay(this, activity, it)
            }
        }
        /**
         * 购买监听
         *
         * @param result
         * @param purchases
         */
        override fun onPurchasesUpdated(result: BillingResult?, purchases: MutableList<Purchase>?) {
            Log.e(TAG, "onPurchasesUpdated: "+result?.responseCode )
            Log.e(TAG, "onPurchasesUpdated: "+result?.debugMessage )
            if (null == purchases || purchases.size == 0) {
                return
            }
            //循环调用消耗
            for (purchase in purchases) {
                billProxy.onConsumeAsync(this, purchase)
            }
        }
        /**
         * 消费监听
         * @param purchaseToken
         */
        override fun onConsumeSus(purchaseToken: String) {
            Log.e("TAG", "消费结束,处理自己的业务逻辑~~~")
            //去与后台验证。处理APP的页面逻辑, 比如充值后发放金币啥的~~~
        }
    }
    override fun onDestroy() {
        super.onDestroy()
        //结束连接
        GoogleBillingManager.getInstance().endConn()
    }

4、直播系统源码中支付的类和接口直接用就可以

1、第一个类

 

/**
 * @author by JHY
 * Date: 2023/4/20 15:40
 * Desc:支付的具体操作
 * 1.查询
 * 2.购买
 * 3.消费
 */
public class GoogleBillHelper {
    public static final String TAG = GoogleBillHelper.class.getSimpleName();
    /**
     * 查询商品详情
     *
     * @param billingListener : 接口监听
     * @param productIds      :商品id 。对应Google 后台的
     * @param productType     :取值
     *                        BillingClient.ProductType.INAPP(一次性商品)
     *                        BillingClient.ProductType.SUBS(订阅)
     */
    public void onQuerySkuDetailsAsync(GoogleBillingListener billingListener, String productType, String... productIds) {
        if (null == productIds || productIds.length == 0
                || !GoogleBillingManager.getInstance().isReady()
        ) {
            return;
        }
        List<QueryProductDetailsParams.Product> skuList = new ArrayList<>();
        for (String productId : productIds) {
            QueryProductDetailsParams.Product product = QueryProductDetailsParams
                    .Product.newBuilder()
                    .setProductId(productId)
                    .setProductType(productType)
                    .build();
            //添加对应的 产品id 去查询详情
            skuList.add(product);
        }
        QueryProductDetailsParams params = QueryProductDetailsParams
                .newBuilder()
                .setProductList(skuList)
                .build();
        GoogleBillingManager.getInstance().getBillingClient().queryProductDetailsAsync(params, (billingResult, list) -> {
            if (BillingClient.BillingResponseCode.OK == billingResult.getResponseCode()) {
                if (null != billingListener) {
                    billingListener.onProductDetailsSus(list);
                }
            } else {
                Log.e("TAG", "code : " + billingResult.getResponseCode() + " message : " + billingResult.getDebugMessage());
            }
        });
    }
    /**
     * 打开支付面板
     *
     * @param billingListener
     * @param activity
     * @param details
     */
    public void onOpenGooglePlay(GoogleBillingListener billingListener, Activity activity, ProductDetails details) {
        Log.e(TAG, "onOpenGooglePlay: ");
        if (null == details) {
            return;
        }
        List<BillingFlowParams.ProductDetailsParams> params = new ArrayList<>();
        //根据自己的判断是否是连续包月还是一次性消费连续包月需要添加setOfferToken不加不能调谷歌支付面板
        //就是一次性商品是一个商品连续包月的话里面有优惠卷
        if (details.getProductId().equals("fzvip_android_succession_quarter")) {
            //添加购买数据
            BillingFlowParams.ProductDetailsParams productDetailsParams = BillingFlowParams.ProductDetailsParams
                    .newBuilder()
                    .setProductDetails(details)
                    .setOfferToken(details.getSubscriptionOfferDetails().get(0).getOfferToken())
                    .build();
            params.add(productDetailsParams);
        } else {
            BillingFlowParams.ProductDetailsParams productDetailsParams = BillingFlowParams.ProductDetailsParams
                    .newBuilder()
                    .setProductDetails(details)
                    .build();
            params.add(productDetailsParams);
        }
        SharedPreferences mProductId = activity.getSharedPreferences("ProductId", Context.MODE_PRIVATE);
        String mProductId1 = mProductId.getString("mProductId", "");
//
        BillingFlowParams billingFlowParams = BillingFlowParams.newBuilder()
                .setProductDetailsParamsList(params)
                .setObfuscatedAccountId(mProductId1)//Uid
                .build();
        //响应code 码
        int responseCode = GoogleBillingManager.getInstance().getBillingClient().launchBillingFlow(activity, billingFlowParams).getResponseCode();
        Log.e(TAG, "onOpenGooglePlay: " + responseCode);
        //成功换起
        if (BillingClient.BillingResponseCode.OK == responseCode) {
            //添加购买监听
            GoogleBillingManager.getInstance().setBillingListener(billingListener);
        }
    }
    
   /**
     * 消费商品
     * 对于购买类型的商品需要手动调用一次消费方法 (目的:用户可以再次购买此商品)
     *
     * @param billingListener
     * @param purchase
     */
    public void onConsumeAsync(GoogleBillingListener billingListener, Purchase purchase, Activity activity) {
        QMUITipDialog tipDialog = new QMUITipDialog.Builder(activity)
                .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING)
                .setTipWord("正在加载")
                .create();
        tipDialog.show();
        if (!GoogleBillingManager.getInstance().isReady()) {
            return;
        }
        ConsumeParams consumeParams =
                ConsumeParams.newBuilder()
                        .setPurchaseToken(purchase.getPurchaseToken())
                        .build();
        ConsumeResponseListener listener = (billingResult, purchaseToken) -> {
            if (billingResult.getResponseCode() == 5 && BillingClient.BillingResponseCode.OK == 0) {
                //连续订阅
                if (null != billingListener) {
                    tipDialog.dismiss();
                    billingListener.onConsumeSus(purchaseToken);
                } else {
                    tipDialog.dismiss();
                    Log.e(TAG, "消费失败 code : " + billingResult.getResponseCode() + " message : " + billingResult.getDebugMessage());
                }
            }
            //一次性消费
            if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                if (null != billingListener) {
                    tipDialog.dismiss();
                    billingListener.onConsumeSus(purchaseToken);
                } else {
                    tipDialog.dismiss();
                    Log.e(TAG, "消费失败 code : " + billingResult.getResponseCode() + " message : " + billingResult.getDebugMessage());
                }
            }
        };
        GoogleBillingManager.getInstance().getBillingClient().consumeAsync(consumeParams, listener);
    }
}

2、第二个类

/**
 * @author by JHY
 * Date: 2023/4/20 15:40
 * Desc:Google 支付管理
 */
public class GoogleBillingManager {
    private static GoogleBillingManager instance;
    private BillingClient billingClient;
    private GoogleBillingListener billingListener;
    private GoogleBillingManager() {
    }
    public static GoogleBillingManager getInstance() {
        if (instance == null) {
            synchronized (GoogleBillingManager.class) {
                if (instance == null) {
                    instance = new GoogleBillingManager();
                }
            }
        }
        return instance;
    }
    /**
     * 创建支付客户端
     */
    public void createClient(Context context) {
        if (null == context) {
            return;
        }
        billingClient = BillingClient.newBuilder(context.getApplicationContext())
                .enablePendingPurchases()
                .setListener(new PurchasesUpdatedListener() {
                    @Override
                    public void onPurchasesUpdated(@NonNull BillingResult billingResult, @Nullable List<Purchase> purchases) {
                        if (null != billingListener) {
                            billingListener.onPurchasesUpdated(billingResult, purchases);
                        }
                    }
                })
                .build();
        //启动支付连接
        startConn();
    }
    public BillingClient getBillingClient() {
        return billingClient;
    }
    /**
     * 添加监听事件
     */
    public void setBillingListener(GoogleBillingListener billingListener) {
        this.billingListener = billingListener;
    }
    /**
     * 是否准备好了
     *
     * @return
     */
    public boolean isReady() {
        return !(null == billingClient || !billingClient.isReady());
    }
    /**
     * 启动连接
     */
    private void startConn() {
        if (isReady()) {
            return;
        }
        billingClient.startConnection(new BillingClientStateListener() {
            @Override
            public void onBillingSetupFinished(BillingResult billingResult) {
                if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                    Log.e("TAG", "连接成功,可以开始操作了~~~");
                }
            }
            @Override
            public void onBillingServiceDisconnected() {
                //连接失败。 可以尝试调用 startConnection 重新建立连接
                Log.e("TAG", "连接失败");
            }
        });
    }
    /**
     * 结束连接
     */
    public void endConn() {
        if (null != billingClient) {
            billingClient.endConnection();
        }
    }
}

3、接口

 

/**
 * @author by JHY
 * Date: 2023/4/20 15:40
 * Desc:监听
 */
public interface GoogleBillingListener {
    /**
     * 购买监听
     *
     * @param result
     * @param purchases
     */
     void onPurchasesUpdated(BillingResult result, List<Purchase> purchases);
    /**
     * 查询商品详情成功
     *
     * @param list
     */
    void onProductDetailsSus(List<ProductDetails> list);
    /**
     * 商品消费成功
     *
     * @param purchaseToken
     */
    void onConsumeSus(String purchaseToken);
}

重点总结:这些东西写完发现调用完了之后开始支付如果运行我们android studio上面的app根本行不通无法支付只能出来弹框他不能成功唤起支付页面、解决的话很简单就是我们不安装自己的去安装Google play平台上面我们上传上去的app光说可能听不太懂我们直接上图片

1、我们直接点击自己的上传的app

2、查看自己需要的版本

3、下载apk就可以了

4、弹框下载apk就可以测试了

以上就是 在直播系统源码中接入谷歌支付,更多内容欢迎关注之后的文章。

 

标签:TAG,billingResult,谷歌,param,直播,billingListener,源码,null,public
From: https://www.cnblogs.com/yunbaomengnan/p/17617081.html

相关文章

  • fastapi后台任务模块<BackgroundTasks>源码理解
      该文档主要对fastapi的后台模块《BackgroundTasks》一些源码的理解,这样也可以加深理解异步及后台任务处理的理解。 使用导入例子: fromfastapiimport BackgroundTasks  fromfastapiimportBackgroundTasks,FastAPIapp=FastAPI()defwrite_file(data:st......
  • Wordpress:如何放置谷歌GTM代码?
    使用Wordpress建站需要应用谷歌的GTM代码进行监测用户行为,那么如何安装GTM代码呢?分为两种,一.使用插件进行安装二.直接编辑代码Header模块进行安装。先看看谷歌GTM的安装要求:注意:1.script部分需要安装在head标签之内;2.noscript部分需要安装在body开始标签之后。 方法一......
  • 智慧工地源码,基于Vue+Spring Cloud +UniApp框架开发
    源码技术架构:微服务+JavaVue+SpringCloud+UniApp+MySql智慧工地管理平台是依托物联网、互联网、AI、可视化建立的大数据管理平台,是一种全新的管理模式,能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。智慧工地管理平台功能包括:劳务实名制管理系统、监测系统、区域安......
  • 程绩_谈谈谷歌seo的技巧
    当谈到谷歌SEO(搜索引擎优化)时,有一些技巧可以帮助你提高网站在谷歌搜索结果中的排名。以下是一些值得注意的技巧:1.优质内容:为了在谷歌排名中取得成功,关键是提供高质量、有价值的内容。确保你的网站内容与用户的需求相匹配,并且能够解决他们的问题。2.关键词研究:通过进行关键词研......
  • Bert Pytorch 源码分析:五、模型架构简图 REV1
    注意力FFNTF块整体架构......
  • 国标GB28181视频平台LntonGBS(源码版)国标平台级联时,通道上传上级宇视平台无法接收的问
    LntonGBS是基于公安部推出的GB/T28181协议开发的视频平台,在安防监控领域应用广泛。下面是一些关于LntonGBS平台的主要特点:GB/T28181协议兼容性、视频直播和转码、云端录像和存储、语音对讲和警告功能、平台级联功能。通过以上的功能和特点,LntonGBS平台能够满足安防监控领域各类场景......
  • 山东布谷科技直播程序源码使用Redis进行服务器横向扩展
    当今,直播程序源码平台作为新媒体时代主流,受到了世界各地人民的喜爱,这也使得直播程序源码平台用户数量的庞大,也难免会出现大量用户同时访问服务器,使服务器过载的情况,当服务器承受不住的时候,可能就会造成服务器崩溃,为了应对这一问题,直播程序源码的开发人员在开发服务器的时候就要去使......
  • 山东布谷科技直播程序源码使用Redis进行服务器横向扩展
    当今,直播程序源码平台作为新媒体时代主流,受到了世界各地人民的喜爱,这也使得直播程序源码平台用户数量的庞大,也难免会出现大量用户同时访问服务器,使服务器过载的情况,当服务器承受不住的时候,可能就会造成服务器崩溃,为了应对这一问题,直播程序源码的开发人员在开发服务器的时候就要去......
  • Vue接入谷歌广告(Google Adsense)
    1.注册账户首先你要拥有一个google账号,点击注册谷歌账号,点击个人账号根据提示一步一步来即可注册成功。(当然你需要魔法才可以正常访问谷歌服务)2.补充账户信息,申请广告授权点击进入GoogleAdsense后台,在左侧导航栏“首页”进行个人信息完善,你必须完善好个人信息之后才可以进行......
  • nmon源码安装使用鲲鹏ARM架构下
     需要在信创环境使用nmon查看系统版本 安装依赖yuminstallwgetncurses-devel-y在准备放置nmon的位置创建一个新的文件夹并进入该文件mkdirnmoncdnmon下载源码相关文件wgethttp://sourceforge.net/projects/nmon/files/lmon16j.cwgethttp://sourceforge.......