抖音泛知识交易系统即pay-button支付按钮在uniapp开发环境下的使用
抖音官方文档:developer.open-douyin.com/docs/resour…
行业 SDK 交易组件接入指南
首先在小程序/页面组件中判断是否支持SDK交易组件,该方法可以写在onload或mouted方法中
onLoad(options => {
if (tt.canIUse("industrySDK.pay-button")) {
console.log('支持pay-button组件')
}else {
console.log('不支持pay-button组件')
})
另外在使用组件时需要在页面 json 文件中进行引入
在uniapp目录src/pages.josn中需要使用pay-button组件的页面进行引入组件
{
"path": "pages/pay/index",
"navigationStyle": "custom",
"style": {
"navigationBarTitleText": "商品详情",
"enablePullDownRefresh": false,
"usingComponents": {
"pay-button": "ext://industry/pay-button"
}
}
}
引入UniappToGroup组件对交易组件在uniapp下进行兼容(重要)
首先需要使用npm进行安装:
webpack安装:
npm i uniapp-to-group
npm地址:www.npmjs.com/package/uni…
vite安装(本次使用):
npm i vite-plugin-uniapp-to-group
地址:www.npmjs.com/package/vit…
然后在vite.config.js文件中进行配置
import { defineConfig } from 'vite'
import uni from '@dcloudio/vite-plugin-uni'
import { resolve } from 'path'
import UniappToGroup from './node_modules/vite-plugin-uniapp-to-group/src/index'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [
uni(),
UniappToGroup({
// 对应 package.json 中引入插件步骤
package: {
ttPlugins: {
dependencies: {
'microapp-trade-plugin': {
version: '1.0.5',
isDynamic: true
}
}
}
},
/**
* app 中可以是任何字段,插件会将字段和app.json对比,有就合并字段,没有就添加字段
* 合并字段 目前只处理 Array 和 Object 类型(注:[]和{}才会合并, null 类型不会合并)
* Object 类型字段合并,在key相同的情况会覆盖value
* Array 类型合并 是将两个数组合并
*/
app: {
pages: [
// 下单页
'ext://microapp-trade-plugin/order-confirm',
// 退款申请页
'ext://microapp-trade-plugin/refund-apply',
// 退款详情页
'ext://microapp-trade-plugin/refund-detail'
]
}
})
],
resolve: {
alias: {
'@': resolve(__dirname, 'src')
}
}
})
完成以上引入步骤后就可以在页面中使用pay-button组件
官方文档:developer.open-douyin.com/docs/resour…
<template>
<pay-button class="btn"
@error="handleError"
@placeorder="userLogin"
:mode="2"
:goods-type="1"
:biz-line="2"
@getgoodsinfo="getGoodsInfo"
@pay="handleUnrealPay"
:goods-id="productId" >
</pay-button>
</template>
<script setup>
import { reactive, ref } from 'vue';
import { onLoad, onShow } from '@dcloudio/uni-app';
//productId为服务端接入课程库之后,提审并通过审核拿到的课程ID
let productId = ref('productId')
const handleError = (event) => {
console.log('handleError-event',event.detail)
const { errNo , errMsg } = event.detail
}
const getGoodsInfo = (event) => {
console.log('getGoodsInfo-event',event)
return new Promise(resolve => {
// 在此处开发者可以进行商品数据请求,获取商品信息,然后将商品信息传入 resolve 函数
resolve({
minLimits: 1,
maxLimits: 2,
dateRule: '周一至周日可用',
relationType: 1,
validation: {
phoneNumber: {
required: true // 手机号是否必填
},
reservationType: 1,
reservationCount: 2,
},
// 在 bind:getgoodsinfo 返回的 promise 的 resolve 函数中新增 marketingVersion 字段
marketingVersion: 2,
});
})
}
const userLogin = (event) => {
console.log('event',event)
return new Promise((resolve, reject) => {
tt.login({
success() {
// 用户登录成功并获取信息,则调用 resolve 函数,跳转至提单页
resolve();
},
fail() {
// 用户登录失败,则跳转提单页失败
reject();
}
});
});
}
const handleUnrealPay = (event) => {
console.log('pay-event: ' + event.detail)
const { status , orderId , outOrderNo , result } = event.detail;
if (status === 'success') {
const { code } = result;
if (code === 0) {
// 支付成功
tt.redirectTo({
url: "usr://pages/course/courseInfo"
success: (res) => {
console.log("redirectTo调用成功 ", res);
},
fail: (res) => {
console.log("redirectTo调用失败 ", res);
}
});
} else {
// 支付失败(超时、取消、关闭)
uni.showToast({
title: '支付失败,请重试',
icon: 'none'
});
}
} else {
const { errMsg } = result;
}
}
onLoad(options => {
if (tt.canIUse("industrySDK.pay-button")) {
console.log('支持pay-button组件')
}else {
console.log('不支持pay-button组件')
}
});
onShow(() => {
});
</script>
<style lang="scss" scoped>
</style>
在此调用成功之后,会跳转到下单模板页面,即提单页:
注意:
pay-button的调试必须使用真机进行调试,开发者模拟器不支持,会出现如下错误(提示未登录),并且不能进行页面跳转:
同时真机调试可能会出现如下错误,但是不影响,不必理会,正常操作即可:
对于提单页的一键获取手机号码功能,可以在App.vue或组件方法中直接写入以下方法:
getPhoneNumber({ params, success, fail }) {
const { iv, encryptedData } = params;
// 开发者服务端解密 encryptedData,得到手机号
let phoneNumber = ''
httpRequest({
url: '/api',
method: 'post',
data: {
iv: iv,
encryptedData: encryptedData
}
}).then(res => {
phoneNumber = res.data;
const result = {phoneNumber}
// 回调前端模板
success(result)
});
}
在此,还需要在小程序管理后台进行预下单配置,即服务端支付模块,否则会在调试时出现预下单失败报错问题:
配置路径:小程序管理-->开发-->解决方案配置-->泛知识代运营服务商综合解决方案-->交易扩展点能力-->预下单回调扩展点。修改完配置项之后需要返回上一页进行发布才可生效。
若服务端对接失败则调用时会提示“开发者拒绝交易”,等待后端调试成功即可
正确接入完以上步骤后,小程序即可拉起收银台,正常进行付款操作,泛知识交易流程到此结束。
退款操作同理,只需要更改pay-button的配置项,配置退款回调接口即可完成退款操作。同时,服务商还提供了泛知识交易系统服务端退款接口,有需要的可自行接入使用:developer.open-douyin.com/docs/resour…