feat 开发者调试联调

This commit is contained in:
DaxPay
2024-09-18 18:42:48 +08:00
parent f6b7a69230
commit 93dd6f9079
6 changed files with 708 additions and 105 deletions

View File

@@ -61,7 +61,7 @@ function createConfirm(options: ModalOptionsEx) {
const getBaseOptions = () => {
return {
okText: '确认',
centered: true,
centered: false,
}
}

View File

@@ -5,7 +5,7 @@ import { Result } from '#/axios'
* 支付参数签名
*/
export function paySign(param: PayParam) {
return defHttp.post<Result<string>>({ url: '/develop/trade/pay/sign', data: param })
return defHttp.post<Result<string>>({ url: '/develop/trade/sign/pay', data: param })
}
/**
@@ -19,7 +19,7 @@ export function tradePay(params) {
* 退款参数签名
*/
export function refundSign(param: RefundParam) {
return defHttp.post<Result<string>>({ url: '/develop/trade/refund/sign', data: param })
return defHttp.post<Result<string>>({ url: '/develop/trade/sign/refund', data: param })
}
/**
@@ -33,7 +33,7 @@ export function tradeRefund(params) {
* 转账签名
*/
export function transferSign(param: TransferParam) {
return defHttp.post<Result<string>>({ url: '/develop/trade/transfer/sign', data: param })
return defHttp.post<Result<string>>({ url: '/develop/trade/sign/transfer', data: param })
}
/**
@@ -75,6 +75,8 @@ export interface PayParam {
quitUrl?: string
/** 异步通知地址 */
notifyUrl?: string
/** 终端IP */
clientIp?: string
/** 商户号 */
mchNo?: string
/** 应用号 */
@@ -83,6 +85,8 @@ export interface PayParam {
nonceStr?: string
/** 签名 */
sign?: string
/** 请求时间 */
reqTime?: string
}
/**
@@ -127,6 +131,8 @@ export interface RefundParam {
attach?: string
/** 异步通知地址 */
notifyUrl?: string
/** 终端IP */
clientIp?: string
/** 商户号 */
mchNo?: string
/** 应用号 */
@@ -135,6 +141,8 @@ export interface RefundParam {
nonceStr?: string
/** 签名 */
sign?: string
/** 请求时间 */
reqTime?: string
}
/**
@@ -166,7 +174,7 @@ export interface TransferParam {
/** 支付通道 */
channel?: string
/** 转账金额 */
amount?: string
amount?: number
/** 标题 */
title?: string
/** 转账原因 */
@@ -177,10 +185,14 @@ export interface TransferParam {
payeeAccount?: string
/** 收款人姓名 */
payeeName?: string
/** 转账扩展参数 */
extraParam?: string
/** 商户扩展参数 */
attach?: string
/** 异步通知地址 */
notifyUrl?: string
/** 终端IP */
clientIp?: string
/** 商户号 */
mchNo?: string
/** 应用号 */
@@ -189,6 +201,8 @@ export interface TransferParam {
nonceStr?: string
/** 签名 */
sign?: string
/** 请求时间 */
reqTime?: string
}
/**
* 转账返回结果

View File

@@ -1,103 +1,166 @@
<template>
<div>
<a-form
class="small-from-item w-40vw"
ref="formRef"
:model="form"
:rules="rules"
:labelCol="{ span: 6 }"
:wrapperCol="{ span: 18 }"
:validate-trigger="['blur', 'change']"
>
<a-form-item label="商户号" name="mchNo">
<a-select
:filter-option="search"
v-model:value="form.mchNo"
placeholder="请选择商户"
:options="mchNoOptions"
@change="merchantChange"
/>
</a-form-item>
<a-form-item label="应用号" name="appId">
<a-select
:filter-option="search"
:options="mchAppOptions"
v-model:value="form.appId"
placeholder="请选择商户应用"
/>
</a-form-item>
<a-form-item label="支付通道" name="channel">
<a-select
allow-clear
v-model:value="form.channel"
:options="channelOptions"
placeholder="请选择支付通道"
/>
</a-form-item>
<a-form-item label="订单号" name="bizOrderNo">
<a-input v-model:value="form.bizOrderNo" placeholder="请输入订单号" />
</a-form-item>
<a-form-item label="支付标题" name="title">
<a-input v-model:value="form.title" placeholder="请输入支付标题" />
</a-form-item>
<a-form-item label="支付描述" name="description">
<a-input v-model:value="form.description" placeholder="请输入支付描述" />
</a-form-item>
<a-form-item label="支付金额" name="amount">
<a-input-number
v-model:value="form.amount"
:min="0.01"
:precision="2"
placeholder="请输入支付金额"
/>
</a-form-item>
<a-form-item label="支付方式" name="method">
<a-select
allow-clear
v-model:value="form.method"
:options="methodOptions"
placeholder="请选择支付方式"
/>
</a-form-item>
<a-form-item label="支付扩展参数" name="extraParam">
<a-textarea v-model:value="form.extraParam" :rows="3" placeholder="请输入支付扩展参数" />
</a-form-item>
<a-form-item label="商户扩展参数" name="attach">
<a-textarea v-model:value="form.attach" :rows="3" placeholder="请输入商户扩展参数" />
</a-form-item>
<a-form-item label="异步通知地址" name="notifyUrl">
<a-input v-model:value="form.notifyUrl" placeholder="请输入异步通知地址" />
</a-form-item>
<a-form-item label="支付超时时间" name="expiredTime">
</a-form-item>
<a-form-item label="随机数" name="nonceStr">
<a-input v-model:value="form.nonceStr" placeholder="请输入随机数" />
</a-form-item>
<a-form-item label="签名" name="sign">
<a-input v-model:value="form.sign" placeholder="请输入签名" />
</a-form-item>
<a-space style="display: flex; justify-content: center">
<a-button>重置</a-button>
<a-button type="primary">提交</a-button>
</a-space>
</a-form>
<a-spin :spinning="confirmLoading">
<a-form
class="small-from-item w-40vw"
ref="formRef"
:model="form"
:rules="rules"
:labelCol="{ span: 6 }"
:wrapperCol="{ span: 18 }"
:validate-trigger="['blur', 'change']"
>
<a-form-item label="商户号" name="mchNo">
<a-select
:filter-option="search"
v-model:value="form.mchNo"
placeholder="请选择商户"
:options="mchNoOptions"
@change="merchantChange"
/>
</a-form-item>
<a-form-item label="应用号" name="appId">
<a-select
:filter-option="search"
:options="mchAppOptions"
v-model:value="form.appId"
placeholder="请选择商户应用"
/>
</a-form-item>
<a-form-item label="支付通道" name="channel">
<a-select
allow-clear
v-model:value="form.channel"
:options="channelOptions"
placeholder="请选择支付通道"
/>
</a-form-item>
<a-form-item label="订单号" name="bizOrderNo">
<a-input-group compact>
<a-input
v-model:value="form.bizOrderNo"
placeholder="请输入订单号"
style="width: calc(100% - 60px)"
/>
<a-button @click="genBizOrderNo">生成</a-button>
</a-input-group>
</a-form-item>
<a-form-item label="支付标题" name="title">
<a-input v-model:value="form.title" placeholder="请输入支付标题" />
</a-form-item>
<a-form-item label="支付金额" name="amount">
<a-input-number
v-model:value="form.amount"
:min="0.01"
:precision="2"
placeholder="请输入支付金额"
/>
</a-form-item>
<a-form-item label="支付方式" name="method">
<a-select
allow-clear
v-model:value="form.method"
:options="methodOptions"
placeholder="请选择支付方式"
/>
</a-form-item>
<a-form-item label="支付描述" name="description">
<a-input v-model:value="form.description" placeholder="请输入支付描述" />
</a-form-item>
<a-form-item label="支付扩展参数" name="extraParam">
<a-textarea v-model:value="form.extraParam" :rows="3" placeholder="请输入支付扩展参数" />
</a-form-item>
<a-form-item label="商户扩展参数" name="attach">
<a-textarea v-model:value="form.attach" :rows="3" placeholder="请输入商户扩展参数" />
</a-form-item>
<a-form-item label="异步通知地址" name="notifyUrl">
<a-input v-model:value="form.notifyUrl" placeholder="请输入异步通知地址" />
</a-form-item>
<a-form-item label="支付超时时间" name="expiredTime">
<!-- 日期时间 -->
<a-date-picker
allowClear
showTime
style="width: 100%"
placeholder="请选择订单过期时间"
:valueFormat="'YYYY-MM-DD HH:mm:ss'"
v-model:value="form.expiredTime"
/>
</a-form-item>
<a-form-item label="终端IP" name="clientIp">
<a-input v-model:value="form.clientIp" placeholder="请输入终端IP地址" />
</a-form-item>
<a-form-item label="随机数" name="nonceStr">
<a-input-group compact>
<a-input
v-model:value="form.nonceStr"
style="width: calc(100% - 60px)"
placeholder="请输入随机数"
/>
<a-button @click="genNonceStr">生成</a-button>
</a-input-group>
</a-form-item>
<a-form-item label="请求时间" name="reqTime">
<a-input-group compact>
<a-input disabled v-model:value="form.reqTime" style="width: calc(100% - 60px)" />
<a-button @click="updateReqTime">更新</a-button>
</a-input-group>
</a-form-item>
<a-form-item label="签名" name="sign">
<a-input-group compact>
<a-input
placeholder="请输入签名"
v-model:value="form.sign"
style="width: calc(100% - 60px)"
/>
<a-button @click="getSign">生成</a-button>
</a-input-group>
</a-form-item>
<a-space style="display: flex; justify-content: center">
<a-button @click="handleReset">重置表单</a-button>
<a-button type="primary" @click="handleSubmit">提交请求</a-button>
</a-space>
</a-form>
</a-spin>
</div>
</template>
<script setup lang="ts">
import { computed, onMounted, reactive, ref } from 'vue'
import { PayParam } from './DevelopTrade.api'
import { FormInstance, Rule } from 'ant-design-vue/lib/form'
import { Modal } from 'ant-design-vue'
import { PayParam, paySign, tradePay } from './DevelopTrade.api'
import { LabeledValue } from 'ant-design-vue/lib/select'
import { merchantDropdown } from '@/views/daxpay/admin/merchant/info/Merchant.api'
import useFormEdit from '@/hooks/bootx/useFormEdit'
import { mchAppDropdown } from '@/views/daxpay/common/merchant/app/MchApp.api'
import { useDict } from '@/hooks/bootx/useDict'
import XEUtils from 'xe-utils'
import { buildShortUUID, buildUUID } from '@/utils/uuid'
import { copyText } from '@/utils/copyTextToClipboard'
const { search } = useFormEdit()
const { dictDropDown } = useDict()
const form = reactive<PayParam>({})
const confirmLoading = ref(false)
const formRef = ref<FormInstance>()
const form = reactive<PayParam>({
title: '测试支付',
clientIp: '127.0.0.1',
amount: 0.01,
})
const rules = computed(() => {
return {}
return {
mchNo: [{ required: true, message: '商户号不可为空' }],
appId: [{ required: true, message: '应用号不可为空' }],
channel: [{ required: true, message: '支付通道不可为空' }],
bizOrderNo: [{ required: true, message: '订单号不可为空' }],
title: [{ required: true, message: '支付标题不可为空' }],
amount: [{ required: true, message: '支付金额不可为空' }],
method: [{ required: true, message: '支付方式不可为空' }],
clientIp: [{ required: true, message: '终端IP不可为空' }],
nonceStr: [{ required: true, message: '随机数不可为空' }],
reqTime: [{ required: true, message: '请求时间不可为空' }],
} as Record<string, Rule[]>
})
const mchNoOptions = ref<LabeledValue[]>([])
@@ -113,11 +176,20 @@
* 初始化数据
*/
async function initData() {
confirmLoading.value = false
merchantDropdown().then(({ data }) => {
mchNoOptions.value = data
})
channelOptions.value = await dictDropDown('channel')
methodOptions.value = await dictDropDown('pay_method')
// 时间默认30M后
form.expiredTime = XEUtils.toDateString(
new Date(new Date().getTime() + 30 * 60 * 1000),
'yyyy-MM-dd HH:mm:ss',
)
genNonceStr()
genBizOrderNo()
updateReqTime()
}
/**
@@ -129,6 +201,68 @@
mchAppOptions.value = data
})
}
/**
* 生成订单号
*/
function genBizOrderNo() {
form.bizOrderNo = buildShortUUID('PAY')
}
/**
* 生成随机数
*/
function genNonceStr() {
form.nonceStr = buildUUID()
}
/**
* 更新请求时间
*/
function updateReqTime() {
form.reqTime = XEUtils.toDateString(new Date(), 'yyyy-MM-dd HH:mm:ss')
}
/**
* 获取签名
*/
function getSign() {
formRef.value?.validate().then(() => {
paySign(form).then(({ data }) => {
form.sign = data
})
})
}
/**
* 重置
*/
function handleReset() {
formRef.value?.resetFields()
initData()
}
/**
* 提交
*/
function handleSubmit() {
formRef.value?.validate().then(() => {
confirmLoading.value = true
tradePay(form)
.then(({ data }) => {
Modal.info({
title: '响应结果',
content: `${JSON.stringify(data)}`,
okText: '复制payBody',
onOk() {
copyText(data.payBody as string)
},
})
})
.finally(() => {
confirmLoading.value = false
})
})
}
</script>
<style scoped lang="less"></style>

View File

@@ -1,11 +1,226 @@
<template>
<div>
<a-spin :spinning="confirmLoading">
<a-form
class="small-from-item w-40vw"
ref="formRef"
:model="form"
:rules="rules"
:labelCol="{ span: 6 }"
:wrapperCol="{ span: 18 }"
:validate-trigger="['blur', 'change']"
>
<a-form-item label="商户号" name="mchNo">
<a-select
:filter-option="search"
v-model:value="form.mchNo"
placeholder="请选择商户"
:options="mchNoOptions"
@change="merchantChange"
/>
</a-form-item>
<a-form-item label="应用号" name="appId">
<a-select
:filter-option="search"
:options="mchAppOptions"
v-model:value="form.appId"
placeholder="请选择商户应用"
/>
</a-form-item>
<a-form-item label="退款号" name="bizRefundNo">
<a-input-group compact>
<a-input
v-model:value="form.bizRefundNo"
placeholder="请输入订单号"
style="width: calc(100% - 60px)"
/>
<a-button @click="genBizOrderNo">生成</a-button>
</a-input-group>
</a-form-item>
<a-form-item label="订单号" name="orderNo">
<a-input v-model:value="form.orderNo" placeholder="请输入支付订单号" />
</a-form-item>
<a-form-item label="商户订单号" name="bizOrderNo">
<a-input v-model:value="form.bizOrderNo" placeholder="请输入商户支付订单号" />
</a-form-item>
<a-form-item label="退款原因" name="reason">
<a-input v-model:value="form.reason" placeholder="请输入退款原因" />
</a-form-item>
<a-form-item label="退款金额" name="amount">
<a-input-number
v-model:value="form.amount"
:min="0.01"
:precision="2"
placeholder="请输入退款金额"
/>
</a-form-item>
<a-form-item label="退款扩展参数" name="extraParam">
<a-textarea v-model:value="form.extraParam" :rows="3" placeholder="请输入退款扩展参数" />
</a-form-item>
<a-form-item label="商户扩展参数" name="attach">
<a-textarea v-model:value="form.attach" :rows="3" placeholder="请输入商户扩展参数" />
</a-form-item>
<a-form-item label="异步通知地址" name="notifyUrl">
<a-input v-model:value="form.notifyUrl" placeholder="请输入异步通知地址" />
</a-form-item>
<a-form-item label="终端IP" name="clientIp">
<a-input v-model:value="form.clientIp" placeholder="请输入终端IP地址" />
</a-form-item>
<a-form-item label="随机数" name="nonceStr">
<a-input-group compact>
<a-input
v-model:value="form.nonceStr"
style="width: calc(100% - 60px)"
placeholder="请输入随机数"
/>
<a-button @click="genNonceStr">生成</a-button>
</a-input-group>
</a-form-item>
<a-form-item label="请求时间" name="reqTime">
<a-input-group compact>
<a-input disabled v-model:value="form.reqTime" style="width: calc(100% - 60px)" />
<a-button @click="updateReqTime">更新</a-button>
</a-input-group>
</a-form-item>
<a-form-item label="签名" name="sign">
<a-input-group compact>
<a-input
placeholder="请输入签名"
v-model:value="form.sign"
style="width: calc(100% - 60px)"
/>
<a-button @click="getSign">生成</a-button>
</a-input-group>
</a-form-item>
<a-space style="display: flex; justify-content: center">
<a-button @click="handleReset">重置表单</a-button>
<a-button type="primary" @click="handleSubmit">提交请求</a-button>
</a-space>
</a-form>
</a-spin>
</div>
</template>
<script setup lang="ts">
import { computed, onMounted, reactive, ref } from 'vue'
import { FormInstance, Rule } from 'ant-design-vue/lib/form'
import { Modal } from 'ant-design-vue'
import { refundSign, RefundParam, tradeRefund } from './DevelopTrade.api'
import { LabeledValue } from 'ant-design-vue/lib/select'
import { merchantDropdown } from '@/views/daxpay/admin/merchant/info/Merchant.api'
import useFormEdit from '@/hooks/bootx/useFormEdit'
import { mchAppDropdown } from '@/views/daxpay/common/merchant/app/MchApp.api'
import XEUtils from 'xe-utils'
import { buildShortUUID, buildUUID } from '@/utils/uuid'
const { search } = useFormEdit()
const confirmLoading = ref(false)
const formRef = ref<FormInstance>()
const form = reactive<RefundParam>({
clientIp: '127.0.0.1',
amount: 0.01,
})
const rules = computed(() => {
return {
mchNo: [{ required: true, message: '商户号不可为空' }],
appId: [{ required: true, message: '应用号不可为空' }],
bizRefundNo: [{ required: true, message: '商户退款号不可为空' }],
title: [{ required: true, message: '退款标题不可为空' }],
amount: [{ required: true, message: '退款金额不可为空' }],
clientIp: [{ required: true, message: '终端IP不可为空' }],
nonceStr: [{ required: true, message: '随机数不可为空' }],
reqTime: [{ required: true, message: '请求时间不可为空' }],
} as Record<string, Rule[]>
})
const mchNoOptions = ref<LabeledValue[]>([])
const mchAppOptions = ref<LabeledValue[]>([])
onMounted(() => {
initData()
})
/**
* 初始化数据
*/
async function initData() {
confirmLoading.value = false
merchantDropdown().then(({ data }) => {
mchNoOptions.value = data
})
// 时间默认30M后
genNonceStr()
genBizOrderNo()
updateReqTime()
}
/**
* 商户变动时刷新应用列表
*/
function merchantChange() {
form.appId = undefined
mchAppDropdown(form.mchNo).then(({ data }) => {
mchAppOptions.value = data
})
}
/**
* 生成订单号
*/
function genBizOrderNo() {
form.bizRefundNo = buildShortUUID('REFUND')
}
/**
* 生成随机数
*/
function genNonceStr() {
form.nonceStr = buildUUID()
}
/**
* 更新请求时间
*/
function updateReqTime() {
form.reqTime = XEUtils.toDateString(new Date(), 'yyyy-MM-dd HH:mm:ss')
}
/**
* 获取签名
*/
function getSign() {
formRef.value?.validate().then(() => {
refundSign(form).then(({ data }) => {
form.sign = data
})
})
}
/**
* 重置
*/
function handleReset() {
formRef.value?.resetFields()
initData()
}
/**
* 提交
*/
function handleSubmit() {
formRef.value?.validate().then(() => {
confirmLoading.value = true
tradeRefund(form)
.then(({ data }) => {
Modal.info({
title: '响应结果',
content: `${JSON.stringify(data)}`,
})
})
.finally(() => {
confirmLoading.value = false
})
})
}
</script>
<template>
</template>
<style scoped lang="less">
</style>
<style scoped lang="less"></style>

View File

@@ -1,11 +1,251 @@
<template>
<div>
<a-spin :spinning="confirmLoading">
<a-form
class="small-from-item w-40vw"
ref="formRef"
:model="form"
:rules="rules"
:labelCol="{ span: 6 }"
:wrapperCol="{ span: 18 }"
:validate-trigger="['blur', 'change']"
>
<a-form-item label="商户号" name="mchNo">
<a-select
:filter-option="search"
v-model:value="form.mchNo"
placeholder="请选择商户"
:options="mchNoOptions"
@change="merchantChange"
/>
</a-form-item>
<a-form-item label="应用号" name="appId">
<a-select
:filter-option="search"
:options="mchAppOptions"
v-model:value="form.appId"
placeholder="请选择商户应用"
/>
</a-form-item>
<a-form-item label="转账通道" name="channel">
<a-select
allow-clear
v-model:value="form.channel"
:options="channelOptions"
placeholder="请选择转账通道"
/>
</a-form-item>
<a-form-item label="转账号" name="bizRefundNo">
<a-input-group compact>
<a-input
v-model:value="form.bizTransferNo"
placeholder="请输入转账号"
style="width: calc(100% - 60px)"
/>
<a-button @click="genBizOrderNo">生成</a-button>
</a-input-group>
</a-form-item>
<a-form-item label="转账原因" name="title">
<a-input v-model:value="form.title" placeholder="请输入转账原因" />
</a-form-item>
<a-form-item label="转账金额" name="amount">
<a-input-number
v-model:value="form.amount"
:min="0.01"
:precision="2"
placeholder="请输入转账金额"
/>
</a-form-item>
<a-form-item label="收款人账号类型" name="payeeType">
<a-select
allow-clear
v-model:value="form.payeeType"
:options="payeeTypeOptions"
placeholder="请选择转账通道"
/>
</a-form-item>
<a-form-item label="收款人账号" name="payeeAccount">
<a-input v-model:value="form.payeeAccount" placeholder="请输入收款人账号" />
</a-form-item>
<a-form-item label="收款人姓名" name="payeeName">
<a-input v-model:value="form.payeeName" placeholder="请输入收款人姓名" />
</a-form-item>
<a-form-item label="转账扩展参数" name="extraParam">
<a-textarea v-model:value="form.extraParam" :rows="3" placeholder="请输入转账扩展参数" />
</a-form-item>
<a-form-item label="商户扩展参数" name="attach">
<a-textarea v-model:value="form.attach" :rows="3" placeholder="请输入商户扩展参数" />
</a-form-item>
<a-form-item label="异步通知地址" name="notifyUrl">
<a-input v-model:value="form.notifyUrl" placeholder="请输入异步通知地址" />
</a-form-item>
<a-form-item label="终端IP" name="clientIp">
<a-input v-model:value="form.clientIp" placeholder="请输入终端IP地址" />
</a-form-item>
<a-form-item label="随机数" name="nonceStr">
<a-input-group compact>
<a-input
v-model:value="form.nonceStr"
style="width: calc(100% - 60px)"
placeholder="请输入随机数"
/>
<a-button @click="genNonceStr">生成</a-button>
</a-input-group>
</a-form-item>
<a-form-item label="请求时间" name="reqTime">
<a-input-group compact>
<a-input disabled v-model:value="form.reqTime" style="width: calc(100% - 60px)" />
<a-button @click="updateReqTime">更新</a-button>
</a-input-group>
</a-form-item>
<a-form-item label="签名" name="sign">
<a-input-group compact>
<a-input
placeholder="请输入签名"
v-model:value="form.sign"
style="width: calc(100% - 60px)"
/>
<a-button @click="getSign">生成</a-button>
</a-input-group>
</a-form-item>
<a-space style="display: flex; justify-content: center">
<a-button @click="handleReset">重置表单</a-button>
<a-button type="primary" @click="handleSubmit">提交请求</a-button>
</a-space>
</a-form>
</a-spin>
</div>
</template>
<script setup lang="ts">
import { computed, onMounted, reactive, ref } from 'vue'
import { FormInstance, Rule } from 'ant-design-vue/lib/form'
import { Modal } from 'ant-design-vue'
import { transferSign, TransferParam, tradeTransfer } from './DevelopTrade.api'
import { LabeledValue } from 'ant-design-vue/lib/select'
import { merchantDropdown } from '@/views/daxpay/admin/merchant/info/Merchant.api'
import useFormEdit from '@/hooks/bootx/useFormEdit'
import { mchAppDropdown } from '@/views/daxpay/common/merchant/app/MchApp.api'
import XEUtils from 'xe-utils'
import { buildShortUUID, buildUUID } from '@/utils/uuid'
import { useDict } from "@/hooks/bootx/useDict";
const { search } = useFormEdit()
const {dictDropDown} = useDict()
const confirmLoading = ref(false)
const formRef = ref<FormInstance>()
const form = reactive<TransferParam>({
clientIp: '127.0.0.1',
amount: 0.01,
})
const rules = computed(() => {
return {
mchNo: [{ required: true, message: '商户号不可为空' }],
appId: [{ required: true, message: '应用号不可为空' }],
channel: [{ required: true, message: '支付通道不可为空' }],
bizRefundNo: [{ required: true, message: '商户转账号不可为空' }],
title: [{ required: true, message: '转账标题不可为空' }],
amount: [{ required: true, message: '转账金额不可为空' }],
payeeType: [{ required: true, message: '转账账号类型不可为空' }],
payeeAccount: [{ required: true, message: '转账账号不可为空' }],
clientIp: [{ required: true, message: '终端IP不可为空' }],
nonceStr: [{ required: true, message: '随机数不可为空' }],
reqTime: [{ required: true, message: '请求时间不可为空' }],
} as Record<string, Rule[]>
})
const mchNoOptions = ref<LabeledValue[]>([])
const mchAppOptions = ref<LabeledValue[]>([])
const channelOptions = ref<LabeledValue[]>([])
const payeeTypeOptions = ref<LabeledValue[]>([])
onMounted(() => {
initData()
})
/**
* 初始化数据
*/
async function initData() {
confirmLoading.value = false
channelOptions.value = await dictDropDown('channel')
payeeTypeOptions.value = await dictDropDown('transfer_payee_type')
merchantDropdown().then(({ data }) => {
mchNoOptions.value = data
})
// 时间默认30M后
genNonceStr()
genBizOrderNo()
updateReqTime()
}
/**
* 商户变动时刷新应用列表
*/
function merchantChange() {
form.appId = undefined
mchAppDropdown(form.mchNo).then(({ data }) => {
mchAppOptions.value = data
})
}
/**
* 生成订单号
*/
function genBizOrderNo() {
form.bizTransferNo = buildShortUUID('TRANSFER')
}
/**
* 生成随机数
*/
function genNonceStr() {
form.nonceStr = buildUUID()
}
/**
* 更新请求时间
*/
function updateReqTime() {
form.reqTime = XEUtils.toDateString(new Date(), 'yyyy-MM-dd HH:mm:ss')
}
/**
* 获取签名
*/
function getSign() {
formRef.value?.validate().then(() => {
transferSign(form).then(({ data }) => {
form.sign = data
})
})
}
/**
* 重置
*/
function handleReset() {
formRef.value?.resetFields()
initData()
}
/**
* 提交
*/
function handleSubmit() {
formRef.value?.validate().then(() => {
confirmLoading.value = true
tradeTransfer(form)
.then(({ data }) => {
Modal.info({
title: '响应结果',
content: `${JSON.stringify(data)}`,
})
})
.finally(() => {
confirmLoading.value = false
})
})
}
</script>
<template>
</template>
<style scoped lang="less">
</style>
<style scoped lang="less"></style>

View File

@@ -218,7 +218,7 @@
type: LIST,
selectList: payRefundStatusList.value,
},
{ field: 'allocStatus', name: '支付状态', type: LIST, selectList: payAllocStatusList.value },
{ field: 'allocStatus', name: '分账状态', type: LIST, selectList: payAllocStatusList.value },
{
field: 'mchNo',
type: LIST,