国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

谷歌支付接入流程(一次性支付,連續(xù)訂閱)

這篇具有很好參考價(jià)值的文章主要介紹了谷歌支付接入流程(一次性支付,連續(xù)訂閱)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

android同胞我相信很多人跟我一樣谷歌支付運(yùn)行自己的app的時(shí)候調(diào)用支付發(fā)現(xiàn)都是出現(xiàn)一個(gè)問(wèn)題簽名不同我們今天就來(lái)解決這個(gè)問(wèn)題
先正常導(dǎo)入接入流程后面會(huì)提到問(wèn)題的解決
1、導(dǎo)入依賴(lài)

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

2、清淡文件添加權(quán)限

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

3、代碼接入kotlin的代碼是在activity里面寫(xiě)

companion object {
        private val billProxy = GoogleBillHelper()
        private var billingListenerImpl: GoogleBillingListenerImpl? = null
    }
//初始化
billingListenerImpl = GoogleBillingListenerImpl(this)
        //建立連接
        GoogleBillingManager.getInstance().createClient(this)
//調(diào)用方法
                onClickGooglePlay()
/**
     * 點(diǎn)擊購(gòu)買(mǎi)
     * 換起Google 支付面前 ,需要查詢(xún)是否有對(duì)應(yīng)的APP商品
     * @param view
     */
    private fun onClickGooglePlay() {
        billProxy
            .onQuerySkuDetailsAsync(
                billingListenerImpl,
                BillingClient.ProductType.INAPP,
                "fzvip_weak")
    }

    //事件監(jiān)聽(tīng)
    private class GoogleBillingListenerImpl(private val activity: Activity) : GoogleBillingListener {
        /**
         * 產(chǎn)品查詢(xún)成功
         *
         * @param list
         */
        override fun onProductDetailsSus(list: List<ProductDetails>) {
            if (null == list || list.size <= 0) {
                Log.e("TAG", "沒(méi)有查詢(xún)到相關(guān)產(chǎn)品~~~~")
                return
            }
            //查詢(xún)方法中只傳了一個(gè)商品,所以直接取第一個(gè)了
            //根據(jù)實(shí)際情況處理~
            Log.e(TAG, "onProductDetailsSus: " )
            list.forEach {
                Log.e(TAG, "onProductDetailsSus: "+it )
                billProxy.onOpenGooglePlay(this, activity, it)
            }
        }

        /**
         * 購(gòu)買(mǎi)監(jiān)聽(tīng)
         *
         * @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
            }
            //循環(huán)調(diào)用消耗
            for (purchase in purchases) {
                billProxy.onConsumeAsync(this, purchase)
            }
        }

        /**
         * 消費(fèi)監(jiān)聽(tīng)
         * @param purchaseToken
         */
        override fun onConsumeSus(purchaseToken: String) {
            Log.e("TAG", "消費(fèi)結(jié)束,處理自己的業(yè)務(wù)邏輯~~~")
            //去與后臺(tái)驗(yàn)證。處理APP的頁(yè)面邏輯, 比如充值后發(fā)放金幣啥的~~~
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        //結(jié)束連接
        GoogleBillingManager.getInstance().endConn()
    }

4、支付的類(lèi)和接口直接用就可以
1、第一個(gè)類(lèi)

/**
 * @author by JHY
 * Date: 2023/4/20 15:40
 * Desc:支付的具體操作
 * 1.查詢(xún)
 * 2.購(gòu)買(mǎi)
 * 3.消費(fèi)
 */
public class GoogleBillHelper {
    public static final String TAG = GoogleBillHelper.class.getSimpleName();
    /**
     * 查詢(xún)商品詳情
     *
     * @param billingListener : 接口監(jiān)聽(tīng)
     * @param productIds      :商品id 。對(duì)應(yīng)Google 后臺(tái)的
     * @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();
            //添加對(duì)應(yīng)的 產(chǎn)品id 去查詢(xún)?cè)斍?            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());
            }
        });
    }

    /**
     * 打開(kāi)支付面板
     *
     * @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<>();

        //根據(jù)自己的判斷是否是連續(xù)包月還是一次性消費(fèi)連續(xù)包月需要添加setOfferToken不加不能調(diào)谷歌支付面板
        //就是一次性商品是一個(gè)商品連續(xù)包月的話里面有優(yōu)惠卷
        if (details.getProductId().equals("fzvip_android_succession_quarter")) {
            //添加購(gòu)買(mǎi)數(shù)據(jù)
            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();
        //響應(yīng)code 碼
        int responseCode = GoogleBillingManager.getInstance().getBillingClient().launchBillingFlow(activity, billingFlowParams).getResponseCode();
        Log.e(TAG, "onOpenGooglePlay: " + responseCode);
        //成功換起
        if (BillingClient.BillingResponseCode.OK == responseCode) {
            //添加購(gòu)買(mǎi)監(jiān)聽(tīng)
            GoogleBillingManager.getInstance().setBillingListener(billingListener);
        }
    }
    
   /**
     * 消費(fèi)商品
     * 對(duì)于購(gòu)買(mǎi)類(lèi)型的商品需要手動(dòng)調(diào)用一次消費(fèi)方法 (目的:用戶可以再次購(gòu)買(mǎi)此商品)
     *
     * @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) {
                //連續(xù)訂閱
                if (null != billingListener) {
                    tipDialog.dismiss();
                    billingListener.onConsumeSus(purchaseToken);
                } else {
                    tipDialog.dismiss();
                    Log.e(TAG, "消費(fèi)失敗 code : " + billingResult.getResponseCode() + " message : " + billingResult.getDebugMessage());
                }
            }

            //一次性消費(fèi)
            if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                if (null != billingListener) {
                    tipDialog.dismiss();
                    billingListener.onConsumeSus(purchaseToken);
                } else {
                    tipDialog.dismiss();
                    Log.e(TAG, "消費(fèi)失敗 code : " + billingResult.getResponseCode() + " message : " + billingResult.getDebugMessage());
                }
            }
        };
        GoogleBillingManager.getInstance().getBillingClient().consumeAsync(consumeParams, listener);
    }
}

2、第二個(gè)類(lèi)

/**
 * @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;
    }

    /**
     * 創(chuàng)建支付客戶端
     */
    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();
        //啟動(dòng)支付連接
        startConn();
    }

    public BillingClient getBillingClient() {
        return billingClient;
    }

    /**
     * 添加監(jiān)聽(tīng)事件
     */
    public void setBillingListener(GoogleBillingListener billingListener) {
        this.billingListener = billingListener;
    }

    /**
     * 是否準(zhǔn)備好了
     *
     * @return
     */
    public boolean isReady() {
        return !(null == billingClient || !billingClient.isReady());
    }

    /**
     * 啟動(dòng)連接
     */
    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", "連接成功,可以開(kāi)始操作了~~~");
                }
            }

            @Override
            public void onBillingServiceDisconnected() {
                //連接失敗。 可以嘗試調(diào)用 startConnection 重新建立連接
                Log.e("TAG", "連接失敗");
            }
        });

    }

    /**
     * 結(jié)束連接
     */
    public void endConn() {
        if (null != billingClient) {
            billingClient.endConnection();
        }
    }
}

