更新记录

1.2.0(2025-08-28)

初始化增加参数配置,优化插件代码,demo增加vue页面示例

1.1.1(2025-08-26)

删除无用的jar依赖

1.1.0(2025-08-26)

适配uniappx,修改插件方法统一返回类型

查看更多

平台兼容性

uni-app(4.27)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
× × × × - - 5.0 × ×
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 快应用-华为 快应用-联盟
× × × × × × × × × × ×

uni-app x(4.27)

Chrome Safari Android iOS 鸿蒙 微信小程序
× × 5.0 × × ×

其他

多语言 暗黑模式 宽屏模式

Google支付 UTS实现GooglePay Google Pay 谷歌支付(支付内购,订阅,支持V7,V8。UTS,支持uniappx,插件有问题请***:1684729125)

插件仅支持Android版本

插件提供的方法 -- 详情请参考demo

谷歌官方政策:从2025 年 8 月 31 日起,所有新应用都必须使用结算库版本 7 或更高版本。自 2025 年 11 月 1 日起,现有应用的所有新版本都必须使用结算库版本 7或更高版本。

谷歌结算库版本:8.0.0

插件非UTS版本https://ext.dcloud.net.cn/plugin?id=9273

相关文档

插件方法,参数参考demo或谷歌文档

  • doInit
    • 初始化
  • doQuerySku
    • 查询sku
  • doPay
    • 支付
  • doPayAll
    • 支付,支持更多参数
  • doUpdateSubs
    • 更新订阅
  • doConsume
    • 确认交易--消耗品(普通商品)
  • doAcknowledgePurchase
    • 确认交易--非消耗品(订阅商品)
  • doQueryPurchases
    • 查询应用内购买的当前拥有的商品的购买详情
    • 仅返回有效订阅和未消费(确认交易)的一次性购买
  • doShowInAppMessages
    • 显示应用内消息

引用插件

import {
    doInit,
    doQuerySku,
    doPay,
    doPayAll,
    doUpdateSubs,
    doConsume,
    doAcknowledgePurchase,
    doQueryPurchases,
    doShowInAppMessages,
    GtCommonResult,
} from "@/uni_modules/gt-google-pay"

使用插件代码如下,更多代码请参考Demo(下面和demo的代码都是基于uniappx开发测试,uniapp需要自行转换)


const isInapp = ref<boolean>(true)
const payList = ref<UTSJSONObject[]>([])
const prdList = ref<UTSJSONObject[]>([])

/**
 * 显示提示
 */
const showToast = (title : string) => {
    uni.showToast({
        title: title,
        mask: true,
        duration: 1500,
        icon: 'none'
    });
}

/**
 * 初始化
 */
const handleInit = () => {
    // 参考链接:https://developer.android.com/reference/com/android/billingclient/api/BillingClient.Builder
    doInit({
            enableAutoServiceReconnection:true,  //谷歌自动服务重连,android8.0.0以上,不传默认为true
            enableExternalOffer:false , //启用外部优惠,不传默认为false
            enableAlternativeBillingOnly:false, //仅使用备选结算,不传默认为false
            enableUserChoiceBilling:false, //用户选择支付方式,适用于 EEA、印度、韩国等要求支持 UCB 的市场,不传默认为false
        }, e => {
        console.log("doInit: ", e);
        if (e.code == 200) {
            // 初始化成功
            console.log('初始化成功');
            showToast('初始化成功');
        } else {
            // 初始化失败
            console.log('初始化失败');
            showToast('初始化失败');
        }
    });
}

const handleGoodsTypeChange = (e : RadioGroupChangeEvent) => {
    console.log("handleGoodsTypeChange: ", e);
    isInapp.value = e.detail.value == 'true'
    prdList.value = [] as UTSJSONObject[]
}

/**
 * 查询商品
 */
const handleQuerySku = () => {
    let params : UTSJSONObject;
    if (isInapp.value) { //消耗商品
        params = {
            inapp: ["google_product_22", "google_product_21", "google_product_11",
                "google_product_12", "google_product_15"
            ]
        }
    } else { //订阅商品
        params = {
            // subs: ["10000", "10001"],
            subs: ["10000", "10001", "svip_month", "vip_month"],
        }
    }
    doQuerySku(params, (result : GtCommonResult) => {
        console.log('查询结果:', result);
        showToast('查询结果:' + JSON.stringify(result));
        if (result.code == 200 && result.data != null) {
            // 查询成功  
            prdList.value = result.data as UTSJSONObject[];
            // console.log('that.prdList : ', prdList.value);
            // const list = JSON.parse<UTSJSONObject[]>(result.data['list'])
            //  const list = JSON.parse<UTSJSONObject[]>(JSON.stringify(result.data['list']))
        } else {
            console.log('查询失败');
        }
    });
}

