import { Button, Cell, CellGroup, Icon, RadioGroup, Radio, showConfirmDialog, showLoadingToast, closeToast, showDialog } from 'vant'; import { computed, defineComponent, reactive } from 'vue'; import styles from './index.module.less'; import { browser, moneyFormat } from '@/helpers/utils'; import request from '@/helpers/request'; import { listenerMessage, postMessage } from '@/helpers/native-message'; import { useRouter } from 'vue-router'; export default defineComponent({ name: 'payment', props: { paymentConfig: { type: Object, default: {} }, config: { type: Object, default: {} } }, emits: ['backOut', 'close', 'confirm'], setup(props, { slots, attrs, emit }) { const router = useRouter(); const state = reactive({ payType: 'wx', pay_channel: '' }); const onClose = () => { // 继续支付则直接关闭弹窗就可 showConfirmDialog({ message: '是否放弃本次付款', confirmButtonText: '继续付款', cancelButtonText: '放弃', showCancelButton: true }).catch(async () => { await onCancel(); emit('backOut'); emit('close'); }); }; const isWxPay = computed(() => { const paymentChannels = props.config.paymentChannel || ''; if (paymentChannels) { if (paymentChannels.toUpperCase().indexOf('WX') !== -1) { return true; } else { return false; } } else { return true; } }); const isAliPay = computed(() => { const paymentChannels = props.config.paymentChannel || ''; if (paymentChannels) { if (paymentChannels.toUpperCase().indexOf('ALI') !== -1) { return true; } else { return false; } } else { return true; } }); // 需要关闭订单 const onCancel = async (noBack?: boolean) => {}; const onSubmit = async () => { // 支付... if (props.config.paymentType === 'original') { submitNativePay(); } else { submitQrCodePay(); } }; const submitNativePay = async () => { // 支付... try { // const payChannel = state.payType === 'zfb' ? 'alipay-app' : 'wxpay-app'; let paymentChannels = props.config.paymentChannel || ''; paymentChannels = paymentChannels.split(','); // const payChannel = paymentChannels.map((item: any) => item.indexOf('')) let payChannel = ''; paymentChannels.forEach((item: any) => { if ( state.payType === 'zfb' && item.toUpperCase().indexOf('ALI') !== -1 ) { payChannel = item; } else if ( state.payType === 'wx' && item.toUpperCase().indexOf('WX') !== -1 ) { payChannel = item; } }); console.log(state.payType, 'state.payType'); let paymentType = props.config.paymentType; const payMap: any = { merOrderNo: props.paymentConfig.orderNo, paymentChannel: payChannel, // 支付渠道 paymentType: paymentType, userId: props.paymentConfig.userId }; const { data } = await request.post( '/edu-app/open/userOrder/executePayment', { data: { ...payMap } } ); postMessage({ api: 'paymentOrder', content: { orderNo: props.paymentConfig.orderNo, payChannel: state.payType === 'zfb' ? 'ali_app' : 'wx_app', payInfo: data.reqParams.body || JSON.stringify(data.reqParams) } }); showLoadingToast({ message: '支付中...', forbidClick: true, duration: 3000, loadingType: 'spinner' }); emit('close'); // 唤起支付时状态 listenerMessage('paymentOperation', result => { console.log(result, 'init paymentOperation'); paymentOperation(result?.content); }); } catch (e: any) { console.log(e); } }; const paymentOperation = (res: any) => { console.log(res, 'paymentOperation'); // 支付状态 // paymentOperation 支付成功:success 支付失败:error 支付取消:cancel 未安装:fail // error 只有安卓端有 closeToast(); if (res.status === 'success' || res.status === 'error') { emit('close'); router.replace({ path: '/payment-result', query: { orderNo: props.paymentConfig.orderNo } }); } else if (res.status === 'cancel') { emit('close'); } else if (res.status === 'fail') { const message = state.payType === 'zfb' ? '您尚未安装支付宝' : '您尚未安装微信'; showDialog({ title: '提示', message }).then(() => { emit('close'); }); } }; const submitQrCodePay = () => { const pt = state.payType; // 判断当前浏览器 if (browser().weixin) { // 微信浏览器 if (pt == 'zfb') { state.pay_channel = 'alipay_qr'; getCodePay('qrCode'); } else if (pt == 'wx') { state.pay_channel = 'wx_pub'; getCodePay('pay'); } } else if (browser().alipay) { // 支付宝浏览器 if (pt == 'zfb') { state.pay_channel = 'alipay_wap'; // 支付宝 H5 支付 getCodePay('pay'); } else if (pt == 'wx') { state.pay_channel = 'wx_pub'; getCodePay('qrCode'); } } else { if (pt == 'zfb') { state.pay_channel = 'alipay_qr'; } else if (pt == 'wx') { state.pay_channel = 'wx_pub'; } getCodePay('qrCode'); } }; const getCodePay = (code: any) => { // 二维码页面, 唤起支付页面 const payCode = code == 'qrCode' ? 'payCenter' : 'payResult'; emit('confirm', { payCode, pay_channel: state.pay_channel }); }; return () => (
选择支付方式

应付金额

{moneyFormat(props.paymentConfig.currentPrice)}
{isWxPay.value && ( { state.payType = 'wx'; }} v-slots={{ icon: () => ( ), 'right-icon': () => , title: () => (
微信支付 推荐
) }}>
)} {isAliPay.value && ( { state.payType = 'zfb'; }} v-slots={{ icon: () => , 'right-icon': () => }}> )}
); } });