3、接口

/**
 * @author by JHY
 * Date: 2023/4/20 15:40
 * Desc:監(jiān)聽(tīng)
 */
public interface GoogleBillingListener {
    /**
     * 購(gòu)買(mǎi)監(jiān)聽(tīng)
     *
     * @param result
     * @param purchases
     */
     void onPurchasesUpdated(BillingResult result, List<Purchase> purchases);

    /**
     * 查詢(xún)商品詳情成功
     *
     * @param list
     */
    void onProductDetailsSus(List<ProductDetails> list);

    /**
     * 商品消費(fèi)成功
     *
     * @param purchaseToken
     */
    void onConsumeSus(String purchaseToken);
}

重點(diǎn)總結(jié):這些東西我寫(xiě)完發(fā)現(xiàn)調(diào)用完了之后開(kāi)始支付如果運(yùn)行我們android studio上面的app根本行不通無(wú)法支付只能出來(lái)彈框他不能成功喚起支付頁(yè)面、解決的話很簡(jiǎn)單就是我們不安裝自己的去安裝Google play平臺(tái)上面我們上傳上去的app光說(shuō)可能聽(tīng)不太懂我們直接上圖片
1、我們直接點(diǎn)擊自己的上傳的app
谷歌充值接入,android

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

3、下載apk就可以了

