更新记录
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
相关文档
插件方法,参数参考demo或谷歌文档
- doInit
- doQuerySku
- 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
}
}
}
);
}