123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- import request from '@/helpers/request'
- import {
- listenerMessage,
- postMessage,
- removeListenerMessage
- } from '@/helpers/native-message'
- import {
- Button,
- Cell,
- CellGroup,
- Icon,
- RadioGroup,
- Radio,
- Dialog,
- Toast
- } from 'vant'
- import { defineComponent, PropType } from 'vue'
- import styles from './index.module.less'
- import { state } from '@/state'
- interface IOrderInfo {
- orderNo: string | number
- actualPrice: string | number
- }
- const urlFix =
- state.platformType === 'TEACHER' ? '/api-teacher' : '/api-student'
- const urlType = {
- goodsPay: {
- cancelUrl: '/api-mall-portal/order/cancelUserOrder',
- payUrl: '/api-mall-portal/payment/orderPay'
- },
- orderPay: {
- cancelUrl: urlFix + '/userOrder/orderCancel',
- payUrl: urlFix + '/userOrder/orderPay'
- }
- }
- export default defineComponent({
- name: 'payment',
- props: {
- modelValue: {
- type: Boolean,
- default: false
- },
- orderInfo: {
- type: Object as PropType<IOrderInfo>,
- default: {
- orderNo: '',
- actualPrice: 0
- }
- },
- onBackOut: {
- type: Function,
- default: () => {}
- },
- paymentType: {
- type: String,
- default: 'orderPay' as 'orderPay' | 'goodsPay'
- }
- },
- data() {
- return {
- payType: 'ali_app',
- pay_channel: ''
- }
- },
- unmounted() {
- removeListenerMessage('paymentOperation', this.paymentOperation)
- },
- methods: {
- onClose() {
- Dialog.confirm({
- message: '是否放弃本次付款',
- confirmButtonText: '继续付款',
- cancelButtonText: '放弃'
- })
- .then(() => {})
- .catch(async () => {
- this.onCancel()
- })
- },
- async onCancel(noBack?: boolean) {
- try {
- await request.post(urlType[this.paymentType].cancelUrl, {
- data: {
- orderNo: this.orderInfo.orderNo
- }
- })
- } catch {}
- // 不管接口是否报错,都返回
- this.$emit('update:modelValue', false)
- !noBack && this.$router.go(-1)
- this.onBackOut && this.onBackOut()
- },
- async onSubmit() {
- // 支付...
- try {
- let params = {
- orderNo: this.orderInfo.orderNo,
- payChannel: this.payType,
- paymentClient: null as any
- }
- if (this.paymentType === 'goodsPay') {
- params.paymentClient = state.platformType
- }
- let res = await request.post(urlType[this.paymentType].payUrl, {
- data: {
- ...params
- }
- })
- postMessage({
- api: 'paymentOrder',
- content: {
- orderNo: this.orderInfo.orderNo,
- payChannel: this.payType,
- // payInfo: `alipays://platformapi/startapp?saId=10000007&qrcode=${res.data.pay_info}`
- payInfo: res.data.pay_info
- }
- })
- Toast.loading({
- message: '支付中...',
- forbidClick: true,
- duration: 3000,
- loadingType: 'spinner'
- })
- Toast.clear()
- this.$emit('update:modelValue', false)
- // 唤起支付时状态
- listenerMessage('paymentOperation', (result: any) =>
- this.paymentOperation(result)
- )
- } catch (e: any) {
- console.log(e)
- }
- },
- paymentOperation(res: any) {
- if (res.status === 'success') {
- Toast.clear()
- this.$emit('update:modelValue', false)
- this.$router.replace({
- path: '/tradeDetail',
- query: {
- orderNo: this.orderInfo.orderNo
- }
- })
- } else if (res.status === 'cancel') {
- Toast.clear()
- this.$emit('update:modelValue', false)
- } else if (res.status === 'fail') {
- Dialog.alert({
- title: '提示',
- message: '您尚未安装支付宝'
- }).then(() => {
- Toast.clear()
- this.$emit('update:modelValue', false)
- })
- }
- }
- },
- render() {
- return (
- <div class={styles.payment}>
- <Icon onClick={this.onClose} name="cross" size={20} />
- <div class={[styles.title, 'van-hairline--bottom']}>选择支付方式</div>
- <div class={styles.payAmount}>
- <p>应付金额</p>
- <div class={styles.amount}>
- {(this as any).$filters.moneyFormat(this.orderInfo.actualPrice)}
- <span>元</span>
- </div>
- </div>
- <RadioGroup v-model={this.payType}>
- <CellGroup border={false}>
- <Cell
- title="支付宝支付"
- border={false}
- center
- onClick={() => {
- // alipay
- this.payType = 'ali_app'
- }}
- v-slots={{
- icon: () => <Icon name="alipay" color="#009fe9" size={22} />,
- 'right-icon': () => <Radio name="ali_app" />
- }}
- ></Cell>
- <Cell
- title="微信支付"
- border={false}
- center
- onClick={() => {
- // wx_lite
- this.payType = 'wx_app'
- }}
- v-slots={{
- icon: () => (
- <Icon name="wechat-pay" color="#15c434" size={22} />
- ),
- 'right-icon': () => <Radio name="wx_app" />
- }}
- ></Cell>
- </CellGroup>
- </RadioGroup>
- <div class={styles.blank}></div>
- <Button type="primary" block onClick={this.onSubmit}>
- 确认支付
- </Button>
- </div>
- )
- }
- })
|