Browse Source

add jsapiPreVerifyCertificates logic

dev
刘嘉炜 1 week ago
parent
commit
9791a09281
  1. 2
      src/api/server.js
  2. 1
      src/subpackage/groupon/api/index.js
  3. 50
      src/subpackage/groupon/components/confirm_template.vue
  4. 111
      src/subpackage/groupon/pages/confirm_order/ticket.vue
  5. 88
      src/subpackage/groupon/pages/list.vue

2
src/api/server.js

@ -35,7 +35,7 @@ server.interceptors.request.use(
server.interceptors.response.use( server.interceptors.response.use(
response => { response => {
loading.hide(response.config.loading); loading.hide(response.config.loading);
if(response?.data?.code === 0)return formatResponse(response);
if([0].includes(response?.data?.code))return formatResponse(response);
// console.error(`get ${response?.config?.url} err -> `, response) // console.error(`get ${response?.config?.url} err -> `, response)
return errorHandle({ return errorHandle({
Catch: response?.config?.catch || false, Catch: response?.config?.catch || false,

1
src/subpackage/groupon/api/index.js

@ -7,6 +7,7 @@ export const bookList = params => server.post({ url: '/stadium/book/list', ...pa
export const userCertificates = params => server.post({ url: '/douyinMiniapp/202506/postv1-api-trade-v2-fulfillment-query_user_certificates', ...params }); // 抖音团购券列表 export const userCertificates = params => server.post({ url: '/douyinMiniapp/202506/postv1-api-trade-v2-fulfillment-query_user_certificates', ...params }); // 抖音团购券列表
export const countCity = params => server.post({ url: '/stadium/count/city', ...params }); // A主页-选择门店-城市列表 export const countCity = params => server.post({ url: '/stadium/count/city', ...params }); // A主页-选择门店-城市列表
export const stadiumFind = params => server.post({ url: '/stadium/find', ...params }); // 门店列表 export const stadiumFind = params => server.post({ url: '/stadium/find', ...params }); // 门店列表
export const jsapiPreVerifyCertificates = params => server.post({ url: '/douyinMiniapp/202506/jsapiPreVerifyCertificates', ...params }); // 票券核销

50
src/subpackage/groupon/components/confirm_template.vue

@ -36,10 +36,11 @@ onLoad(() => {
</view> </view>
<slot></slot> <slot></slot>
<view class="ct-fixed"> <view class="ct-fixed">
<view class="cf-price" v-if="payAmount >= 0">
<slot name="fixed"></slot>
<!-- <view class="cf-price" v-if="payAmount >= 0">
<text class="cp-txt">应付金额</text> ¥{{ payAmount }} <text class="cp-txt">应付金额</text> ¥{{ payAmount }}
</view> </view>
<view class="cf-btn" :class="{ 'cf-full': payAmount < 0 }">确认兑换</view>
<view class="cf-btn" :class="{ 'cf-full': payAmount < 0 }">确认兑换</view> -->
</view> </view>
</view> </view>
</template> </template>
@ -77,28 +78,29 @@ onLoad(() => {
padding: 10upx 24upx; padding: 10upx 24upx;
@include isPd(10upx); @include isPd(10upx);
background-color: #fff; background-color: #fff;
@include ctf;
.cf-btn{
flex-shrink: 0;
flex-grow: 0;
margin-left: 12upx;
width: 240upx;
text-align: center;
border-radius: 20upx;
background-color: $redColor;
@include flcw(32upx, 88upx, #fff);
&.cf-full{
flex-grow: 1;
width: auto;
}
}
.cf-price{
flex-grow: 1;
@include flcw(40upx, 56upx, $redColor, 500);
.cp-txt{
@include flcw(28upx, 56upx, #333);
}
}
// @include ctf;
// .cf-btn{
// @include clearBtn;
// flex-shrink: 0;
// flex-grow: 0;
// margin-left: 12upx;
// width: 240upx;
// text-align: center;
// border-radius: 20upx;
// background-color: $redColor;
// @include flcw(32upx, 88upx, #fff);
// &.cf-full{
// flex-grow: 1;
// width: auto;
// }
// }
// .cf-price{
// flex-grow: 1;
// @include flcw(40upx, 56upx, $redColor, 500);
// .cp-txt{
// @include flcw(28upx, 56upx, #333);
// }
// }
} }
} }
</style> </style>

111
src/subpackage/groupon/pages/confirm_order/ticket.vue

@ -3,8 +3,11 @@ import { onLoad } from '@dcloudio/uni-app';
import { reactive, ref, onMounted, getCurrentInstance, computed } from "vue"; import { reactive, ref, onMounted, getCurrentInstance, computed } from "vue";
import confirmTemplate from "../../components/confirm_template.vue"; import confirmTemplate from "../../components/confirm_template.vue";
import ticketItem from "../../components/ticket_item.vue"; import ticketItem from "../../components/ticket_item.vue";
import { jsapiPreVerifyCertificates } from "../../api";
import { routeTo, showModal } from '@/utils/polish';
const stadiumInfo = ref({}); // const stadiumInfo = ref({}); //
const ticketInfo = ref({}); // const ticketInfo = ref({}); //
const verify_token = ref('');
onLoad(() => { onLoad(() => {
}); });
@ -16,10 +19,79 @@ onMounted(() =>{
const instance = getCurrentInstance().proxy const instance = getCurrentInstance().proxy
const eventChannel = instance.getOpenerEventChannel(); const eventChannel = instance.getOpenerEventChannel();
eventChannel.on('dataFromGrouponStadiums', function(data) { eventChannel.on('dataFromGrouponStadiums', function(data) {
ticketInfo.value = data?.ticket || {};
stadiumInfo.value = data?.stadium || {};
let { ticket, stadium } = data;
ticketInfo.value = ticket || {};
stadiumInfo.value = stadium || {};
pvc_func({
encrypted_codes: ticket?.encrypted_codes ?? '',
stadium_id: stadium?.id ?? '',
douyin_merchant_pay_amount: ticket?.douyin_merchant_pay_amount ?? '',
certificate_id: ticket?.certificate_id ?? '',
})
}) })
}) })
function pvc_func({
encrypted_codes, stadium_id, douyin_merchant_pay_amount, certificate_id
}){
jsapiPreVerifyCertificates({
data: {
encrypted_codes, stadium_id, douyin_merchant_pay_amount, certificate_id
},
})
.then(res=>{
// routeTo(`/subpackage/groupon/pages/exchange_success`);
console.log('jsapiPreVerifyCertificates', res);
verify_token.value = res?.data?.verify_token ?? '';
})
}
function confirmBtn(){
let _tVal = ticketInfo.value;
const _query = {
verifyToken: verify_token.value ?? '',
poiId: '7174984639059068985',
orderList: [{
orderId: _tVal?.order_id ?? '',
certificateList: [{
code: _tVal?.certificate_id ?? '',
times: 1
}]
}],
orderEntrySchema: {
path: 'subpackage/order/pages/detail'
},
success(res){
console.warn('verifyCertificates success', res);
},
fail(err){
console.warn('verifyCertificates fail', err);
showModal({ content: err?.errMsg ?? '兑换操作失败!' })
},
}
console.log('tt.verifyCertificates data -->', _query)
return tt.verifyCertificates(_query);
jsapiPreVerifyCertificates({
data: {
encrypted_codes: _tVal?.encrypted_codes ?? '',
verify_token: _tVal?.verify_token ?? '',
stadium_id: stadiumInfo.value?.id ?? '',
douyin_merchant_pay_amount: _tVal?.douyin_merchant_pay_amount ?? '',
certificate_id: _tVal?.certificate_id ?? '',
},
Catch: true,
})
.then(res=>{
// routeTo(`/subpackage/groupon/pages/exchange_success`);
console.log('jsapiPreVerifyCertificates', res);
console.log('verifyCertificates data -->', _query)
})
}
</script> </script>
<template> <template>
@ -27,6 +99,7 @@ onMounted(() =>{
:stadiumLogo="stadiumInfo?.logo || ''" :stadiumLogo="stadiumInfo?.logo || ''"
:stadiumName="stadiumInfo?.name || ''" :stadiumName="stadiumInfo?.name || ''"
:stadiumAddress="stadiumInfo?.address || ''" :stadiumAddress="stadiumInfo?.address || ''"
@click:confirm="confirmBtn"
> >
<view class="ticket-info"> <view class="ticket-info">
<view class="ti-content"> <view class="ti-content">
@ -55,6 +128,14 @@ onMounted(() =>{
></ticket-item> ></ticket-item>
</view> </view>
</view> </view>
<template #fixed>
<view class="ti-fixed">
<view class="cf-price" v-if="0 >= 0">
<text class="cp-txt">应付金额</text> ¥{{ 0 }}
</view>
<button v-if="verify_token" class="cf-btn" :class="{ 'cf-full': 0 < 0 }" @click="confirmBtn" data-eventsync>确认兑换</button>
</view>
</template>
</confirm-template> </confirm-template>
</template> </template>
@ -128,5 +209,31 @@ onMounted(() =>{
} }
} }
} }
}
.ti-fixed{
@include ctf;
.cf-btn{
@include clearBtn;
flex-shrink: 0;
flex-grow: 0;
margin-left: 12upx;
width: 240upx;
text-align: center;
border-radius: 20upx;
background-color: $redColor;
@include flcw(32upx, 88upx, #fff);
&.cf-full{
flex-grow: 1;
width: auto;
}
}
.cf-price{
flex-grow: 1;
@include flcw(40upx, 56upx, $redColor, 500);
.cp-txt{
@include flcw(28upx, 56upx, #333);
}
}
} }
</style> </style>

88
src/subpackage/groupon/pages/list.vue

@ -6,20 +6,20 @@ import { routeTo, showModal } from '@/utils/polish';
import { userCertificates } from "../api"; import { userCertificates } from "../api";
const ticketLs = ref([]); const ticketLs = ref([]);
onLoad(() => { onLoad(() => {
tt.login({
success() {
tt.showToast({
title: '登录成功',
icon: 'success',
});
},
fail() {
tt.showToast({
title: '登录失败',
icon: 'fail',
});
},
});
// tt.login({
// success() {
// tt.showToast({
// title: '',
// icon: 'success',
// });
// },
// fail() {
// tt.showToast({
// title: '',
// icon: 'fail',
// });
// },
// });
userCertificates({ userCertificates({
data: { data: {
debug: 1, debug: 1,
@ -38,27 +38,47 @@ onLoad(() => {
function ticketClick(e){ function ticketClick(e){
let [ certificates ] = e?.certificates || []; let [ certificates ] = e?.certificates || [];
let _ouxuan_group_purchase_info = certificates?.sku_info?.ouxuan_group_purchase_info ?? {};
let _merchandise_type = _ouxuan_group_purchase_info?.merchandise_type;
if(![0, 1].includes(_merchandise_type))return showModal({ content: '无效的商品类型' });
// const _query = {
// verifyToken: new Date().getTime() + '',
// poiId: '7174984639059068985',
// orderList: [{
// orderId: e.order_id,
// certificateList: [{
// code: certificates.certificate_id,
// times: 1
// }]
// }],
// orderEntrySchema: {
// path: 'subpackage/order/pages/detail'
// },
// complete(res){
// console.warn('verifyCertificates', res);
// }
tt.verifyCertificates({
verifyToken: new Date().getTime() + '',
poiId: 7441486703712337958 +'',
orderList: [{
orderId: e.order_id,
certificateList: [{
code: certificates.certificate_id,
times: 1
}]
}],
orderEntrySchema: {
path: 'subpackage/order/pages/detail'
},
complete(res){
console.warn('verifyCertificates', res);
}
// }
// console.log('tt.verifyCertificates -->', _query)
// tt.verifyCertificates(_query);
})
return
// return
let _ticketInfo = {
expire_time: certificates?.expire_time ?? 0,
dy_title: certificates?.sku_info?.title ?? '',
merchandise_name: _ouxuan_group_purchase_info?.merchandise_name ?? '',
// merchandise_type 1-> 0->
merchandise_type: _merchandise_type,
// tt.verifyCertificates
order_id: e?.order_id ?? '',
verify_token: `${new Date().getTime()}`,
poi_id: '7174984639059068985',
certificate_id: certificates?.certificate_id ?? '',
//
encrypted_codes: certificates?.encrypted_code ?? '',
douyin_merchant_pay_amount: certificates?.amount?.pay_amount ?? 0,
}
uni.navigateTo({ uni.navigateTo({
url: `/subpackage/groupon/pages/stadiums`, url: `/subpackage/groupon/pages/stadiums`,
success: res => { success: res => {
@ -73,7 +93,7 @@ function ticketClick(e){
<template> <template>
<view class="groupon-list"> <view class="groupon-list">
<view class="gl-item" v-for="(e, i) in ticketLs" :key="i"> <view class="gl-item" v-for="(e, i) in ticketLs" :key="i">
<button @click="ticketClick(e)" data-eventsync>使用</button>
<!-- <button @click="ticketClick(e)" data-eventsync>使用</button> -->
<ticket-item <ticket-item
isUseBtn isUseBtn
:ticketName="e?.certificates?.[0]?.sku_info?.title ?? ''" :ticketName="e?.certificates?.[0]?.sku_info?.title ?? ''"

Loading…
Cancel
Save