Compare commits

...

3 Commits

Author SHA1 Message Date
woody 06c5ab4400 feat(detail): 退款明细空态展示问题修复 2025-07-08 10:35:55 +08:00
woody b4166f9d49 feat(refund): 添加退款明细列表 2025-07-07 16:56:07 +08:00
woody b68e43e6ef feat(pay): 支付代码迁移 2025-07-07 10:58:54 +08:00
13 changed files with 11293 additions and 407 deletions

View File

@ -53,3 +53,7 @@ export const getMarketDynamicBoxCount = params =>
http.post('/retail-member/api/retail-member/small-box-list', {
params,
})
// 退款明细列表
export const getRefundList = params =>
http.get('/sale/api/my-order/refund-list', { params })

View File

@ -20,7 +20,7 @@ module.exports = vm => {
//#ifdef DEV_SERVER
console.log('DEV_SERVER')
config.baseURL = 'http://t-app.beida777.com/prod-api'
config.baseURL = 'http://192.168.0.86:8080'
//#endif
//#ifdef QA_SERVER

View File

@ -17,6 +17,13 @@
"navigationBarBackgroundColor": "#fff"
}
},
{
"path": "pages/pay/success",
"style": {
"navigationBarTitleText": "支付成功",
"navigationBarBackgroundColor": "#fff"
}
},
{
"path": "pages/makerspace/index",
"style": {
@ -101,6 +108,14 @@
"navigationBarBackgroundColor": "#fff"
}
},
{
"path": "pages/refund/detail",
"style": {
"navigationBarTitleText": "退款列表",
"navigationBarBackgroundColor": "#fff",
"enablePullDownRefresh": true
}
},
{
"path": "pages/userData/index",
"style": {

View File

@ -130,7 +130,7 @@ export default {
},
onLoad() {
let params = {
ifcz: true,
isRecharge: true,
}
this.topList[0].path =
'/pages/pay/index?paramsPost=' + JSON.stringify(params)
@ -257,7 +257,7 @@ export default {
}
} else {
let paramsPost = {
ifcz: true,
isRecharge: true,
}
uni.navigateTo({
url: `${item.path}?paramsPost=${encodeURIComponent(JSON.stringify(paramsPost))}`,

View File

@ -6,193 +6,168 @@
-->
<template>
<view class="content">
<view class="index_header">
</view>
<view class="index_header"> </view>
<view class="contxt">
<template>
<view class="tit">{{'待支付金额'}}</view>
<view class="tit">{{ '待支付金额' }}</view>
<view class="tit1">
{{ paramsPost.orderAmount | numberToCurrency }}
</view>
<view class="tit2">{{'请在'}}
<view class="tit3">{{ countDown }}</view>{{'内完成支付,否则订单将会被自动取消'}}
<view class="tit2"
>{{ '请在' }} <view class="tit3">{{ countDown }}</view
>{{ '内完成支付,否则订单将会被自动取消' }}
</view>
</template>
<!-- 暂时隐藏 -->
<view v-if="false" class="kuang">
<u-collapse :value="activeNames"
ref="collapse"
@open="change"
@close="close"
accordion
:border="false">
<u-collapse
:value="activeNames"
ref="collapse"
@open="change"
@close="close"
accordion
:border="false"
>
<u-collapse-item name="1">
<view slot="title"
class="pf"> <img src="@/static/images/under_pay.png"
alt="" />
<view>{{'在线支付'}}</view>
<view slot="title" class="pf">
<img src="@/static/images/under_pay.png" alt="" />
<view>{{ '在线支付' }}</view>
</view>
<view class="flex_ac"
v-show="this.payList.pay11">
<view class="flex_ac" v-show="this.payList.pay11">
<view class="flex_ac_i">
<img src="@/static/images/pay_i2.png"
alt="" />
<view>{{'宝付微信支付'}}</view>
<img src="@/static/images/pay_i2.png" alt="" />
<view>{{ '宝付微信支付' }}</view>
</view>
<u-radio-group v-model="whatPay">
<u-radio activeColor="red"
size="14"
label=""
:name="11">
<u-radio activeColor="red" size="14" label="" :name="11">
</u-radio>
</u-radio-group>
</view>
<view class="flex_ac"
v-show="this.payList.pay12">
<view class="flex_ac" v-show="this.payList.pay12">
<view class="flex_ac_i">
<img src="@/static/images/pay_i2.png"
alt="" />
<view>{{'宝付微信扫码'}}</view>
<img src="@/static/images/pay_i2.png" alt="" />
<view>{{ '宝付微信扫码' }}</view>
</view>
<u-radio-group v-model="whatPay">
<u-radio activeColor="red"
size="14"
label=""
:name="12">
<u-radio activeColor="red" size="14" label="" :name="12">
</u-radio>
</u-radio-group>
</view>
<view class="flex_ac"
v-show="this.payList.pay13">
<view class="flex_ac" v-show="this.payList.pay13">
<view class="flex_ac_i">
<img src="@/static/images/pay_i2.png"
alt="" />
<view>{{'汇付微信支付'}}</view>
<img src="@/static/images/pay_i2.png" alt="" />
<view>{{ '汇付微信支付' }}</view>
</view>
<u-radio-group v-model="whatPay">
<u-radio activeColor="red"
size="14"
label=""
:name="13">
<u-radio activeColor="red" size="14" label="" :name="13">
</u-radio>
</u-radio-group>
</view>
<view class="flex_ac1"
v-show="this.payList.pay15">
<view class="flex_ac1" v-show="this.payList.pay15">
<view class="flex_ac_i">
<img src="@/static/images/jdBank.jpg"
alt="" />
<view>{{'汇付银行卡'}} ({{ '暂不支持信用卡' }})</view>
<img src="@/static/images/jdBank.jpg" alt="" />
<view>{{ '汇付银行卡' }} ({{ '暂不支持信用卡' }})</view>
</view>
<view class="pad">
<view v-for="(item, index) in hfList"
:key="index"
class="pay_flax flex_bet"
@click.prevent="selPayRadio('hf' + index)">
<view
v-for="(item, index) in hfList"
:key="index"
class="pay_flax flex_bet"
@click.prevent="selPayRadio('hf' + index)"
>
<view class="flax_i">
{{ item.bankName }} ({{ item.bankNo }})
</view>
<u-radio-group v-model="whatPay">
<u-radio activeColor="red"
size="14"
label=''
:name="'hf' + index">
<u-radio
activeColor="red"
size="14"
label=""
:name="'hf' + index"
>
</u-radio>
</u-radio-group>
</view>
<view class="pay_flax flax_i"
@click="bindBank('hf')">
<img class="img1"
src="@/static/images/addto.png"
alt="" />
<view>{{'绑定银行卡'}}</view>
<view class="pay_flax flax_i" @click="bindBank('hf')">
<img class="img1" src="@/static/images/addto.png" alt="" />
<view>{{ '绑定银行卡' }}</view>
</view>
</view>
</view>
<view class="flex_ac"
v-show="this.payList.pay32">
<view class="flex_ac" v-show="this.payList.pay32">
<view class="flex_ac_i">
<img src="@/static/images/pay_i2.png"
alt="" />
<img src="@/static/images/pay_i2.png" alt="" />
<view>通联微信支付</view>
</view>
<u-radio-group v-model="whatPay">
<u-radio activeColor="red"
size="14"
label=""
:name="32">
<u-radio activeColor="red" size="14" label="" :name="32">
</u-radio>
</u-radio-group>
</view>
<view class="flex_ac1"
v-show="this.payList.pay33">
<view class="flex_ac1" v-show="this.payList.pay33">
<view class="flex_ac_i">
<img src="@/static/images/jdBank.jpg"
alt="" />
<view>{{'通联银行卡'}} ({{ '暂不支持信用卡' }})</view>
<img src="@/static/images/jdBank.jpg" alt="" />
<view>{{ '通联银行卡' }} ({{ '暂不支持信用卡' }})</view>
</view>
<view class="pad">
<view v-for="(item, index) in tlList"
:key="index"
class="pay_flax flex_bet"
@click.prevent="selPayRadio('tl' + index)">
<view
v-for="(item, index) in tlList"
:key="index"
class="pay_flax flex_bet"
@click.prevent="selPayRadio('tl' + index)"
>
<view class="flax_i">
{{ item.bankName }} ({{ item.bankNo }})
</view>
<u-radio-group v-model="whatPay">
<u-radio activeColor="red"
size="14"
label=''
:name="'tl' + index">
<u-radio
activeColor="red"
size="14"
label=""
:name="'tl' + index"
>
</u-radio>
</u-radio-group>
</view>
<view class="pay_flax flax_i"
@click="bindBank('tl')">
<img class="img1"
src="@/static/images/addto.png"
alt="" />
<view>{{'绑定银行卡'}}</view>
<view class="pay_flax flax_i" @click="bindBank('tl')">
<img class="img1" src="@/static/images/addto.png" alt="" />
<view>{{ '绑定银行卡' }}</view>
</view>
</view>
</view>
<view class="flex_ac1"
v-show="this.payList.pay4">
<view class="flex_ac1" v-show="this.payList.pay4">
<view class="flex_ac_i">
<img src="@/static/images/jdBank.jpg"
alt="" />
<view>{{'京东银行卡'}} ({{ '暂不支持信用卡' }})</view>
<img src="@/static/images/jdBank.jpg" alt="" />
<view>{{ '京东银行卡' }} ({{ '暂不支持信用卡' }})</view>
</view>
<view class="pad">
<view v-for="(item, index) in jdList"
:key="index"
class="pay_flax flex_bet"
@click.prevent="selPayRadio('jd' + index)">
<view
v-for="(item, index) in jdList"
:key="index"
class="pay_flax flex_bet"
@click.prevent="selPayRadio('jd' + index)"
>
<view class="flax_i">
{{ item.bankName }} ({{ item.bankNo }})
</view>
<u-radio-group v-model="whatPay">
<u-radio activeColor="red"
size="14"
label=''
:name="'jd' + index">
<u-radio
activeColor="red"
size="14"
label=""
:name="'jd' + index"
>
</u-radio>
</u-radio-group>
</view>
<view class="pay_flax flax_i"
@click="bindBank('jd')">
<img class="img1"
src="@/static/images/addto.png"
alt="" />
<view>{{'绑定银行卡'}}</view>
<view class="pay_flax flax_i" @click="bindBank('jd')">
<img class="img1" src="@/static/images/addto.png" alt="" />
<view>{{ '绑定银行卡' }}</view>
</view>
</view>
</view>
</u-collapse-item>
</u-collapse>
</view>
</view>
@ -200,60 +175,57 @@
<view class="footer_f">
<view class="footer">
<view class="footer_r">
<u-button type="success"
class="uBtn"
shape="circle"
:loading="isLoading"
loadingText="支付中"
@tap="quickPay(ifcz)"
color="linear-gradient(to right, #005BAC, #005BAC )">{{'立即支付'}}
<u-button
type="success"
class="uBtn"
shape="circle"
:loading="isLoading"
loadingText="支付中"
@tap="quickPay(isRecharge)"
color="linear-gradient(to right, #005BAC, #005BAC )"
>{{ '立即支付' }}
</u-button>
</view>
</view>
</view>
<!-- 输入验证码密码 -->
<u-popup :show="isPw"
mode="center"
closeable
@close="closePw">
<view class="t_tit">{{'支付验证'}}</view>
<u-popup :show="isPw" mode="center" closeable @close="closePw">
<view class="t_tit">{{ '支付验证' }}</view>
<view class="box">
<view class="c_tit">{{ '请输入短信验证码' }}</view>
<view class="c_tit">{{'请输入短信验证码'}}</view>
<u--input border="surround" v-model="codeValue"></u--input>
<u--input border="surround"
v-model="codeValue"></u--input>
<u-button type="success"
class="uBtn"
shape="circle"
:loading="isLoading"
loadingText="支付中"
@tap="payPw()"
color="linear-gradient(to right, #005BAC, #005BAC )">{{'立即支付'}} </u-button>
<u-button
type="success"
class="uBtn"
shape="circle"
:loading="isLoading"
loadingText="支付中"
@tap="payPw()"
color="linear-gradient(to right, #005BAC, #005BAC )"
>{{ '立即支付' }}
</u-button>
</view>
</u-popup>
<!-- 成功 -->
<u-modal :show="showSucce"
showConfirmButton
:content='content'
confirmColor='#DE3932'
@confirm="reset"
ref="uModal"
:asyncClose="true"></u-modal>
<u-modal
:show="showSucce"
showConfirmButton
:content="content"
confirmColor="#DE3932"
@confirm="reset"
ref="uModal"
:asyncClose="true"
></u-modal>
<!-- 二维码 -->
<u-popup :show="wxPopup"
mode="center"
closeable
@close="closewxPopup">
<view class="t_tit">{{'微信支付'}}</view>
<u-popup :show="wxPopup" mode="center" closeable @close="closewxPopup">
<view class="t_tit">{{ '微信支付' }}</view>
<view class="pay_code">
<div ref="qrCodeUrlWx"
class="qrcode"></div>
<div ref="qrCodeUrlWx" class="qrcode"></div>
</view>
</u-popup>
<hiSuccess @successClose="successClose"
ref="hiSuccess"></hiSuccess>
<hiSuccess @successClose="successClose" ref="hiSuccess"></hiSuccess>
</view>
</template>
@ -300,7 +272,7 @@ export default {
content: '支付成功',
wxPopup: false,
luckydrawData: {},
ifcz: false,
isRecharge: false,
czJe: '',
tlList: [],
}
@ -314,8 +286,8 @@ export default {
)
this.pkCountry = uni.getStorageSync('pkCountry')
// if (this.paramsPost.ifcz) {
// this.ifcz = this.paramsPost.ifcz
// if (this.paramsPost.isRecharge) {
// this.isRecharge = this.paramsPost.isRecharge
// this.businessType = 3
// uni.setNavigationBarTitle({
// title: ''
@ -324,7 +296,7 @@ export default {
// uni.setNavigationBarTitle({
// title: ''
// });
// this.ifcz = false
// this.isRecharge = false
// if (JSON.parse(options.paramsPost).orderType == 4) {
this.orderCode = this.paramsPost.orderCode
// this.luckydrawData = this.paramsPost.luckydrawData
@ -374,7 +346,7 @@ export default {
pkBaseId: this.luckydrawData.pkBaseId,
payNum: this.luckydrawData.payNum,
})
.then((res) => {
.then(res => {
if (res.code == 200) {
this.orderData.orderAmount = res.data.toBePaidMoney
this.payDetail = res.data
@ -411,7 +383,7 @@ export default {
})
},
fansOrder() {
api.fansOrder(this.orderCode).then((res) => {
api.fansOrder(this.orderCode).then(res => {
this.isLoading = false
this.isPw = false
removeToken()
@ -436,7 +408,7 @@ export default {
pkSettleCountry: this.pkCountry,
}
this.isLoading = true
url(obj).then((res) => {
url(obj).then(res => {
if (res.code == 200) {
// this.isPw = false
// this.$refs.hiSuccess.showSuccess(res.data)
@ -481,7 +453,7 @@ export default {
payType: 3, //
bindCode: this.hfList[indexed].bindCode,
}
api.unifiedorder(params).then((response) => {
api.unifiedorder(params).then(response => {
this.isBank = 'hf'
this.bindCode = this.hfList[indexed].bindCode
this.isPw = true
@ -497,7 +469,7 @@ export default {
payType: 3, //
bindCode: this.jdList[indexed].bindCode,
}
api.unifiedorder(params).then((response) => {
api.unifiedorder(params).then(response => {
this.isBank = 'jd'
this.bindCode = this.jdList[indexed].bindCode
this.isPw = true
@ -512,7 +484,7 @@ export default {
payType: 3, //
bindCode: this.tlList[indexed].bindCode,
}
api.unifiedorder(params).then((response) => {
api.unifiedorder(params).then(response => {
this.isBank = 'tl'
this.bindCode = this.tlList[indexed].bindCode
this.isPw = true
@ -530,7 +502,7 @@ export default {
payType: 2,
appletFlag: 0,
}
api.unifiedorder(params).then((res) => {
api.unifiedorder(params).then(res => {
let url =
'https://cloud1-8gp1n6uofa17e2e2-1315820965.tcloudbaseapp.com/jump_mp.html?sign=8587800b05c859700944247c03eeae1c&t=1698224973&state=' +
res.data
@ -547,7 +519,7 @@ export default {
payType: 2,
appletFlag: 0,
}
api.unifiedorder(params).then((res) => {
api.unifiedorder(params).then(res => {
let url =
'https://cloud1-1gql8u3v1fe85a37-1322999719.tcloudbaseapp.com/jump_mp.html?sign=d77deffc9e8aecd2b721f8430c376370&t=1705374125&state=' +
res.data
@ -562,7 +534,7 @@ export default {
payChannel: val,
payType: 2,
}
api.unifiedorder(params).then((res) => {
api.unifiedorder(params).then(res => {
this.wxPopup = true
this.$nextTick(() => {
new QRCode(
@ -593,7 +565,7 @@ export default {
}
},
getPayConfig() {
api.payConfig().then((res) => {
api.payConfig().then(res => {
this.payList = res.data
this.$nextTick(() => {
this.$refs.collapse.init()
@ -602,7 +574,7 @@ export default {
})
},
getBankList() {
api.jdBankList().then((res) => {
api.jdBankList().then(res => {
this.jdList = res.data
})
// api.hfBankList().then((res) => {
@ -623,7 +595,7 @@ export default {
orderCode: this.orderCode,
pkSettleCountry: this.pkCountry,
})
.then((res) => {
.then(res => {
this.orderData = res.data
this.downTime()
})
@ -645,13 +617,13 @@ export default {
orderCode: this.orderCode,
pkSettleCountry: this.pkCountry,
})
.then((res) => {
.then(res => {
// this.payDetail = res.data
this.$set(this, 'payDetail', res.data)
})
},
reset() {
this.$store.dispatch('GetInfo').then((res) => {
this.$store.dispatch('GetInfo').then(res => {
uni.reLaunch({
url: '/pages/index/index',
})
@ -669,7 +641,7 @@ export default {
// this.showSucce = true
this.fansOrder()
} else {
api.payStatus(data).then((res) => {
api.payStatus(data).then(res => {
that.sucPay = res.data
})
}
@ -710,7 +682,9 @@ export default {
.tit {
font-size: 24px;
font-family: PingFang SC-Semibold, PingFang SC;
font-family:
PingFang SC-Semibold,
PingFang SC;
font-weight: 600;
text-align: center;
color: #333333;
@ -719,7 +693,9 @@ export default {
.tit1 {
font-size: 24px;
font-family: PingFang SC-Semibold, PingFang SC;
font-family:
PingFang SC-Semibold,
PingFang SC;
font-weight: 600;
color: #e02b26;
text-align: center;
@ -728,7 +704,9 @@ export default {
.tit2 {
font-size: 11px;
font-family: PingFang SC-Regular, PingFang SC;
font-family:
PingFang SC-Regular,
PingFang SC;
font-weight: 400;
color: #666666;
display: flex;
@ -755,7 +733,9 @@ export default {
display: flex;
align-items: center;
font-size: 12px;
font-family: PingFang SC-Semibold, PingFang SC;
font-family:
PingFang SC-Semibold,
PingFang SC;
font-weight: 600;
color: #333333;
@ -793,7 +773,9 @@ export default {
display: flex;
align-items: center;
font-size: 12px;
font-family: PingFang SC-Regular, PingFang SC;
font-family:
PingFang SC-Regular,
PingFang SC;
font-weight: 400;
color: #333333;
@ -915,14 +897,18 @@ export default {
justify-content: space-between;
color: #666;
font-size: 12px;
font-family: PingFang SC-Semibold, PingFang SC;
font-family:
PingFang SC-Semibold,
PingFang SC;
font-weight: 600;
color: #999;
}
.tTit {
font-size: 12px;
font-family: PingFang SC-Semibold, PingFang SC;
font-family:
PingFang SC-Semibold,
PingFang SC;
font-weight: 600;
color: #666;
}

View File

@ -3,9 +3,9 @@
<view class="index_header"> </view>
<view class="contxt">
<!-- 充值 -->
<template v-if="ifcz">
<template v-if="isRecharge">
<div class="tit4">{{ '充值金额' }}</div>
<u-input class="czinputbox" v-model="czJe"></u-input>
<u-input class="czinputbox" v-model="rechargeAmount"></u-input>
</template>
<template v-else>
<view class="tit">{{ '待支付金额' }}</view>
@ -29,7 +29,9 @@
>
<u-collapse-item
name="1"
v-if="!ifcz && !isShare & (userInfo.memberCode != 'BF66886688')"
v-if="
!isRecharge && !isShare && userInfo.memberCode != 'BF66886688'
"
>
<view slot="title" class="pf">
<img src="@/static/images/yhkzf.jpg" alt="" />
@ -167,64 +169,104 @@
</view>
</u-collapse-item>
<!-- 暂时隐藏在线支付 -->
<u-collapse-item name="2" v-if="onlinePay && false">
<u-collapse-item name="2" v-if="onlinePay">
<view slot="title" class="pf">
<img src="@/static/images/under_pay.png" alt="" />
<view>{{ '在线支付' }}</view>
</view>
<view class="flex_ac" v-show="this.payList.pay11">
<view
class="flex_ac"
v-show="payList[PAY_AUTH[PAY_TYPE.BAO_FU_WECHAT]]"
>
<view class="flex_ac_i">
<img src="@/static/images/pay_i2.png" alt="" />
<view>{{ '宝付微信支付' }}</view>
</view>
<u-radio-group v-model="whatPay">
<u-radio activeColor="red" size="14" label="" :name="11">
<u-radio
activeColor="red"
size="14"
label=""
:name="PAY_TYPE.BAO_FU_WECHAT"
>
</u-radio>
</u-radio-group>
</view>
<view class="flex_ac" v-show="this.payList.pay12">
<view
class="flex_ac"
v-show="payList[PAY_AUTH[PAY_TYPE.BAO_FU_WECHAT_SCAN]]"
>
<view class="flex_ac_i">
<img src="@/static/images/pay_i2.png" alt="" />
<view>{{ '宝付微信扫码' }}</view>
</view>
<u-radio-group v-model="whatPay">
<u-radio activeColor="red" size="14" label="" :name="12">
<u-radio
activeColor="red"
size="14"
label=""
:name="PAY_TYPE.BAO_FU_WECHAT_SCAN"
>
</u-radio>
</u-radio-group>
</view>
<view class="flex_ac" v-show="this.payList.pay13">
<view
class="flex_ac"
v-show="payList[PAY_AUTH[PAY_TYPE.HUI_FU_WECHAT]]"
>
<view class="flex_ac_i">
<img src="@/static/images/pay_i2.png" alt="" />
<view>{{ '汇付微信支付' }}</view>
</view>
<u-radio-group v-model="whatPay">
<u-radio activeColor="red" size="14" label="" :name="13">
<u-radio
activeColor="red"
size="14"
label=""
:name="PAY_TYPE.HUI_FU_WECHAT"
>
</u-radio>
</u-radio-group>
</view>
<!-- 微信支付 -->
<view class="flex_ac" v-show="this.payList.pay73">
<view
class="flex_ac"
v-show="payList[PAY_AUTH[PAY_TYPE.WECHAT_PAY]]"
>
<view class="flex_ac_i">
<img src="@/static/images/pay_i2.png" alt="" />
<view>{{ '微信支付' }}</view>
</view>
<u-radio-group v-model="whatPay">
<u-radio activeColor="red" size="14" label="" :name="73">
<u-radio
activeColor="red"
size="14"
label=""
:name="PAY_TYPE.WECHAT_PAY"
>
</u-radio>
</u-radio-group>
</view>
<!-- 支付宝支付 -->
<view class="flex_ac" v-show="this.payList.pay74">
<view class="flex_ac" v-show="payList[PAY_AUTH[PAY_TYPE.ALI_PAY]]">
<view class="flex_ac_i">
<img src="@/static/images/pay_i3.png" alt="" />
<view>{{ '支付宝支付' }}</view>
</view>
<u-radio-group v-model="whatPay">
<u-radio activeColor="red" size="14" label="" :name="74">
<u-radio
activeColor="red"
size="14"
label=""
:name="PAY_TYPE.ALI_PAY"
>
</u-radio>
</u-radio-group>
</view>
<view class="flex_ac1" v-show="this.payList.pay15">
<view
class="flex_ac1"
v-show="payList[PAY_AUTH[PAY_TYPE.HUI_FU_BANK_CARD]]"
>
<view class="flex_ac_i">
<img src="@/static/images/jdBank.jpg" alt="" />
<view>{{ '汇付银行卡' }} </view>
@ -246,7 +288,7 @@
activeColor="red"
size="14"
label=""
:name="'hf' + index"
:name="PAY_TYPE.HUI_FU_BANK_CARD + index"
>
</u-radio>
</u-radio-group>
@ -257,17 +299,28 @@
</view>
</view>
</view>
<view class="flex_ac" v-show="this.payList.pay32">
<view
class="flex_ac"
v-show="payList[PAY_AUTH[PAY_TYPE.TONG_LIAN_WECHAT]]"
>
<view class="flex_ac_i">
<img src="@/static/images/pay_i2.png" alt="" />
<view>通联微信支付</view>
</view>
<u-radio-group v-model="whatPay">
<u-radio activeColor="red" size="14" label="" :name="32">
<u-radio
activeColor="red"
size="14"
label=""
:name="PAY_TYPE.TONG_LIAN_WECHAT"
>
</u-radio>
</u-radio-group>
</view>
<view class="flex_ac1" v-show="this.payList.pay4">
<view
class="flex_ac1"
v-show="payList[PAY_AUTH[PAY_TYPE.JING_DONG_BANK_CARD]]"
>
<view class="flex_ac_i">
<img src="@/static/images/jdBank.jpg" alt="" />
<view>{{ '京东银行卡' }}</view>
@ -287,7 +340,7 @@
activeColor="red"
size="14"
label=""
:name="'jd' + index"
:name="PAY_TYPE.JING_DONG_BANK_CARD + index"
>
</u-radio>
</u-radio-group>
@ -298,7 +351,28 @@
</view>
</view>
</view>
<view class="flex_ac1" v-show="this.payList.pay33">
<view
class="flex_ac"
v-show="payList[PAY_AUTH[PAY_TYPE.JING_DONG_H5]]"
>
<view class="flex_ac_i">
<img src="@/static/images/jdBank.jpg" alt="" />
<view>京东收银台</view>
</view>
<u-radio-group v-model="whatPay">
<u-radio
activeColor="red"
size="14"
label=""
:name="PAY_TYPE.JING_DONG_H5"
>
</u-radio>
</u-radio-group>
</view>
<view
class="flex_ac1"
v-show="payList[PAY_AUTH[PAY_TYPE.TONG_LIAN_BANK_CARD]]"
>
<view class="flex_ac_i">
<img src="@/static/images/jdBank.jpg" alt="" />
<view>{{ '通联银行卡' }}</view>
@ -318,7 +392,7 @@
activeColor="red"
size="14"
label=""
:name="'tl' + index"
:name="PAY_TYPE.TONG_LIAN_BANK_CARD + index"
>
</u-radio>
</u-radio-group>
@ -332,7 +406,7 @@
</u-collapse-item>
</u-collapse>
</view>
<view class="kuang" v-if="!ifcz">
<view class="kuang" v-if="!isRecharge">
<div v-show="specialArea == REGIEST_AREA.id">
<div class="tit4">{{ '注册会员信息' }}</div>
<div class="quan">
@ -539,7 +613,7 @@
:loading="isLoading"
loadingText="支付中"
:disabled="payBtnDisabled"
@tap="quickPay(ifcz)"
@tap="quickPay(isRecharge)"
color="linear-gradient(to right, #005BAC, #005BAC )"
>
{{ '立即支付' }}
@ -574,7 +648,12 @@
</view>
</u-popup>
<!-- 支付宝二维码 -->
<u-popup :show="wxPopup1" mode="center" closeable @close="closewxPopup">
<u-popup
:show="aliQrCodeVisible"
mode="center"
closeable
@close="closewxPopup"
>
<view class="t_tit">{{ '支付宝支付' }}</view>
<view class="pay_code">
<div ref="qrCodeUrlWx" id="qrCodeUrlWx" class="qrcode"></div>
@ -607,6 +686,12 @@ import * as api from '@/config/pay.js'
import QRCode from 'qrcodejs2'
import successDialog from '@/components/successDialog.vue'
import * as act from '@/config/activity.js'
import {
PAY_TYPE,
PAY_CHANEL,
PAY_REDIRECT_URL,
PAY_AUTH,
} from '@/util/constant'
import {
REGIEST_AREA,
UPGRADE_AREA,
@ -638,6 +723,10 @@ export default {
userInfo: '',
activeNames: 1,
whatPay: '',
PAY_TYPE,
PAY_CHANEL,
PAY_REDIRECT_URL,
PAY_AUTH,
hfList: [],
jdList: [],
tlList: [],
@ -650,10 +739,10 @@ export default {
sucPay: 0,
content: '支付成功',
wxPopup: false,
wxPopup1: false,
aliQrCodeVisible: false,
luckydrawData: {},
ifcz: false,
czJe: '',
isRecharge: false,
rechargeAmount: '',
qrcodeimg: '',
onlinePay: true,
unBindCode: '',
@ -665,22 +754,25 @@ export default {
},
computed: {
payBtnDisabled() {
if (this.ifcz) {
if (this.isRecharge) {
return !Object.values(this.payList).some(val => val)
}
return false
},
},
onLoad(options) {
async onLoad(options) {
this.paramsPost = JSON.parse(options.paramsPost)
console.log(
'%c [ this.paramsPost ]-734',
'font-size:13px; background:#777244; color:#bbb688;',
this.paramsPost
)
//
await this.getPayConfig()
clearInterval(this.clockTime)
this.pkCountry = uni.getStorageSync('pkCountry')
if (this.paramsPost.ifcz) {
this.ifcz = this.paramsPost.ifcz
if (this.paramsPost.isRecharge) {
this.activeNames = '2'
const auth = Object.keys(this.payList).find(key => this.payList[key])
this.whatPay = Object.keys(this.PAY_AUTH).find(
key => this.PAY_AUTH[key] === auth
)
this.isRecharge = this.paramsPost.isRecharge
this.businessType = 3
uni.setNavigationBarTitle({
title: '充值',
@ -689,7 +781,7 @@ export default {
uni.setNavigationBarTitle({
title: '订单支付',
})
this.ifcz = false
this.isRecharge = false
if (JSON.parse(options.paramsPost).orderType == 4) {
this.orderCode = this.paramsPost.orderCode
this.luckydrawData = this.paramsPost.luckydrawData
@ -718,10 +810,6 @@ export default {
}
}
}
//
this.getPayConfig()
clearInterval(this.clockTime)
},
onShow() {
@ -772,7 +860,7 @@ export default {
},
closewxPopup() {
this.wxPopup = false
this.wxPopup1 = false
this.aliQrCodeVisible = false
this.$refs.qrCodeUrlWx.innerHTML = ''
clearInterval(payStatus)
},
@ -801,11 +889,11 @@ export default {
let url, obj
//
if (this.isBank) {
if (this.isBank == 'hf') {
if (this.isBank == PAY_TYPE.HUI_FU_BANK_CARD) {
url = api.payConfirmHf
} else if (this.isBank == 'jd') {
} else if (this.isBank == PAY_TYPE.JING_DONG_BANK_CARD) {
url = api.payConfirmJd
} else if (this.isBank == 'tl') {
} else if (this.isBank == PAY_TYPE.TONG_LIAN_BANK_CARD) {
url = api.payConfirmTl
}
obj = {
@ -877,7 +965,7 @@ export default {
this.$refs.successDialog.showSuccess(res.data || this.orderData)
}
} else {
if (this.ifcz) {
if (this.isRecharge) {
uni.showToast({
title: '充值成功',
icon: 'none',
@ -901,204 +989,119 @@ export default {
})
}
},
quickPay(cz) {
if (cz) {
if (!this.czJe || this.czJe <= 0) {
async quickPay(isRecharge) {
if (isRecharge) {
if (!this.rechargeAmount || this.rechargeAmount <= 0) {
uni.showToast({
icon: 'none',
title: '请输入正确的充值金额',
})
return
}
if (!this.whatPay) {
uni.showToast({
icon: 'none',
title: '请选择支付方式',
})
return
}
}
if (this.activeNames == 2) {
//
if (typeof this.whatPay == 'number') {
if (cz) {
if (
![
PAY_TYPE.HUI_FU_BANK_CARD,
PAY_TYPE.JING_DONG_BANK_CARD,
PAY_TYPE.TONG_LIAN_BANK_CARD,
].includes(this.whatPay.slice(0, 2))
) {
if (isRecharge) {
//
api
.preCharge({
rechargeAmount: this.czJe,
rechargeAmount: this.rechargeAmount,
})
.then(res => {
this.paramsPost = res.data
this.orderCode = res.orderCode
if (this.whatPay == 11) {
this.scanPayBfWxJump(5)
} else if (this.whatPay == 12) {
this.scanPayBfWx(5)
} else if (this.whatPay == 13) {
this.scanPayBfWx(6)
} else if (this.whatPay == 32) {
this.scanPayTlWxJump(3)
} else if (this.whatPay == 73) {
this.scanPayWx(7)
} else if (this.whatPay == 74) {
this.scanPayAl(7)
if (this.whatPay == PAY_TYPE.JING_DONG_H5) {
this.redirectPay(PAY_CHANEL[this.whatPay])
} else if (
[PAY_TYPE.BAO_FU_WECHAT, PAY_TYPE.HUI_FU_WECHAT].includes(
this.whatPay
)
) {
this.scanPayBfWx(PAY_CHANEL[this.whatPay])
} else if (this.whatPay == PAY_TYPE.TONG_LIAN_WECHAT) {
this.weChatPay(PAY_CHANEL[this.whatPay])
}
})
} else {
if (this.whatPay == 11) {
this.scanPayBfWxJump(5)
} else if (this.whatPay == 12) {
this.scanPayBfWx(5)
} else if (this.whatPay == 13) {
this.scanPayBfWx(6)
} else if (this.whatPay == 32) {
this.scanPayTlWxJump(3)
} else if (this.whatPay == 73) {
this.scanPayWx(7)
} else if (this.whatPay == 74) {
this.scanPayAl(7)
if ([PAY_TYPE.JING_DONG_H5].includes(this.whatPay)) {
this.redirectPay(PAY_CHANEL[this.whatPay])
} else if (
[PAY_TYPE.BAO_FU_WECHAT_SCAN, PAY_TYPE.HUI_FU_WECHAT].includes(
this.whatPay
)
) {
this.scanPayBfWx(PAY_CHANEL[this.whatPay])
} else if (this.whatPay == PAY_TYPE.WECHAT_PAY) {
this.scanPayWx(PAY_CHANEL[this.whatPay])
} else if (this.whatPay == PAY_TYPE.ALI_PAY) {
this.scanPayAl(PAY_CHANEL[this.whatPay])
}
}
} else {
if (this.whatPay.slice(0, 2) == 'hf') {
let indexed = this.whatPay.slice(2, 4)
if (!cz) {
let params = {
businessType: this.businessType, //
businessCode: this.orderCode,
payChannel: 6, //
payType: 3, //
bindCode: this.hfList[indexed].bindCode,
}
api.unifiedorder(params).then(response => {
this.isBank = 'hf'
this.bindCode = this.hfList[indexed].bindCode
this.isPw = true
const indexed = this.whatPay.slice(2, 4)
const payTypeEnum = this.whatPay.slice(0, 2)
const bankListMap = {
[PAY_TYPE.HUI_FU_BANK_CARD]: this.hfList[indexed].bindCode,
[PAY_TYPE.JING_DONG_BANK_CARD]: this.jdList[indexed].bindCode,
[PAY_TYPE.TONG_LIAN_BANK_CARD]: this.tlList[indexed].bindCode,
}
this.bindCode = bankListMap[payTypeEnum]
const params = {
businessType: isRecharge ? 3 : this.businessType, //
payChannel: PAY_CHANEL[payTypeEnum],
payType: 3, //
bindCode: bankListMap[payTypeEnum],
}
if (!isRecharge) {
Object.assign(params, {
businessCode: this.orderCode,
})
} else {
try {
const orderCode = await this.preCharge()
Object.assign(params, {
businessCode: orderCode,
})
this.checkPayStatus(params)
} else {
api
.preCharge({
rechargeAmount: this.czJe,
})
.then(res => {
let params = {
businessType: 3, //
businessCode: res.orderCode,
payChannel: 6, //
payType: 3, //
bindCode: this.hfList[indexed].bindCode,
}
api.unifiedorder(params).then(response => {
this.isBank = 'hf'
this.bindCode = this.hfList[indexed].bindCode
this.orderCode = res.orderCode
this.isPw = true
})
})
this.checkPayStatus(params)
}
} else if (this.whatPay.slice(0, 2) == 'jd') {
let indexed = this.whatPay.slice(2, 4)
if (!cz) {
let params = {
businessType: this.businessType, //
businessCode: this.orderCode,
payChannel: 4, //
payType: 3, //
bindCode: this.jdList[indexed].bindCode,
}
api.unifiedorder(params).then(response => {
this.isBank = 'jd'
this.bindCode = this.jdList[indexed].bindCode
this.isPw = true
this.orderCode = orderCode
} catch (error) {
uni.showToast({
title: error,
icon: 'none',
})
this.checkPayStatus(params)
} else {
api
.preCharge({
rechargeAmount: this.czJe,
})
.then(res => {
let params = {
businessType: 3, //
businessCode: res.orderCode,
payChannel: 4, //
payType: 3, //
bindCode: this.jdList[indexed].bindCode,
}
api.unifiedorder(params).then(response => {
this.isBank = 'jd'
this.bindCode = this.jdList[indexed].bindCode
this.orderCode = res.orderCode
this.isPw = true
})
})
this.checkPayStatus(params)
}
} else if (this.whatPay.slice(0, 2) == 'tl') {
let indexed = this.whatPay.slice(2, 4)
if (!cz) {
let params = {
businessType: this.businessType, //
businessCode: this.orderCode,
payChannel: 3, //
payType: 3, //
bindCode: this.tlList[indexed].bindCode,
}
api.unifiedorder(params).then(response => {
this.isBank = 'tl'
this.bindCode = this.tlList[indexed].bindCode
this.isPw = true
})
this.checkPayStatus(params)
} else {
api
.preCharge({
rechargeAmount: this.czJe,
})
.then(res => {
let params = {
businessType: 3, //
businessCode: res.orderCode,
payChannel: 3, //
payType: 3, //
bindCode: this.tlList[indexed].bindCode,
}
api.unifiedorder(params).then(response => {
this.isBank = 'tl'
this.bindCode = this.tlList[indexed].bindCode
this.orderCode = res.orderCode
this.isPw = true
})
})
this.checkPayStatus(params)
return
}
}
api.unifiedorder(params).then(response => {
this.isBank = this.whatPay.slice(0, 2)
this.isPw = true
this.checkPayStatus(params)
})
}
} else {
if (cz) {
//
api
.preCharge({
rechargeAmount: this.czJe,
})
.then(res => {
this.paramsPost = res.data
this.orderCode = res.orderCode
if (this.whatPay == 12) {
this.scanPayBfWx(5)
} else if (this.whatPay == 13) {
this.scanPayBfWx(6)
}
})
this.isBank = ''
this.isPw = true
} else {
api.generate().then(res => {
uni.setStorageSync('mToken', res.msg)
})
this.isBank = ''
this.isPw = true
}
api.generate().then(res => {
uni.setStorageSync('mToken', res.msg)
})
this.isBank = ''
this.isPw = true
}
},
scanPayBfWx(val) {
let params
if (this.ifcz) {
if (this.isRecharge) {
params = {
businessType: 3, //
businessCode: this.orderCode,
@ -1142,7 +1145,7 @@ export default {
//
scanPayWx(val) {
let params
if (this.ifcz) {
if (this.isRecharge) {
params = {
businessType: 3, //
businessCode: this.orderCode,
@ -1183,10 +1186,66 @@ export default {
})
this.checkPayStatus(params)
},
getPayAuthToken(payChannel) {
return new Promise((resolve, reject) => {
const extParam = {
isRecharge: !!this.isRecharge,
orderCode: this.orderCode,
specialArea: this.specialArea,
}
// extParamJSONbase64
const extParamBase64 = btoa(JSON.stringify(extParam))
const params = {
payChannel: payChannel,
payType: 2,
appletFlag: 0,
businessType: this.isRecharge ? 3 : this.businessType,
businessCode: this.orderCode,
extParam: extParamBase64,
}
api.unifiedorder(params).then(res => {
if (res.code === 200) {
resolve(res.data)
this.checkPayStatus(params)
} else {
uni.showToast({
title: res.msg,
icon: 'none',
})
reject(res.msg)
}
})
})
},
redirectPay(payChannel) {
this.getPayAuthToken(payChannel).then(url => {
if (navigator.userAgent.includes('MicroMessenger')) {
window.location.href = url
} else {
window.open(url)
}
})
},
weChatPay(payChannel) {
this.getPayAuthToken(payChannel)
.then(res => {
const url = PAY_REDIRECT_URL + '&state=' + res + '&payment=0'
window.open(url)
})
.catch(_ => {
const url = PAY_REDIRECT_URL + '&state=' + 'eroor' + '&payment=0'
// window.open(url)
window.location.href = url
uni.showToast({
title: url,
icon: 'none',
})
})
},
//
scanPayAl(val) {
let params
if (this.ifcz) {
if (this.isRecharge) {
params = {
businessType: 3, //
businessCode: this.orderCode,
@ -1202,7 +1261,7 @@ export default {
}
}
api.unifiedorder(params).then(res => {
this.wxPopup1 = true
this.aliQrCodeVisible = true
let that = this
this.$nextTick(() => {
new QRCode(
@ -1230,7 +1289,7 @@ export default {
//
scanPayBfWxJump(val) {
let params
if (this.ifcz) {
if (this.isRecharge) {
params = {
businessType: 3, //
businessCode: this.orderCode,
@ -1261,7 +1320,7 @@ export default {
//
scanPayTlWxJump(val) {
let params
if (this.ifcz) {
if (this.isRecharge) {
params = {
businessType: 3, //
businessCode: this.orderCode,
@ -1300,8 +1359,12 @@ export default {
}
},
getPayConfig() {
api.payConfig().then(res => {
this.payList = res.data
return new Promise((resolve, reject) => {
api.payConfig().then(res => {
this.payList = res.data
console.log(this.payList)
resolve(res.data)
})
})
},
getBankList() {
@ -1380,7 +1443,7 @@ export default {
})
} else {
this.wxPopup = false
this.wxPopup1 = false
this.aliQrCodeVisible = false
this.showSucce = true
}
} else {

517
pages/pay/success.vue Normal file
View File

@ -0,0 +1,517 @@
<template>
<view class="success-page">
<!-- 状态栏占位 -->
<view class="status-bar"></view>
<!-- 成功状态区域 -->
<view v-show="payStatus === 1" class="success-section">
<view class="success-icon-wrapper">
<view class="success-icon">
<text class="success-checkmark"></text>
</view>
<view class="success-rings">
<view class="ring ring1"></view>
<view class="ring ring2"></view>
<view class="ring ring3"></view>
</view>
</view>
<view class="success-title">{{ paySuccessText }}</view>
<view v-if="!isRecharge && payStatus === 1" class="success-subtitle"
>您的订单已支付完成</view
>
</view>
<!-- 查询中状态区域 -->
<view v-show="payStatus === 0" class="loading-section">
<view class="loading-icon-wrapper">
<view class="loading-icon">
<view class="loading-spinner">
<view class="spinner-dot dot1"></view>
<view class="spinner-dot dot2"></view>
<view class="spinner-dot dot3"></view>
</view>
</view>
<view class="loading-rings">
<view class="loading-ring ring1"></view>
<view class="loading-ring ring2"></view>
</view>
</view>
<view class="loading-title">支付查询中...</view>
<view class="loading-subtitle">请稍等正在确认您的支付状态</view>
</view>
<!-- 操作按钮区域 -->
<view class="action-section">
<view class="button-group">
<button
v-if="!isRecharge"
class="btn btn-secondary"
@click="goToOrderList"
>
查看订单
</button>
<button class="btn btn-primary" @click="goToHome">返回首页</button>
</view>
</view>
<successDialog @successClose="successClose" ref="successDialog" />
</view>
</template>
<script>
import { mapGetters } from 'vuex'
import { payStatus, registerInfo } from '@/config/pay.js'
import successDialog from '@/components/successDialog.vue'
let paySetTimeoutFlag = null
let getRegisterInfoTimeoutFlag = null
export default {
name: 'PaySuccess',
components: {
successDialog,
},
data() {
return {
orderCode: '',
specialArea: null,
isRecharge: undefined,
payStatus: 0,
}
},
computed: {
...mapGetters(['userInfo']),
paySuccessText() {
if (this.isRecharge === undefined) {
return ''
}
if (this.isRecharge === true) {
return '充值成功'
}
return '支付成功'
},
},
onLoad(options) {
//
const extParam = JSON.parse(atob(options.extParam || '{}'))
console.log(extParam, '..extParam')
this.specialArea = extParam.specialArea
this.isRecharge = extParam.isRecharge
this.orderCode = extParam.orderCode || ''
if (this.orderCode) {
setTimeout(() => {
this.pollingPayStatus(this.orderCode)
}, 500)
}
//
uni.setNavigationBarTitle({
title: '支付成功',
})
},
onUnload() {
clearTimeout(paySetTimeoutFlag)
clearTimeout(getRegisterInfoTimeoutFlag)
},
methods: {
getRegisterInfo() {
registerInfo(this.orderCode).then(res => {
if (res.data) {
uni.hideLoading()
this.$refs.successDialog.showSuccess(res.data)
} else {
getRegisterInfoTimeoutFlag = setTimeout(() => {
this.getRegisterInfo()
}, 3000)
}
})
},
pollingPayStatus(orderCode) {
payStatus({ businessCode: orderCode }).then(res => {
if (res.data == 1) {
this.payStatus = 1
clearTimeout(paySetTimeoutFlag)
if ([1, 7, 24].includes(Number(this.specialArea))) {
uni.showLoading({
title: '注册信息加载中...',
mask: false,
})
setTimeout(() => {
this.getRegisterInfo()
}, 2000)
}
} else {
paySetTimeoutFlag = setTimeout(() => {
this.pollingPayStatus(orderCode)
}, 1000)
}
})
},
//
goToOrderList() {
uni.redirectTo({
url: '/pages/mine/order/index',
})
},
successClose() {
uni.redirectTo({
url: '/pages/mine/order/index',
})
},
//
goToHome() {
uni.switchTab({
url: '/pages/index/index',
})
},
},
}
</script>
<style lang="scss" scoped>
.success-page {
min-height: 100vh;
background: linear-gradient(135deg, #f8fafc 0%, #e3f2fd 100%);
position: relative;
display: flex;
flex-direction: column;
}
.status-bar {
height: var(--status-bar-height);
background: transparent;
}
.success-section {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 60rpx 40rpx 40rpx;
position: relative;
}
.success-icon-wrapper {
position: relative;
margin-bottom: 40rpx;
}
.success-icon {
width: 120rpx;
height: 120rpx;
background: #005bac;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
position: relative;
z-index: 2;
box-shadow: 0 8rpx 24rpx rgba(0, 91, 172, 0.3);
animation: successBounce 0.6s ease-out;
}
.success-checkmark {
color: #ffffff;
font-size: 60rpx;
font-weight: bold;
line-height: 1;
}
.success-rings {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: 1;
}
.ring {
position: absolute;
border: 2rpx solid #005bac;
border-radius: 50%;
opacity: 0;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.ring1 {
width: 140rpx;
height: 140rpx;
animation: ripple 1.5s ease-out 0.2s infinite;
}
.ring2 {
width: 180rpx;
height: 180rpx;
animation: ripple 1.5s ease-out 0.6s infinite;
}
.ring3 {
width: 220rpx;
height: 220rpx;
animation: ripple 1.5s ease-out 1s infinite;
}
.success-title {
font-size: 48rpx;
font-weight: 600;
color: #1a1a1a;
margin-bottom: 16rpx;
text-align: center;
}
.success-subtitle {
font-size: 28rpx;
color: #666666;
text-align: center;
line-height: 1.4;
}
.action-section {
padding: 32rpx;
}
.button-group {
display: flex;
gap: 24rpx;
}
.btn {
flex: 1;
height: 88rpx;
border-radius: 44rpx;
font-size: 32rpx;
font-weight: 500;
border: none;
transition: all 0.3s ease;
position: relative;
overflow: hidden;
&::after {
border: none;
}
&.btn-secondary {
background: #ffffff;
color: #005bac;
border: 2rpx solid #005bac;
&:active {
background: #f8fafc;
transform: scale(0.98);
}
}
&.btn-primary {
background: linear-gradient(135deg, #005bac 0%, #0066cc 100%);
color: #ffffff;
box-shadow: 0 4rpx 16rpx rgba(0, 91, 172, 0.3);
&:active {
background: linear-gradient(135deg, #004691 0%, #0052a3 100%);
transform: scale(0.98);
}
}
}
//
@keyframes successBounce {
0% {
transform: scale(0);
opacity: 0;
}
50% {
transform: scale(1.2);
opacity: 1;
}
100% {
transform: scale(1);
opacity: 1;
}
}
@keyframes ripple {
0% {
opacity: 0.6;
transform: translate(-50%, -50%) scale(0.1);
}
100% {
opacity: 0;
transform: translate(-50%, -50%) scale(1);
}
}
.spinner-dot {
position: relative;
width: 12rpx;
height: 12rpx;
background: #ffffff;
border-radius: 50%;
box-shadow: 0 2rpx 4rpx rgba(255, 255, 255, 0.3);
}
.spinner-dot.dot1 {
animation: dotBlink 1.4s ease-in-out infinite;
}
.spinner-dot.dot2 {
animation: dotBlink 1.4s ease-in-out 0.2s infinite;
}
.spinner-dot.dot3 {
animation: dotBlink 1.4s ease-in-out 0.4s infinite;
}
.loading-section {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 60rpx 40rpx 40rpx;
position: relative;
}
.loading-icon-wrapper {
position: relative;
margin-bottom: 40rpx;
}
.loading-icon {
width: 120rpx;
height: 120rpx;
background: linear-gradient(135deg, #005bac 0%, #0066cc 100%);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
position: relative;
z-index: 2;
box-shadow: 0 8rpx 32rpx rgba(0, 91, 172, 0.4);
}
.loading-spinner {
position: relative;
width: 80rpx;
height: 20rpx;
display: flex;
align-items: center;
justify-content: space-between;
}
.loading-rings {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: 1;
}
.loading-ring {
position: absolute;
border: 2rpx solid #005bac;
border-radius: 50%;
opacity: 0;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.loading-ring.ring1 {
width: 140rpx;
height: 140rpx;
animation: loadingRipple 2s ease-out infinite;
}
.loading-ring.ring2 {
width: 180rpx;
height: 180rpx;
animation: loadingRipple 2s ease-out 0.8s infinite;
}
.loading-title {
font-size: 48rpx;
font-weight: 600;
color: #2c3e50;
margin-bottom: 16rpx;
text-align: center;
text-shadow: 0 2rpx 4rpx rgba(0, 0, 0, 0.1);
}
.loading-subtitle {
font-size: 28rpx;
color: #7f8c8d;
text-align: center;
line-height: 1.4;
opacity: 0.9;
}
@keyframes dotBlink {
0% {
opacity: 0.4;
}
50% {
opacity: 1;
}
100% {
opacity: 0.4;
}
}
@keyframes loadingRipple {
0% {
opacity: 0.8;
transform: translate(-50%, -50%) scale(0.1);
}
100% {
opacity: 0;
transform: translate(-50%, -50%) scale(1);
}
}
//
@media (prefers-color-scheme: dark) {
.success-page {
background: linear-gradient(135deg, #1a1a1a 0%, #2d3748 100%);
}
.success-title {
color: #ffffff;
}
.success-subtitle {
color: #a0aec0;
}
.loading-title {
color: #ffffff;
}
.loading-subtitle {
color: #a0aec0;
}
}
//
@media screen and (max-width: 375px) {
.success-icon {
width: 100rpx;
height: 100rpx;
}
.success-checkmark {
font-size: 50rpx;
}
.success-title {
font-size: 42rpx;
}
.button-group {
flex-direction: column;
gap: 16rpx;
}
}
</style>

View File

@ -189,7 +189,7 @@
shape="circle"
:loading="isLoading"
loadingText="支付中"
@tap="quickPay(ifcz)"
@tap="quickPay(isRecharge)"
color="linear-gradient(to right, #005BAC, #005BAC )"
>{{ '立即支付' }}
</u-button>
@ -262,7 +262,7 @@ export default {
content: '支付成功',
wxPopup: false,
luckydrawData: {},
ifcz: false,
isRecharge: false,
czJe: '',
objTree: {},
account: {},
@ -273,8 +273,8 @@ export default {
title: '订单支付',
})
// this.paramsPost = JSON.parse(options.paramsPost)
// if (this.paramsPost.ifcz) {
// this.ifcz = this.paramsPost.ifcz
// if (this.paramsPost.isRecharge) {
// this.isRecharge = this.paramsPost.isRecharge
// this.businessType = 3
// uni.setNavigationBarTitle({
// title: ''
@ -284,7 +284,7 @@ export default {
// uni.setNavigationBarTitle({
// title: ''
// });
// this.ifcz = false
// this.isRecharge = false
// if (JSON.parse(options.paramsPost).orderType == 4) {
// this.orderCode = this.paramsPost.orderCode
// this.luckydrawData = this.paramsPost.luckydrawData
@ -417,7 +417,7 @@ export default {
},
scanPayBfWx(val) {
let params
if (this.ifcz) {
if (this.isRecharge) {
params = {
businessType: 3, //
businessCode: this.orderCode,

486
pages/refund/detail.vue Normal file
View File

@ -0,0 +1,486 @@
<template>
<view class="refund-container">
<!-- 导航栏 -->
<u-navbar
title="退款列表"
:border-bottom="false"
:background="{ backgroundColor: '#005bac' }"
title-color="#fff"
/>
<view class="tips">
<u-icon name="info-circle" color="#005bac" size="20"></u-icon>
<text class="tips-text">如有疑问请联系客服</text>
</view>
<!-- <view class="date-filter">
<view class="date-picker-container">
<view class="date-input-wrapper" @click="showStartDatePicker = true">
<text>{{ startDate || '开始时间' }}</text>
</view>
<text class="separator"></text>
<view class="date-input-wrapper" @click="showEndDatePicker = true">
<text>{{ endDate || '结束时间' }}</text>
</view>
</view>
<button class="search-button" @click="handleSearch">
<u-icon name="search" color="#ffffff" size="20" />
</button>
</view> -->
<!-- 空状态 -->
<u-empty
mode="data"
v-if="refundList.length === 0 && !loading"
text="暂无退款记录"
></u-empty>
<!-- 退款列表 -->
<view class="refund-list">
<u-list @scrolltolower="loadMore" :show-scrollbar="false">
<u-list-item v-for="(item, index) in refundList" :key="index">
<view class="refund-item">
<view class="refund-header">
<view class="order-info">
<text class="order-number"
>订单编号{{ item.businessCode }}</text
>
<text class="member-code">会员编号{{ item.memberCode }}</text>
</view>
<view
class="refund-status"
:class="getStatusClass(item.refundStatus)"
>
{{ getStatusText(item.refundStatus) }}
</view>
</view>
<view class="refund-content">
<view class="refund-amount">
<text class="amount-label">退款金额</text>
<text class="amount-value"
>¥{{ stateFormat(item.refundMoney) }}</text
>
</view>
<view class="refund-time">
<text class="time-label">退款时间</text>
<text class="time-value">{{
formatDate(item.finishTime)
}}</text>
</view>
</view>
</view>
</u-list-item>
</u-list>
<!-- 加载更多 -->
<u-loadmore :status="loadStatus" />
</view>
<u-datetime-picker
:show="showStartDatePicker"
v-model="startDate"
mode="date"
@confirm="onStartDateConfirm"
@cancel="showStartDatePicker = false"
style="flex: 0"
></u-datetime-picker>
<u-datetime-picker
:show="showEndDatePicker"
v-model="endDate"
mode="date"
@confirm="onEndDateConfirm"
@cancel="showEndDatePicker = false"
style="flex: 0"
></u-datetime-picker>
</view>
</template>
<script>
import { getRefundList } from '@/config/mine'
import dayjs from '../../uni_modules/uview-ui/libs/util/dayjs.js'
export default {
name: 'RefundDetail',
data() {
return {
//
startDate: '',
endDate: '',
showStartDatePicker: false,
showEndDatePicker: false,
maxDate: new Date().getTime(),
//
refundList: [],
loading: false,
loadStatus: 'loadmore',
//
currentPage: 1,
pageSize: 10,
hasMore: true,
//
statusMap: {
0: '退款申请中',
1: '退款中',
2: '已退款',
3: '退款失败',
},
}
},
onLoad() {
this.loadRefundList()
},
onPullDownRefresh() {
this.refreshList()
},
methods: {
// 退
async loadRefundList(isLoadMore = false) {
if (this.loading) return
this.loading = true
this.loadStatus = 'loading'
try {
const params = {
pageNum: this.currentPage,
pageSize: this.pageSize,
startDate: this.startDate,
endDate: this.endDate,
}
const res = await getRefundList(params)
if (res.code === 200) {
const newList = res.rows || []
if (isLoadMore) {
this.refundList = [...this.refundList, ...newList]
} else {
this.refundList = newList
}
//
this.hasMore = newList.length === this.pageSize
this.loadStatus = this.hasMore ? 'loadmore' : 'nomore'
if (this.hasMore) {
this.currentPage++
}
} else {
this.$u.toast(res.message || '加载失败')
this.loadStatus = 'loadmore'
}
} catch (error) {
console.error('加载退款列表失败:', error)
this.$u.toast('加载失败,请重试')
this.loadStatus = 'loadmore'
} finally {
this.loading = false
uni.stopPullDownRefresh()
}
},
stateFormat(val) {
if (val) {
return Number(val)
.toFixed(2)
.replace(/(\d)(?=(\d{3})+\.)/g, ($0, $1) => {
return $1 + ','
})
.replace(/\.$/, '')
}
},
//
loadMore() {
if (this.hasMore && !this.loading) {
this.loadRefundList(true)
}
},
//
refreshList() {
this.currentPage = 1
this.hasMore = true
this.loadRefundList()
},
//
handleSearch() {
if (this.startDate && this.endDate && this.startDate > this.endDate) {
this.$u.toast('开始日期不能大于结束日期')
return
}
this.refreshList()
},
//
handleReset() {
this.startDate = ''
this.endDate = ''
this.refreshList()
},
onStartDateConfirm(e) {
this.startDate = this.formatDate(new Date(e.value))
this.startDateValue = e.value
this.showStartDatePicker = false
},
onEndDateConfirm(e) {
this.endDate = this.formatDate(new Date(e.value))
this.endDateValue = e.value
this.showEndDatePicker = false
},
//
formatDate(dateString) {
if (!dateString) return ''
return dayjs(dateString).format('YYYY-MM-DD HH:mm:ss')
},
//
getStatusText(status) {
console.log(status)
return this.statusMap[status] || '未知状态'
},
//
getStatusClass(status) {
const classMap = {
0: 'status-pending',
1: 'status-failed',
2: 'status-success',
3: 'status-cancelled',
}
return classMap[status] || 'status-default'
},
},
}
</script>
<style lang="scss" scoped>
.refund-container {
min-height: 100vh;
background-color: #f5f5f5;
}
.tips {
display: flex;
align-items: center;
justify-content: center;
background-color: #f8f9fa;
margin: 16rpx 30rpx;
padding: 12rpx 20rpx;
border-radius: 4rpx;
border-left: 3rpx solid #005bac;
.tips-text {
font-size: 22rpx;
color: #005bac;
font-weight: 400;
margin-left: 8rpx;
line-height: 1.5;
}
}
.filter-section {
background-color: #fff;
padding: 20rpx 30rpx;
margin-bottom: 20rpx;
.date-filter {
display: flex;
align-items: center;
margin-bottom: 20rpx;
.date-item {
flex: 1;
display: flex;
align-items: center;
justify-content: space-between;
padding: 20rpx;
border: 1px solid #e4e4e4;
border-radius: 8rpx;
background-color: #fafafa;
.date-label {
font-size: 28rpx;
color: #666;
}
.date-value {
font-size: 28rpx;
color: #333;
margin-left: 10rpx;
}
}
.date-separator {
padding: 0 20rpx;
font-size: 28rpx;
color: #666;
}
}
.filter-actions {
display: flex;
justify-content: center;
gap: 20rpx;
}
}
.refund-list {
padding: 10rpx 30rpx 0;
}
.refund-item {
background-color: #fff;
border-radius: 12rpx;
padding: 30rpx;
margin-bottom: 20rpx;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
.refund-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-bottom: 20rpx;
.order-info {
flex: 1;
.order-number {
display: block;
font-size: 28rpx;
color: #333;
font-weight: 500;
margin-bottom: 8rpx;
}
.member-code {
font-size: 24rpx;
color: #666;
}
}
.refund-status {
padding: 8rpx 16rpx;
border-radius: 20rpx;
font-size: 24rpx;
font-weight: 500;
&.status-pending {
background-color: #fff7e6;
color: #fa8c16;
}
&.status-success {
background-color: #f6ffed;
color: #52c41a;
}
&.status-failed {
background-color: #fff2f0;
color: #ff4d4f;
}
&.status-cancelled {
background-color: #f5f5f5;
color: #8c8c8c;
}
&.status-default {
background-color: #f5f5f5;
color: #666;
}
}
}
.refund-content {
display: flex;
justify-content: space-between;
align-items: center;
.refund-amount,
.refund-time {
display: flex;
flex-direction: column;
align-items: flex-start;
.amount-label,
.time-label {
font-size: 24rpx;
color: #666;
margin-bottom: 8rpx;
}
.amount-value {
font-size: 32rpx;
color: #005bac;
font-weight: 600;
}
.time-value {
font-size: 28rpx;
color: #333;
}
}
.refund-time {
align-items: flex-end;
}
}
}
//
@media (max-width: 750rpx) {
.filter-section {
.date-filter {
flex-direction: column;
gap: 20rpx;
.date-separator {
display: none;
}
}
}
}
.date-filter {
display: flex;
align-items: center;
padding: 15px 10px;
background-color: #ffffff;
.date-picker-container {
flex: 1;
display: flex;
align-items: center;
background-color: #f2f2f2;
border-radius: 8px;
padding: 4px;
.date-input-wrapper {
flex: 1;
text-align: center;
padding: 6px 0;
font-size: 14px;
color: #333;
}
.separator {
color: #999;
margin: 0 5px;
}
}
.search-button {
width: 44px;
height: 36px;
margin-left: 10px;
background-color: #007aff;
color: white;
display: flex;
align-items: center;
justify-content: center;
border-radius: 4px;
padding: 0;
line-height: 1;
border: none;
&:after {
border: none;
}
}
}
</style>

View File

@ -61,6 +61,13 @@ export default {
path: '/pages/selfService/realName/realName',
id: '9',
},
{
name: '订单退款明细',
url: '../../static/images/refund-icon.svg',
path: '/pages/refund/detail',
id: '9',
alwaysShow: true,
},
],
theselfHeader: [],
userInfo: '',

View File

@ -0,0 +1 @@
<svg t="1751697878770" class="icon" viewBox="0 0 1105 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6062" width="256" height="256"><path d="M395.815385 303.419077 490.692923 303.419077C495.655385 319.409231 501.720615 331.539692 517.159385 357.454769L598.803692 497.585231 680.487385 358.006154C695.926154 332.091077 702.542769 318.306462 706.953846 303.419077L802.382769 303.419077C795.214769 312.792615 773.159385 344.221538 763.234462 360.211692L687.104 481.595077 717.981538 481.595077C742.793846 481.595077 757.720615 480.492308 775.916308 477.184L775.916308 540.081231C757.169231 536.772923 742.242462 535.670154 717.981538 535.670154L653.430154 535.670154 635.234462 564.342154 635.234462 580.332308 716.878769 580.332308C741.691077 580.332308 755.515077 579.229538 774.813538 575.921231L774.813538 638.818462C756.066462 635.510154 741.139692 634.407385 716.878769 634.407385L635.234462 634.407385 635.234462 671.940923C635.234462 703.369846 636.337231 720.462769 639.645538 742.557538L558.001231 742.557538C560.758154 721.014154 562.412308 698.958769 562.412308 671.940923L562.412308 634.407385 479.113846 634.407385C454.301538 634.407385 439.926154 635.510154 421.179077 638.818462L421.179077 575.921231C440.477538 579.229538 453.750154 580.332308 479.113846 580.332308L562.412308 580.332308 562.412308 563.790769 544.216615 535.670154 480.216615 535.670154C454.852923 535.670154 441.028923 536.772923 422.281846 540.081231L422.281846 477.184C440.477538 480.492308 454.852923 481.595077 480.216615 481.595077L511.094154 481.595077 434.412308 360.211692C418.422154 335.399385 404.086154 313.895385 395.815385 303.419077ZM591.990154 1024C440.162462 1024 304.167385 957.518769 210.432 852.558769L272.699077 804.076308C351.901538 890.643692 465.447385 945.230769 591.990154 945.230769 831.251692 945.230769 1025.220923 751.261538 1025.220923 512 1025.220923 272.738462 831.251692 78.769231 591.990154 78.769231 396.8 78.769231 232.172308 208.029538 178.057846 385.536L243.436308 316.534154C257.378462 301.843692 279.630769 301.489231 293.139692 315.746462 306.609231 330.003692 306.254769 353.476923 292.312615 368.167385L166.124308 501.326769C156.396308 511.606154 142.651077 514.402462 130.638769 510.582154 116.224 513.654154 101.021538 507.313231 93.262769 493.016615L5.12 330.948923C-4.608 313.028923 1.142154 290.146462 18.038154 279.788308 34.894769 269.469538 56.438154 275.613538 66.166154 293.494154L102.872615 360.999385C167.345231 151.985231 361.826462 0 591.990154 0 874.771692 0 1103.990154 229.218462 1103.990154 512 1103.990154 794.781538 874.771692 1024 591.990154 1024Z" fill="#f52a10" p-id="6063"></path></svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

File diff suppressed because one or more lines are too long

41
util/constant.js Normal file
View File

@ -0,0 +1,41 @@
export const PAY_REDIRECT_URL =
'https://cloud1-8g5amgy6c173b906-1362517604.tcloudbaseapp.com/bd-pay-web/jump-mp.html?sign=c2d1fa4dcee3f77accfd22b480128c02&t=1749175241'
export const PAY_TYPE = {
BAO_FU_WECHAT: 'BAO_FU_WECHAT',
BAO_FU_WECHAT_SCAN: 'BAO_FU_WECHAT_SCAN',
HUI_FU_WECHAT: 'HUI_FU_WECHAT',
HUI_FU_BANK_CARD: 'hf',
WECHAT_PAY: 'WECHAT_PAY',
ALI_PAY: 'ALI_PAY',
TONG_LIAN_WECHAT: 'TONG_LIAN_WECHAT',
TONG_LIAN_BANK_CARD: 'tl',
JING_DONG_BANK_CARD: 'jd',
JING_DONG_H5: 'JING_DONG_H5',
}
export const PAY_AUTH = {
[PAY_TYPE.BAO_FU_WECHAT]: 'pay11',
[PAY_TYPE.JING_DONG_H5]: 'pay5',
[PAY_TYPE.BAO_FU_WECHAT_SCAN]: 'pay12',
[PAY_TYPE.HUI_FU_WECHAT]: 'pay13',
[PAY_TYPE.WECHAT_PAY]: 'pay73',
[PAY_TYPE.ALI_PAY]: 'pay74',
[PAY_TYPE.TONG_LIAN_WECHAT]: 'pay32',
[PAY_TYPE.HUI_FU_BANK_CARD]: 'pay15',
[PAY_TYPE.TONG_LIAN_BANK_CARD]: 'pay33',
[PAY_TYPE.JING_DONG_BANK_CARD]: 'pay4',
}
export const PAY_CHANEL = {
[PAY_TYPE.BAO_FU_WECHAT]: 5,
[PAY_TYPE.JING_DONG_H5]: 4,
[PAY_TYPE.BAO_FU_WECHAT_SCAN]: 5,
[PAY_TYPE.HUI_FU_WECHAT]: 6,
[PAY_TYPE.WECHAT_PAY]: 7,
[PAY_TYPE.ALI_PAY]: 7,
[PAY_TYPE.TONG_LIAN_WECHAT]: 3,
[PAY_TYPE.HUI_FU_BANK_CARD]: 6,
[PAY_TYPE.TONG_LIAN_BANK_CARD]: 3,
[PAY_TYPE.JING_DONG_BANK_CARD]: 4,
}