谷歌充值接入,android

4、彈框下載apk就可以測(cè)試了
谷歌充值接入,android

到這里基本就可以了如果還有別的我們可以一起討論文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-644965.html

到了這里,關(guān)于谷歌支付接入流程(一次性支付,連續(xù)訂閱)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 谷歌發(fā)布Self-Debug方法,讓大模型學(xué)會(huì)自己修bug,一次性生成正確代碼

    谷歌發(fā)布Self-Debug方法,讓大模型學(xué)會(huì)自己修bug,一次性生成正確代碼

    文 | 智商掉了一地 你有沒(méi)有想過(guò),讓一臺(tái)計(jì)算機(jī)診斷和修復(fù)自己生成的錯(cuò)誤代碼?一篇最新的研究論文介紹了一種名為 Self-Debugging 的技術(shù),通過(guò)在生成的代碼中添加自解釋的信息,讓計(jì)算機(jī)像一個(gè)可以自己修復(fù)代碼的程序員一樣調(diào)試自己的 BUG。 隨著大型語(yǔ)言模型(LLMs)在

    2023年04月19日
    瀏覽(16)
  • uniapp - 微信小程序平臺(tái)模板消息訂閱功能,喚起訂閱模板消息彈框、微信公眾號(hào)向用戶發(fā)送 “服務(wù)通知“ 實(shí)現(xiàn)全過(guò)程示例代碼,支持一次性訂閱與永久性訂閱(注釋詳細(xì),一鍵復(fù)制開(kāi)箱即用)

    uniapp - 微信小程序平臺(tái)模板消息訂閱功能,喚起訂閱模板消息彈框、微信公眾號(hào)向用戶發(fā)送 “服務(wù)通知“ 實(shí)現(xiàn)全過(guò)程示例代碼,支持一次性訂閱與永久性訂閱(注釋詳細(xì),一鍵復(fù)制開(kāi)箱即用)

    本博客實(shí)現(xiàn)了uniapp微信小程序端,詳細(xì)實(shí)現(xiàn)公眾號(hào)訂閱通知模板消息完整示例源碼,一次性訂閱與永久訂閱均可,注釋詳細(xì)新手一看就懂! 效果如圖所示,uniapp編譯的微信小程序內(nèi)點(diǎn)擊按鈕后,喚起模板消息訂閱申請(qǐng)彈框,后續(xù)微信內(nèi)會(huì)收到通知。

    2024年02月13日
    瀏覽(27)
  • python 一次性刪除列表(list)的空白元素(空內(nèi)容) 或者 一次性刪除列表(list)中的指定元素

    看看下述代碼: 輸出: 當(dāng)你遇見(jiàn)這種情況,有哪些方法來(lái)去除里面的空內(nèi)容呢(即 \\\'\\\' )? 1.1 刪除空內(nèi)容(方法一) : 輸出: 1.2 刪除空內(nèi)容(方法二) : 需要 配合 lambda 表達(dá)式 一起使用! 輸出: 2.3 刪除指定內(nèi)容 : 輸出: 注 :此方法既可以刪除空元素,也可以刪除指

    2024年02月03日
    瀏覽(304)
  • 《一次性分割一切》閱讀筆記

    《一次性分割一切》閱讀筆記

    目錄 0 體驗(yàn) 1 摘要 2 十個(gè)問(wèn)題 參考文獻(xiàn) 體驗(yàn)地址 :SEEM - a Hugging Face Space by xdecoder 體驗(yàn)結(jié)果 : 將哈士奇和汽車(chē)人從圖片中分割出來(lái)。 盡管對(duì)于交互式人工智能系統(tǒng)的需求不斷增長(zhǎng),但在視覺(jué)理解(例如分割)中的人工智能交互方面,很少有全面的研究。本文受到基于提示的

    2024年02月01日
    瀏覽(170)
  • Python:一次性輸出多個(gè)量

    有的時(shí)候我們?cè)谳斎胍粋€(gè)字符串時(shí),需要在中間加一個(gè)int類(lèi)型變量時(shí),如果一段一段輸出就要寫(xiě)三個(gè)print,非常麻煩。今天bug君就給大家講講如何在Python里一次性輸出多個(gè)量。 粽所粥汁,在Python里輸出需要寫(xiě) print(\\\"輸出內(nèi)容\\\") ,而輸出一個(gè)變量則需要寫(xiě) print(變量名) 。 注意:

    2024年02月04日
    瀏覽(98)
  • 一次性打包學(xué)透 Spring

    一次性打包學(xué)透 Spring

    不知從何時(shí)開(kāi)始,Spring 這個(gè)詞開(kāi)始頻繁地出現(xiàn)在 Java 服務(wù)端開(kāi)發(fā)者的日常工作中,很多 Java 開(kāi)發(fā)者從工作的第一天開(kāi)始就在使用 Spring Framework,甚至有人調(diào)侃“不會(huì) Spring 都不好意思自稱(chēng)是個(gè) Java 開(kāi)發(fā)者”。 之所以出現(xiàn)這種局面,源于 Spring 是一個(gè)極為優(yōu)秀的一站式集成框架

    2023年04月19日
    瀏覽(102)
  • charles證書(shū)安裝,一次性說(shuō)明白

    charles證書(shū)安裝,一次性說(shuō)明白

    windows上安裝好charles后,需要給軟件安裝證書(shū)。 1、點(diǎn)擊help - SSL proxying,選擇第二個(gè)install Charles Root Certificate證書(shū)安裝 ? 2、如果以前安裝過(guò)證書(shū),但是過(guò)期了(有效期一般1年),證書(shū)界面會(huì)顯示過(guò)期字樣,此時(shí)就要先點(diǎn)擊一下Reset Charles Root Certificate,然后再點(diǎn)擊第一步中的

    2024年02月05日
    瀏覽(104)
  • 如何一次性啟動(dòng)多個(gè)SpringBoot項(xiàng)目

    如何一次性啟動(dòng)多個(gè)SpringBoot項(xiàng)目

    在做微服務(wù)這塊的架構(gòu)設(shè)計(jì)的時(shí)候,當(dāng)微服務(wù)數(shù)量越來(lái)越多的時(shí)候,本地啟動(dòng)各個(gè)服務(wù)的時(shí)候,可能得手動(dòng)啟動(dòng)每個(gè)啟動(dòng)類(lèi)。這樣就很麻煩,因此記錄一下如何在 idea 里面一鍵啟動(dòng)所有的項(xiàng)目。 比如我項(xiàng)目里面有5個(gè)微服務(wù):那么就對(duì)應(yīng)了5個(gè)啟動(dòng)類(lèi)。 1.項(xiàng)目右上角編輯: 2.點(diǎn)

    2024年02月16日
    瀏覽(231)
  • 一次性處理全局鍵盤(pán)好用工具IQKeyboardManager

    一次性處理全局鍵盤(pán)好用工具IQKeyboardManager

    在一個(gè)完整的項(xiàng)目中,輸入框是用到頻率相當(dāng)高的基礎(chǔ)UI控件,UITextfield UITextView等經(jīng)常一個(gè)頁(yè)面就要多次出現(xiàn),如何處理鍵盤(pán)彈出和回收釋放是我們不可避免遇到的問(wèn)題。 當(dāng)輸入框位于屏幕底部時(shí),彈起的鍵盤(pán)很可能覆蓋輸入框,導(dǎo)致用戶看不到輸入結(jié)果,體驗(yàn)較差… IQKe

    2024年02月15日
    瀏覽(103)
  • 如何一次性更新python所有的庫(kù)?

    我們可以使用? pip ?命令來(lái)更新 Python 庫(kù)。 在命令提示符或終端中,使用pip install --upgrade后面跟上要更新的庫(kù)的名稱(chēng)。 例如,如果你想更新名為? numpy ?的庫(kù),你可以在 Windows 上打開(kāi)命令提示符,在 macOS 或 Linux 上打開(kāi)終端,然后輸入以下命令: 這將升級(jí)? numpy ?庫(kù)到最新版

    2024年02月09日
    瀏覽(86)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包