谷歌支付接入流程(一次性支付,连续订阅)

这篇具有很好参考价值的文章主要介绍了谷歌支付接入流程(一次性支付,连续订阅)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

android同胞我相信很多人跟我一样谷歌支付运行自己的app的时候调用支付发现都是出现一个问题签名不同我们今天就来解决这个问题
先正常导入接入流程后面会提到问题的解决
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
谷歌充值接入,android

2、查看自己需要的版本
谷歌充值接入,android

3、下载apk就可以了

谷歌充值接入,android

4、弹框下载apk就可以测试了
谷歌充值接入,android

到这里基本就可以了如果还有别的我们可以一起讨论文章来源地址https://www.toymoban.com/news/detail-644965.html

到了这里,关于谷歌支付接入流程(一次性支付,连续订阅)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 谷歌发布Self-Debug方法,让大模型学会自己修bug,一次性生成正确代码

    文 | 智商掉了一地 你有没有想过,让一台计算机诊断和修复自己生成的错误代码?一篇最新的研究论文介绍了一种名为 Self-Debugging 的技术,通过在生成的代码中添加自解释的信息,让计算机像一个可以自己修复代码的程序员一样调试自己的 BUG。 随着大型语言模型(LLMs)在

    2023年04月19日
    浏览(73)
  • uniapp - 微信小程序平台模板消息订阅功能,唤起订阅模板消息弹框、微信公众号向用户发送 “服务通知“ 实现全过程示例代码,支持一次性订阅与永久性订阅(注释详细,一键复制开箱即用)

    本博客实现了uniapp微信小程序端,详细实现公众号订阅通知模板消息完整示例源码,一次性订阅与永久订阅均可,注释详细新手一看就懂! 效果如图所示,uniapp编译的微信小程序内点击按钮后,唤起模板消息订阅申请弹框,后续微信内会收到通知。

    2024年02月13日
    浏览(67)
  • python 一次性删除列表(list)的空白元素(空内容) 或者 一次性删除列表(list)中的指定元素

    看看下述代码: 输出: 当你遇见这种情况,有哪些方法来去除里面的空内容呢(即 \\\'\\\' )? 1.1 删除空内容(方法一) : 输出: 1.2 删除空内容(方法二) : 需要 配合 lambda 表达式 一起使用! 输出: 2.3 删除指定内容 : 输出: 注 :此方法既可以删除空元素,也可以删除指

    2024年02月03日
    浏览(94)
  • 《一次性分割一切》阅读笔记

    目录 0 体验 1 摘要 2 十个问题 参考文献 体验地址 :SEEM - a Hugging Face Space by xdecoder 体验结果 : 将哈士奇和汽车人从图片中分割出来。 尽管对于交互式人工智能系统的需求不断增长,但在视觉理解(例如分割)中的人工智能交互方面,很少有全面的研究。本文受到基于提示的

    2024年02月01日
    浏览(89)
  • 一次性打包学透 Spring

    不知从何时开始,Spring 这个词开始频繁地出现在 Java 服务端开发者的日常工作中,很多 Java 开发者从工作的第一天开始就在使用 Spring Framework,甚至有人调侃“不会 Spring 都不好意思自称是个 Java 开发者”。 之所以出现这种局面,源于 Spring 是一个极为优秀的一站式集成框架

    2023年04月19日
    浏览(64)
  • Python:一次性输出多个量

    有的时候我们在输入一个字符串时,需要在中间加一个int类型变量时,如果一段一段输出就要写三个print,非常麻烦。今天bug君就给大家讲讲如何在Python里一次性输出多个量。 粽所粥汁,在Python里输出需要写 print(\\\"输出内容\\\") ,而输出一个变量则需要写 print(变量名) 。 注意:

    2024年02月04日
    浏览(122)
  • 如何一次性启动多个SpringBoot项目

    在做微服务这块的架构设计的时候,当微服务数量越来越多的时候,本地启动各个服务的时候,可能得手动启动每个启动类。这样就很麻烦,因此记录一下如何在 idea 里面一键启动所有的项目。 比如我项目里面有5个微服务:那么就对应了5个启动类。 1.项目右上角编辑: 2.点

    2024年02月16日
    浏览(76)
  • charles证书安装,一次性说明白

    windows上安装好charles后,需要给软件安装证书。 1、点击help - SSL proxying,选择第二个install Charles Root Certificate证书安装   2、如果以前安装过证书,但是过期了(有效期一般1年),证书界面会显示过期字样,此时就要先点击一下Reset Charles Root Certificate,然后再点击第一步中的

    2024年02月05日
    浏览(113)
  • Git仓库实现:一次性提交多个文件

    首先是建立服务器与仓库的连接,不会操作的小伙伴可以看这一篇文章,链接: Git仓库 保姆级教程 选择文件夹,使用git clone上传的仓库,点击进去 输入命令行: git commit -m \\\" \\\" ,双引号一般填入描述或者版本信息,但是若要提交多个文件,则写入 \\\"add more files\\\" 有问题欢迎随时

    2024年02月12日
    浏览(69)
  • 一次性处理全局键盘好用工具IQKeyboardManager

    在一个完整的项目中,输入框是用到频率相当高的基础UI控件,UITextfield UITextView等经常一个页面就要多次出现,如何处理键盘弹出和回收释放是我们不可避免遇到的问题。 当输入框位于屏幕底部时,弹起的键盘很可能覆盖输入框,导致用户看不到输入结果,体验较差… IQKe

    2024年02月15日
    浏览(85)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包