/**
 * 发起支付
 * 支付参数为查询sku结果的某一项
 */
const handlePay = () => {
    console.log('do pay function.');
    // console.log("that.prdList: ", prdList.value)
    if (prdList.value.length == 0 || prdList.value[0].productId == null) {
        showToast('产品不能为空,不可支付');
        return;
    }

    let payPrams = {
        productId: prdList.value[0].productId
    }
    // V7版本,非订阅商品,不用传offerToken
    // V7版本,订阅产品必须传offerToken值,且不能为空,offerToken的值为doQuerySku方法返回
    if (!isInapp.value) {
        // payPrams.offerToken = "AQ2SJC/E1M9cIzCkpjba57hkz81a4vr9sGx7BKy+agizCT2IVOBCdMsYO3xiozVv01+0XYNhbKfZpAGUJkys"
        const subscriptionOfferDetails = prdList.value[0].subscriptionOfferDetails as UTSJSONObject[]
        if (subscriptionOfferDetails.length == 0 || subscriptionOfferDetails[0].offerToken == null) {
            showToast('找不到offerToken');
            return
        }
        payPrams.offerToken = subscriptionOfferDetails[0].offerToken;
    }
    console.log('payPrams: ', payPrams);
    doPay(payPrams, result => {
        console.log('支付结果:', result);
        showToast('支付结果:' + JSON.stringify(result));
        if (result.code == 200 && result.data != null) {
            const payResult = result.data as UTSJSONObject[];
            // 支付成功,可以确认交易,必须purchaseState才调用
            if (payResult[0].purchaseState as Number == 1) {
                console.log("支付成功,可以确认交易");
                payList.value = payResult;
            } else { // purchaseState==2
                // 调用doQueryPurchases方法查询订单状态,purchaseState==1后才可以确认
                console.log("支付成功,订单状态为等待中,暂不可确认交易");
            }
        } else {
            // 支付失败
            console.log('支付失败');
        }
    });
}

/**
 * 发起支付
 * 支付参数为查询sku结果的某一项
 */
const handlePayAll = () => {
    console.log('do pay function.');
    console.log("that.prdList: ", prdList.value)
    if (prdList.value.length == 0 || prdList.value[0].productId == null) {
        showToast('产品不能为空,不可支付');
        return;
    }

    let payPrams = {
        productId: prdList.value[0].productId,
        accountId: "test-accountId-00000001", // 可选,用户Id
        profileId: "test-profileId-00000001", // 可选,个人资料Id
    }
    // V7版本,非订阅商品,不用传offerToken
    // V7版本,订阅产品必须传offerToken值,且不能为空,offerToken的值为doQuerySku方法返回
    if (!isInapp.value) {
        // payPrams.offerToken = "AQ2SJC/E1M9cIzCkpjba57hkz81a4vr9sGx7BKy+agizCT2IVOBCdMsYO3xiozVv01+0XYNhbKfZpAGUJkys"
        const subscriptionOfferDetails = prdList.value[0].subscriptionOfferDetails as UTSJSONObject[]
        if (subscriptionOfferDetails.length == 0 || subscriptionOfferDetails[0].offerToken == null) {
            showToast('找不到offerToken');
            return
        }
        payPrams.offerToken = subscriptionOfferDetails[0].offerToken;
    }
    console.log('payPrams: ', payPrams);
    doPay(payPrams, result => {
        console.log('支付结果:', result);
        showToast('支付结果:' + JSON.stringify(result));
        if (result.code == 200 && result.data != null) {
            const payResult = result.data as UTSJSONObject[];
            // 支付成功,可以确认交易,必须purchaseState才调用
            if (payResult[0].purchaseState as Number == 1) {
                console.log("支付成功,可以确认交易");
                payList.value = payResult;
            } else { // purchaseState==2
                // 调用doQueryPurchases方法查询订单状态,purchaseState==1后才可以确认
                console.log("支付成功,订单状态为等待中,暂不可确认交易");
            }
        } else {
            // 支付失败
            console.log('支付失败');
        }
    });
}

/**
 * 确认交易,消耗品
 */
const handleConsume = () => {
    console.log('do consume function.');
    if (payList.value.length == 0 || (payList.value[0].purchaseToken ?? payList.value[0].token) == null) {
        showToast('支付信息不能为空');
        return;
    }
    if (payList.value[0].purchaseState != 1) {
        showToast("订单状态未就绪")
        return
    }
    doConsume({
        purchaseToken: payList.value[0].purchaseToken ?? payList.value[0].token
    }, result => {
        console.log('Consume结果:', result);
        showToast('Consume结果:' + JSON.stringify(result));
        if (result.code == 200) {
            console.log('Consume成功');
        } else {
            console.log('Consume失败');
        }
    });
}

