Files
frontend-app/pages/rwa_package/account/withdraw.vue
T
2026-01-19 11:26:18 +08:00

494 lines
13 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<view class="content">
<TopSafe bgColor="rgba(0,0,0,0)"></TopSafe>
<Header :title="topText" bgColor="rgba(0,0,0,0)" />
<view class="setting-view">
<view class="top-view">
<view class="top-left">
<text class="text-bold text-52 text-white">
{{amount}}
</text>
<text class="text-20 text-white" style="font-weight: 100;">可用余额</text>
</view>
<view class="top-right">
<text class="text-bold text-36 text-white">
{{noAmount}}
</text>
<text class="text-20 text-white" style="font-weight: 100;">不可用余额</text>
</view>
</view>
<view class="mid-view">
<text class="text-zu1 text-32">{{type == 0 ? '提现' : '充值'}}方式</text>
<view class="item-view" @click="onSelect('0')" v-if="!isWeb || type != 0">
<image src="https://cex-pub.s3.ap-southeast-1.amazonaws.com/static/new/wx.png"></image>
<text class="text-zu1 text-32 " style="margin-left:20rpx;">微信</text>
<view class="right-icon-view" v-if="type == 1">
<u-radio-group v-model="curSelect">
<u-radio name="0" activeColor="#7934F6"></u-radio>
</u-radio-group>
</view>
<view class="right-icon-view" v-else>
<text class="text-32 text-zu1" style="margin-right:12rpx" v-if="selectVal && curSelect == '0'">{{selectVal.name + '/' + selectVal.account}}</text>
<u-icon size="14" name="arrow-right" color="#333" ></u-icon>
</view>
</view>
<view class="item-view" @click="onSelect('1')" style="border-width: 0;" >
<image src="https://cex-pub.s3.ap-southeast-1.amazonaws.com/static/new/zfb.png"></image>
<text class="text-zu1 text-32 " style="margin-left:20rpx;">支付宝</text>
<view class="right-icon-view" v-if="type == 1">
<u-radio-group v-model="curSelect">
<u-radio name="1" activeColor="#7934F6"></u-radio>
</u-radio-group>
</view>
<view class="right-icon-view" v-else>
<text class="text-32 text-zu1" style="margin-right:12rpx" v-if="selectVal && curSelect == '1'">{{selectVal.name + '/' + selectVal.account}}</text>
<u-icon size="14" name="arrow-right" color="#333" ></u-icon>
</view>
</view>
</view>
<view class="mid-view">
<view class="flex-r-lr">
<text class="text-zu1 text-32">{{type == 0 ? '提现' : '充值'}}金额</text>
<text class="text-fu1 text-28" v-if="type == 0" style="font-weight:400">每日仅限提现1次</text>
</view>
<view class="input-view">
<text class="text-52 text-zu text-bold">¥</text>
<input style="background: #fff;margin-top:10rpx;"
:placeholder="type == 0 ? '请输入提现金额(0.3-2000)' : '输入充值金额'"
placeholder-style="color:#999;font-weight:400"
@input="onInput"
border="0" v-model="money" :customStyle="inputCss"></input>
</view>
</view>
<view class="zhu-view" v-if="selectVal">
<u-icon size="12" style="margin-top:5rpx;margin-right:12rpx" name="error-circle" color="#7934F6"></u-icon>
<text class="text-24 text-zi" style="font-weight: 400;">通过支付宝或微信提现时,将由支付宝/微信官方收取0.6%的费用,本平台不收取任何费用。</text>
</view>
</view>
<view class="bottom-btn">
<MyBtn :text="bottomText" @ok="onAdd"></MyBtn>
</view>
<SelectItem :itemData="dataList" @close="onClose" @ok="onOk" @add="onAddBack"
:type="curSelect" :itemShow="selectShow"></SelectItem>
<CodeItem @ti="onTi" @close="onClose" :codeShow="codeShow" :phone="userInfo ? userInfo.mobile :''"></CodeItem>
<up-toast ref="uToastRef"></up-toast>
</view>
</template>
<script>
import { getWithdraw,sendWithdraw } from '@/api/common.js';
import { getUserInfo,updateName,deleteAccount } from '@/api/auth.js';
import Header from '@/components/common/header.vue';
import TopSafe from '@/components/common/top-safe.nvue'
import MyBtn from '@/components/common/my-btn.vue'
import func from '@/utils/func.js';
import SelectItem from './components/select-item.vue'
import CodeItem from './components/code-item.vue'
import {uniPlatform} from '@/components/common/global.js'
import { recharge,getAcctBalance } from '@/api/finance.js';
import { appWxpayFun, zfbPayFun } from '@/utils/payUtils.js'
import {requestMerchantTransfer} from "@/uni_modules/uni-requestMerchantTransfer"
export default {
components: { Header, TopSafe,MyBtn,SelectItem,CodeItem },
data() {
return {
isWeb:false,
topText:'',
type:0,
amount:'',
money:'',
noAmount:'',
account:'',
bottomText:'',
curSelect:'0',
selectShow:false,
codeShow:false,
name:'',
inputCss: {
"height": '80rpx',
"background": "#F3F3F3FF",
"border-radius": "30rpx",
"border": "0rpx",
"padding-left": "12rpx",
},
dataList:[
],
selectVal:null,
userInfo:null,
};
},
onShow(){
if(uniPlatform == 'web'){
this.isWeb = true;
}else{
this.isWeb = false;
}
},
onLoad(option) {
if(option && option.type){
this.type = Number(option.type);
this.init();
}
},
methods: {
userinfo() {
getUserInfo().then(res => {
if (res.bizcode == 100) {
this.userInfo = res.data;
}
})
},
onInput(e){
this.$nextTick(() => {
this.money = func.checkInputPrice(e.detail.value);
})
},
onOk(val){
this.selectVal = this.dataList.filter(i=>i.id == val)[0];
this.onClose();
},
onAddBack(){
this.onClose();
uni.navigateTo({
url:'/pages/rwa_package/account/index?id=' + this.curSelect
})
},
onClose(){
this.selectShow = false;
this.codeShow = false;
},
getList(val){
let params = {
platform:this.curSelect == '0' ? 2 : 1
}
getWithdraw(params).then(res=>{
if (res.bizcode === 100) {
this.dataList = res.data;
this.dataList.forEach(item=>{
item.name = item.accountName;
item.account = item.accountNumber;
})
this.selectShow = true;
} else {
this.$refs.uToastRef.show({
type: 'error',
message: res.msg,
});
return null;
}
})
},
onSelect(val){
this.curSelect = val;
if(this.type == 0){
this.selectVal = null;
this.getList();
}
},
async getAcctBalance() {
this.balanceLoading = true;
const resp = await getAcctBalance();
let data = [];
if (resp && resp.bizcode === 100) {
data = resp.data || [];
data.forEach(item=>{
if("balance" == item.categoty){
this.noAmount = item.lockAmount;
this.amount = item.curAmount;
}
})
}
this.balanceList = data;
this.balanceLoading = false;
},
init() {
if(this.type == 0 ){
this.topText = '现金余额提现';
this.bottomText = '提现';
}else if(this.type == 1){
this.topText = '现金余额充值';
this.bottomText = '充值';
}
this.userinfo();
this.getAcctBalance();
},
onAdd(){
if(this.type == 0){
if(!this.money){
this.$refs.uToastRef.show({
type: "error",
message: "请输入金额",
});
return;
}
if(Number(this.money) < 0.3){
this.$refs.uToastRef.show({
type: "error",
message: "提现金额不能低于0.3元",
});
return;
}
if(Number(this.money) > 2000){
this.$refs.uToastRef.show({
type: "error",
message: "提现金额不能大于2000元",
});
return;
}
if(Number(this.money)> Number(this.amount)){
this.$refs.uToastRef.show({
type: "error",
message: "输入金额大于可用余额",
});
return;
}
if(this.type == 0 && !this.selectVal){
this.$refs.uToastRef.show({
type: "error",
message: "请选择提现方式",
});
return;
}
console.log('onAdd',this.curSelect)
this.codeShow = true;
}else{
if(!this.money){
this.$refs.uToastRef.show({
type: "error",
message: "请输入金额",
});
return;
}
let params = {
amount:this.money,
category:'balance',
payway:this.curSelect == '0' ? 'wechat' : 'alipay'
}
recharge(params).then(result=>{
if (result && result.bizcode === 100) {
const item = result.data;
if (item.wechat && Object.keys(item.wechat).length !== 0) {
this.appWxpay(item.wechat, item.orderId, item.orderNum);
} else if (item.alipay && Object.keys(item.alipay).length !== 0 && item.alipay) {
this.zfbPay(item.alipay, item.orderId, item.orderNum);
} else {
this.$refs.uToastRef.show({
type: 'error',
message: "充值失败",
});
}
}
})
}
},
async appWxpay(alipay, orderId, orderNum) {
try {
const result = await appWxpayFun(alipay, orderId, orderNum);
console.log('支付成功', result);
// 处理支付成功后的逻辑,如更新订单状态等
} catch (error) {
console.error('支付失败', error);
// 处理支付失败后的逻辑,如提示用户等
}
},
// 支付宝支付
async zfbPay(alipay, orderId, orderNum) {
try {
const result = await zfbPayFun(alipay, orderId, orderNum);
console.log('支付成功', result);
// 处理支付成功后的逻辑,如更新订单状态等
} catch (error) {
console.error('支付失败', error);
// 处理支付失败后的逻辑,如提示用户等
}
},
onTi(code){
let params = {
verificationCode:code,
bindId:this.selectVal.id,
amount:Number(this.money),
accountType:this.curSelect == '0' ? 1 : 2
}
let _this = this;
sendWithdraw(params).then(res=>{
console.log('absc',res)
if (res && res.bizcode == 100) {
console.log('absc1111111111',res,this.curSelect)
// data = resp.data || [];
if(this.curSelect == '1'){
this.qing();
if(res.data.alResponse.msg == 'Success'){
uni.navigateTo({
url:'/pages/rwa_package/account/success?money=' + params.amount
})
}else{
setTimeout(()=>{
_this.$refs.uToastRef.show({
type: 'error',
message: res.data.alResponse.subMsg,
});
},400)
}
}else{
console.log('开始提现',res,this.curSelect)
requestMerchantTransfer({
// uni.requestMerchantTransfer({
"mchId": "1725999656",
"appId": "wx7a5902cd556d9396",
"package": res.data.wxResponse.packageInfo,
success: (res) => {
this.qing();
uni.navigateTo({
url:'/pages/rwa_package/account/success?money=' + params.amount
})
},
fail: (res) => {
_this.$refs.uToastRef.show({
type: 'error',
message: '提现失败',
});
},
})
}
}
})
},
qing(){
this.money = '';
this.curSelect = '0';
this.selectVal = null;
this.onClose();
}
}
}
</script>
<style lang="scss" scoped>
.bottom-btn{
width: 100%;
margin-bottom:92rpx;
display: flex;
flex-direction: column;
align-items: center;
padding: 0 32rpx;
box-sizing: border-box;
position: relative;
}
.setting-view {
width: 100%;
height: calc(100% - 88rpx - 92rpx - 88rpx - var(--status-bar-height));
display: flex;
flex-direction: column;
align-items: center;
overflow-y: auto;
padding: 0 32rpx;
box-sizing: border-box;
position: relative;
.top-view{
width:100%;
margin-top:40rpx;
height:188rpx;
min-height:188rpx;
display: flex;
background:linear-gradient( 270deg, #B164FB 0%, #7934F6 100%);
padding: 36rpx 32rpx;
box-sizing: border-box;
flex-direction: row;
justify-content: space-between;
align-items: center;
border-radius: 16rpx;
.top-left{
display: flex;
flex-direction: column;
justify-content: space-between;
height:108rpx;
}
.top-right{
display: flex;
flex-direction: column;
justify-content: space-between;
align-items: flex-end;
height:108rpx;
}
}
.zhu-view{
width:100%;
display: flex;
margin-top:32rpx;
flex-direction: row;
justify-content: flex-start;
align-items: flex-start;
padding: 16rpx;
box-sizing: border-box;
background: rgba(121, 52, 246, 0.05);
border-radius:8rpx ;
}
.mid-view{
width:100%;
display: flex;
flex-direction: column;
overflow-y: auto;
box-sizing: border-box;
background-color: #fff;
border-radius: 16rpx;
padding: 32rpx;
padding-bottom:0 ;
margin-top:24rpx;
.item-view{
width:100%;
height:110rpx;
min-height:110rpx;
display: flex;
flex-direction: row;
position: relative;
align-items: center;
border-bottom: 2rpx solid #ececec;
.right-icon-view{
position: absolute;
right:0;
display: flex;
}
image{
width:48rpx;
height:48rpx;
}
}
.input-view{
width:100%;
height:100rpx;
border-radius: 20rpx;
margin:32rpx 0 ;
display: flex;
flex-direction: row;
align-items: center;
}
}
}
</style>