<template> <div> <el-dialog :visible.sync="transferParam.aliPayOpen" :title="title" @closed="close" append-to-body width="800px"> <el-form ref="aliPayForm" :model="form" :rules="rules" size="medium" label-width="100px" v-loading="transferParam.loading"> <el-form-item label-width="180px" :label="$t('渠道费率')" prop="feeRate"> <el-input v-model="form.feeRate" :placeholder="$t('请输入渠道费率')" clearable :style="{width: '100%'}"> <template slot="append">%</template> </el-input> </el-form-item> <el-form-item label-width="180px" label="开放平台APPID" prop="aliPayConfig.appId"> <el-input v-model="form.aliPayConfig.appId" placeholder="请输入开放平台APPID" clearable :style="{width: '100%'}"> </el-input> </el-form-item> <el-form-item label-width="180px" :label="$t('渠道状态')" prop="status"> <el-radio-group v-model="form.status" size="medium"> <el-radio v-for="dict in statusDictDatas" :key="parseInt(dict.value)" :label="parseInt(dict.value)"> {{ dict.label }} </el-radio> </el-radio-group> </el-form-item> <el-form-item label-width="180px" :label="$t('网关地址')" prop="aliPayConfig.serverUrl"> <el-radio-group v-model="form.aliPayConfig.serverUrl" size="medium"> <el-radio v-for="dict in aliPayServerDatas" :key="dict.value" :label="dict.value"> {{ dict.label }} </el-radio> </el-radio-group> </el-form-item> <el-form-item label-width="180px" :label="$t('算法类型')" prop="aliPayConfig.signType"> <el-radio-group v-model="form.aliPayConfig.signType" size="medium"> <el-radio v-for="dict in aliPaySignTypeDatas" :key="dict.value" :label="dict.value"> {{ dict.label }} </el-radio> </el-radio-group> </el-form-item> <el-form-item label-width="180px" :label="$t('公钥类型')" prop="aliPayConfig.mode"> <el-radio-group v-model="form.aliPayConfig.mode" size="medium"> <el-radio v-for="dict in aliPayModeDatas" :key="parseInt(dict.value)" :label="parseInt(dict.value)"> {{ dict.label }} </el-radio> </el-radio-group> </el-form-item> <div v-if="form.aliPayConfig.mode === 1"> <el-form-item label-width="180px" :label="$t('商户私钥')" prop="aliPayConfig.privateKey"> <el-input type="textarea" :autosize="{minRows: 8, maxRows: 8}" v-model="form.aliPayConfig.privateKey" :placeholder="$t('请输入商户私钥')" clearable :style="{width: '100%'}"> </el-input> </el-form-item> <el-form-item label-width="180px" :label="$t('支付宝公钥字符串')" prop="aliPayConfig.alipayPublicKey"> <el-input type="textarea" :autosize="{minRows: 8, maxRows: 8}" v-model="form.aliPayConfig.alipayPublicKey" :placeholder="$t('请输入支付宝公钥字符串')" clearable :style="{width: '100%'}"> </el-input> </el-form-item> </div> <div v-if="form.aliPayConfig.mode === 2"> <el-form-item label-width="180px" :label="$t('商户公钥应用证书')" prop="aliPayConfig.appCertContent"> <el-input v-model="form.aliPayConfig.appCertContent" type="textarea" :placeholder="$t('请上传商户公钥应用证书')" readonly :autosize="{minRows: 8, maxRows: 8}" :style="{width: '100%'}"></el-input> </el-form-item> <el-form-item label-width="180px" label=""> <el-upload action="" ref="privateKeyContentFile" :limit="1" :accept="fileAccept" :http-request="appCertUpload" :before-upload="fileBeforeUpload"> <el-button size="small" type="primary" icon="el-icon-upload">{{ $t('点击上传') }}</el-button> </el-upload> </el-form-item> <el-form-item label-width="180px" :label="$t('支付宝公钥证书')" prop="aliPayConfig.alipayPublicCertContent"> <el-input v-model="form.aliPayConfig.alipayPublicCertContent" type="textarea" :placeholder="$t('请上传支付宝公钥证书')" readonly :autosize="{minRows: 8, maxRows: 8}" :style="{width: '100%'}"></el-input> </el-form-item> <el-form-item label-width="180px" label=""> <el-upload ref="privateCertContentFile" action="" :limit="1" :accept="fileAccept" :before-upload="fileBeforeUpload" :http-request="alipayPublicCertUpload"> <el-button size="small" type="primary" icon="el-icon-upload">{{ $t('点击上传') }}</el-button> </el-upload> </el-form-item> <el-form-item label-width="180px" :label="$t('根证书')" prop="aliPayConfig.rootCertContent"> <el-input v-model="form.aliPayConfig.rootCertContent" type="textarea" :placeholder="$t('请上传根证书')" readonly :autosize="{minRows: 8, maxRows: 8}" :style="{width: '100%'}"> </el-input> </el-form-item> <el-form-item label-width="180px" label=""> <el-upload ref="privateCertContentFile" :limit="1" :accept="fileAccept" action="" :before-upload="fileBeforeUpload" :http-request="rootCertUpload"> <el-button size="small" type="primary" icon="el-icon-upload">{{ $t('点击上传') }}</el-button> </el-upload> </el-form-item> </div> <el-form-item label-width="180px" :label="$t('备注')" prop="remark"> <el-input v-model="form.remark" :style="{width: '100%'}"></el-input> </el-form-item> </el-form> <div slot="footer" class="dialog-footer"> <el-button @click="close">{{ $t('取消') }}</el-button> <el-button type="primary" @click="handleConfirm">{{ $t('确定') }}</el-button> </div> </el-dialog> </div> </template> <script> import {DICT_TYPE, getDictDatas} from "@/utils/dict"; import {createChannel, getChannel, updateChannel} from "@/api/pay/channel"; const defaultForm = { code: '', status: null, remark: '', feeRate: null, appId: '', merchantId: null, aliPayConfig: { appId: '', serverUrl: null, signType: '', mode: null, privateKey: '', alipayPublicKey: '', appCertContent: '', alipayPublicCertContent: '', rootCertContent: '' } }; export default { name: "aliPayChannelForm", components: {}, props: { // 传输的参数 transferParam: { // 加载动画 "loading": false, // 是否修改 "edit": false, // 是否显示 "aliPayOpen": false, // 应用ID "appId": null, // 渠道编码 "payCode": null, // 商户对象 "payMerchant": { // 编号 "id": null, // 名称 "name": null }, } }, data() { return { title:'', form: JSON.parse(JSON.stringify(defaultForm)), rules: { feeRate: [{ required: true, message: this.$t('请输入渠道费率'), trigger: 'blur' }], 'aliPayConfig.appId': [{ required: true, message: '请输入开放平台上创建的应用的 ID', trigger: 'blur' }], status: [{ required: true, message: this.$t('渠道状态不能为空'), trigger: 'blur' }], 'aliPayConfig.serverUrl': [{ required: true, message: this.$t('请传入网关地址'), trigger: 'blur' }], 'aliPayConfig.signType': [{ required: true, message: this.$t('请传入签名算法类型'), trigger: 'blur' }], 'aliPayConfig.mode': [{ required: true, message: this.$t('公钥类型不能为空'), trigger: 'blur' }], 'aliPayConfig.privateKey': [{ required: true, message: this.$t('请输入商户私钥'), trigger: 'blur' }], 'aliPayConfig.alipayPublicKey': [{ required: true, message: this.$t('请输入支付宝公钥字符串'), trigger: 'blur' }], 'aliPayConfig.appCertContent': [{ required: true, message: this.$t('请上传商户公钥应用证书'), trigger: 'blur' }], 'aliPayConfig.alipayPublicCertContent': [{ required: true, message: this.$t('请上传支付宝公钥证书'), trigger: 'blur' }], 'aliPayConfig.rootCertContent': [{ required: true, message: this.$t('请上传指定根证书'), trigger: 'blur' }], }, fileAccept: ".crt", // 渠道状态 数据字典 statusDictDatas: getDictDatas(DICT_TYPE.COMMON_STATUS), // 支付宝加密方式 aliPaySignTypeDatas: getDictDatas(DICT_TYPE.PAY_CHANNEL_ALIPAY_SIGN_TYPE), // 版本状态 数据字典 aliPayModeDatas: getDictDatas(DICT_TYPE.PAY_CHANNEL_ALIPAY_MODE), // 支付宝网关地址 aliPayServerDatas: getDictDatas(DICT_TYPE.PAY_CHANNEL_ALIPAY_SERVER_TYPE), } }, watch: { transferParam: { deep: true, // 深度监听 handler(newVal) { if (newVal.aliPayOpen) { this.form.code = newVal.payCode; this.form.appId = newVal.appId; this.form.merchantId = newVal.payMerchant.id; // 只有在初次进来为编辑 并且为加载中的时候才回去请求数据 if (newVal.edit === true && newVal.loading) { this.title = this.$t("编辑支付渠道"); this.init(); } else { this.title = this.$t("创建支付渠道"); } } } } }, methods: { init() { getChannel(this.transferParam.payMerchant.id, this.transferParam.appId, this.transferParam.payCode) .then(response => { this.form.id = response.data.id; this.form.feeRate = response.data.feeRate; this.form.status = response.data.status; this.form.remark = response.data.remark; let config = JSON.parse(response.data.config); this.form.aliPayConfig.appId = config.appId; this.form.aliPayConfig.serverUrl = config.serverUrl; this.form.aliPayConfig.signType = config.signType; this.form.aliPayConfig.mode = config.mode; this.form.aliPayConfig.privateKey = config.privateKey; this.form.aliPayConfig.alipayPublicKey = config.alipayPublicKey; this.form.aliPayConfig.appCertContent = config.appCertContent; this.form.aliPayConfig.alipayPublicCertContent = config.alipayPublicCertContent; this.form.aliPayConfig.rootCertContent = config.rootCertContent; this.transferParam.loading = false; }) }, close() { this.transferParam.aliPayOpen = false; this.form = JSON.parse(JSON.stringify(defaultForm)); }, handleConfirm() { this.$refs['aliPayForm'].validate(valid => { if (!valid) { return } let data = this.form; data.config = JSON.stringify(this.form.aliPayConfig); if (this.transferParam.edit) { updateChannel(data).then(response => { if (response.code === 0) { this.$modal.msgSuccess("修改成功"); this.close(); } }) } else { createChannel(data).then(response => { if (response.code === 0) { this.$modal.msgSuccess("新增成功"); this.$parent.refreshTable(); this.close(); } }); } }); }, fileBeforeUpload(file) { let format = '.' + file.name.split(".")[1]; if (format !== this.fileAccept) { this.$message.error('请上传指定格式"' + this.fileAccept + '"文件'); return false; } let isRightSize = file.size / 1024 / 1024 < 2 if (!isRightSize) { this.$message.error('文件大小超过 2MB') } return isRightSize }, appCertUpload(event) { const readFile = new FileReader() readFile.onload = (e) => { this.form.aliPayConfig.appCertContent = e.target.result } readFile.readAsText(event.file); }, alipayPublicCertUpload(event) { const readFile = new FileReader() readFile.onload = (e) => { this.form.aliPayConfig.alipayPublicCertContent = e.target.result } readFile.readAsText(event.file); }, rootCertUpload(event) { const readFile = new FileReader() readFile.onload = (e) => { this.form.aliPayConfig.rootCertContent = e.target.result } readFile.readAsText(event.file); }, } } </script> <style scoped> </style>