/**
 * 确认交易,非消耗品
 */
const handleAcknowledgePurchase = () => {
    let that = this;
    console.log('do pay function.');

    if (payList.value.length == 0 || payList.value[0].signature == null || (payList.value[0].original ?? payList.value[0].originalJson) == null) {
        showToast('支付信息不能为空');
        return;
    }
    if (payList.value[0].purchaseState != 1) {
        showToast("订单状态未就绪")
        return
    }
    if (payList.value[0].acknowledged as boolean) {
        showToast("该订单已确认交易过了")
        return
    }
    //original,signature两个参数不能为空,参数来自支付结果
    //original参数是支付结果中的original字段或originalJson字段
    doAcknowledgePurchase({
        original: payList.value[0].original ?? payList.value[0].originalJson,
        signature: payList.value[0].signature
    }, result => {
        console.log('acknowledgePurchase结果:', result);
        showToast('acknowledgePurchase结果:' + JSON.stringify(result));
        if (result.code == 200) {
            console.log('acknowledgePurchase成功');
        } else {
            console.log('acknowledgePurchase失败');
        }
    });
}

/**
 * 查询购买交易
 * 返回您在应用内购买的当前拥有的商品的购买详情。
 * 仅返回有效订阅和未消费的一次性购买。
 * 
 * acknowledged  字段是是否已确认交易 true false
 * purchaseState 是订单状态  1--支付成功,可确认交易,2--等待中
 */
const handleQueryPurchases = () => {
    console.log("do doQueryPurchases function.");
    //参数inapp或subs
    doQueryPurchases({
        productType: isInapp.value ? "inapp" : "subs"
    }, (result) => {
        console.log("queryPurchases结果:", result);
        showToast("queryPurchases结果:" + JSON.stringify(result));
        if (result.data != null) {
            // 支付成功后,如果没确认交易,doQueryPurchases查询到订单且订单purchaseState==1,再调用确认交易方法
            payList.value = result.data as UTSJSONObject[]
        }
    });
}

/**
 * 更新订阅,更新订阅后,也要确认交易才可以
 */
const handleUpdateSubs = () => {
    console.log('do updateSubs function.');
    if (isInapp.value) {
        showToast("应用内商品不支持更新订阅")
        return
    }
    if (prdList.value.length == 0 || prdList.value[0].productId == null) {
        showToast('产品不能为空,不可支付');
        return;
    }

    const subscriptionOfferDetails = prdList.value[1].subscriptionOfferDetails as UTSJSONObject[]
    if (subscriptionOfferDetails.length == 0 || subscriptionOfferDetails[0].offerToken == null) {
        showToast('找不到offerToken');
        return
    }
    // V7版本必须传offerToken值,且不能为空,offerToken的值为doQuerySku方法返回
    let params = {
        productId: prdList.value[1].productId,
        offerToken: subscriptionOfferDetails[0].offerToken,
        // 要更改的订阅的PurchaseToken
        oldPurchaseToken: payList.value[0].purchaseToken,
        replacementMode: 0, //替换模式
        externalTransactionId:"" //可选,外部交易Id
    }
    console.log('doUpdateSubs params: ', params);
    doUpdateSubs(params, result => {
        console.log('更新订阅结果:', result);
        showToast('更新订阅结果:' + JSON.stringify(result));
        if (result.code == 200 && result.data != null) {
            // 支付成功
            console.log('更新订阅成功');
            payList.value = result.data as UTSJSONObject[];;
        } else {
            // 支付失败
            console.log('更新订阅失败');
        }
    });
}

/**
 * 显示应用内消息
 */
const handleShowInAppMessages = () => {
    console.log("do doShowInAppMessages function.");
    //参数inapp或subs
    doShowInAppMessages({
        inAppMessageCategoryId: 2, //0或2,详情参考谷歌文档
    },
        (result) => {
            console.log("doShowInAppMessages结果:", result);
            showToast("doShowInAppMessages结果:" + JSON.stringify(result));
            if (result.code == 200 && result.data != null) {
                const mResultData = result.data as UTSJSONObject
                // responseCode为谷歌返回的结果码,详情参考谷歌文档
                if (mResultData.responseCode == 0) {
                    // NO_ACTION_NEEDED
                    //  The flow has finished and there is no action needed from developers.
                } else if (mResultData.responseCode == 1) {
                    // SUBSCRIPTION_STATUS_UPDATED
                }
            }
        }
    );
}

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件支付功能使用Google SDK,参考其官方网站 https://policies.google.com/privacy

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。