aliPayChannelForm.vue 13.1 KB
Newer Older
sunhongwei's avatar
sunhongwei committed
1 2 3 4 5
<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">
Marcus's avatar
Marcus committed
6 7
        <el-form-item label-width="180px" :label="$t('渠道费率')" prop="feeRate">
          <el-input v-model="form.feeRate" :placeholder="$t('请输入渠道费率')" clearable :style="{width: '100%'}">
sunhongwei's avatar
sunhongwei committed
8 9 10 11 12 13 14
            <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>
Marcus's avatar
Marcus committed
15
        <el-form-item label-width="180px" :label="$t('渠道状态')" prop="status">
sunhongwei's avatar
sunhongwei committed
16 17 18 19 20 21
          <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>
Marcus's avatar
Marcus committed
22
        <el-form-item label-width="180px" :label="$t('网关地址')" prop="aliPayConfig.serverUrl">
sunhongwei's avatar
sunhongwei committed
23 24 25 26 27 28
          <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>
Marcus's avatar
Marcus committed
29
        <el-form-item label-width="180px" :label="$t('算法类型')" prop="aliPayConfig.signType">
sunhongwei's avatar
sunhongwei committed
30 31 32 33 34 35
          <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>
Marcus's avatar
Marcus committed
36
        <el-form-item label-width="180px" :label="$t('公钥类型')" prop="aliPayConfig.mode">
sunhongwei's avatar
sunhongwei committed
37 38 39 40 41 42 43
          <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">
Marcus's avatar
Marcus committed
44
          <el-form-item label-width="180px" :label="$t('商户私钥')" prop="aliPayConfig.privateKey">
sunhongwei's avatar
sunhongwei committed
45
            <el-input type="textarea" :autosize="{minRows: 8, maxRows: 8}" v-model="form.aliPayConfig.privateKey"
Marcus's avatar
Marcus committed
46
                      :placeholder="$t('请输入商户私钥')" clearable :style="{width: '100%'}">
sunhongwei's avatar
sunhongwei committed
47 48
            </el-input>
          </el-form-item>
Marcus's avatar
Marcus committed
49
          <el-form-item label-width="180px" :label="$t('支付宝公钥字符串')" prop="aliPayConfig.alipayPublicKey">
sunhongwei's avatar
sunhongwei committed
50 51 52 53
            <el-input
              type="textarea"
              :autosize="{minRows: 8, maxRows: 8}"
              v-model="form.aliPayConfig.alipayPublicKey"
Marcus's avatar
Marcus committed
54
              :placeholder="$t('请输入支付宝公钥字符串')" clearable
sunhongwei's avatar
sunhongwei committed
55 56 57 58 59
              :style="{width: '100%'}">
            </el-input>
          </el-form-item>
        </div>
        <div v-if="form.aliPayConfig.mode === 2">
Marcus's avatar
Marcus committed
60
          <el-form-item label-width="180px" :label="$t('商户公钥应用证书')" prop="aliPayConfig.appCertContent">
sunhongwei's avatar
sunhongwei committed
61
            <el-input v-model="form.aliPayConfig.appCertContent" type="textarea"
Marcus's avatar
Marcus committed
62
                      :placeholder="$t('请上传商户公钥应用证书')"
sunhongwei's avatar
sunhongwei committed
63 64 65 66 67 68 69 70 71 72
                      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">
Marcus's avatar
Marcus committed
73
              <el-button size="small" type="primary" icon="el-icon-upload">{{ $t('点击上传') }}</el-button>
sunhongwei's avatar
sunhongwei committed
74 75
            </el-upload>
          </el-form-item>
Marcus's avatar
Marcus committed
76
          <el-form-item label-width="180px" :label="$t('支付宝公钥证书')" prop="aliPayConfig.alipayPublicCertContent">
sunhongwei's avatar
sunhongwei committed
77
            <el-input v-model="form.aliPayConfig.alipayPublicCertContent" type="textarea"
Marcus's avatar
Marcus committed
78
                      :placeholder="$t('请上传支付宝公钥证书')"
sunhongwei's avatar
sunhongwei committed
79 80 81 82 83 84 85 86 87 88
                      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">
Marcus's avatar
Marcus committed
89
              <el-button size="small" type="primary" icon="el-icon-upload">{{ $t('点击上传') }}</el-button>
sunhongwei's avatar
sunhongwei committed
90 91
            </el-upload>
          </el-form-item>
Marcus's avatar
Marcus committed
92
          <el-form-item label-width="180px" :label="$t('根证书')" prop="aliPayConfig.rootCertContent">
sunhongwei's avatar
sunhongwei committed
93 94 95
            <el-input
              v-model="form.aliPayConfig.rootCertContent"
              type="textarea"
Marcus's avatar
Marcus committed
96
              :placeholder="$t('请上传根证书')"
sunhongwei's avatar
sunhongwei committed
97 98 99 100 101 102 103 104 105 106 107 108
              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">
Marcus's avatar
Marcus committed
109
              <el-button size="small" type="primary" icon="el-icon-upload">{{ $t('点击上传') }}</el-button>
sunhongwei's avatar
sunhongwei committed
110 111 112
            </el-upload>
          </el-form-item>
        </div>
Marcus's avatar
Marcus committed
113
        <el-form-item label-width="180px" :label="$t('备注')" prop="remark">
sunhongwei's avatar
sunhongwei committed
114 115 116 117
          <el-input v-model="form.remark" :style="{width: '100%'}"></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
Marcus's avatar
Marcus committed
118 119
        <el-button @click="close">{{ $t('取消') }}</el-button>
        <el-button type="primary" @click="handleConfirm">{{ $t('确定') }}</el-button>
sunhongwei's avatar
sunhongwei committed
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
      </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,
Marcus's avatar
Marcus committed
180
          message: this.$t('请输入渠道费率'),
sunhongwei's avatar
sunhongwei committed
181 182 183 184 185 186 187 188 189
          trigger: 'blur'
        }],
        'aliPayConfig.appId': [{
          required: true,
          message: '请输入开放平台上创建的应用的 ID',
          trigger: 'blur'
        }],
        status: [{
          required: true,
Marcus's avatar
Marcus committed
190
          message: this.$t('渠道状态不能为空'),
sunhongwei's avatar
sunhongwei committed
191 192 193 194
          trigger: 'blur'
        }],
        'aliPayConfig.serverUrl': [{
          required: true,
Marcus's avatar
Marcus committed
195
          message: this.$t('请传入网关地址'),
sunhongwei's avatar
sunhongwei committed
196 197 198 199
          trigger: 'blur'
        }],
        'aliPayConfig.signType': [{
          required: true,
Marcus's avatar
Marcus committed
200
          message: this.$t('请传入签名算法类型'),
sunhongwei's avatar
sunhongwei committed
201 202 203 204
          trigger: 'blur'
        }],
        'aliPayConfig.mode': [{
          required: true,
Marcus's avatar
Marcus committed
205
          message: this.$t('公钥类型不能为空'),
sunhongwei's avatar
sunhongwei committed
206 207 208 209
          trigger: 'blur'
        }],
        'aliPayConfig.privateKey': [{
          required: true,
Marcus's avatar
Marcus committed
210
          message: this.$t('请输入商户私钥'),
sunhongwei's avatar
sunhongwei committed
211 212 213 214
          trigger: 'blur'
        }],
        'aliPayConfig.alipayPublicKey': [{
          required: true,
Marcus's avatar
Marcus committed
215
          message: this.$t('请输入支付宝公钥字符串'),
sunhongwei's avatar
sunhongwei committed
216 217 218 219
          trigger: 'blur'
        }],
        'aliPayConfig.appCertContent': [{
          required: true,
Marcus's avatar
Marcus committed
220
          message: this.$t('请上传商户公钥应用证书'),
sunhongwei's avatar
sunhongwei committed
221 222 223 224
          trigger: 'blur'
        }],
        'aliPayConfig.alipayPublicCertContent': [{
          required: true,
Marcus's avatar
Marcus committed
225
          message: this.$t('请上传支付宝公钥证书'),
sunhongwei's avatar
sunhongwei committed
226 227 228 229
          trigger: 'blur'
        }],
        'aliPayConfig.rootCertContent': [{
          required: true,
Marcus's avatar
Marcus committed
230
          message: this.$t('请上传指定根证书'),
sunhongwei's avatar
sunhongwei committed
231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
          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) {
Marcus's avatar
Marcus committed
255
            this.title = this.$t("编辑支付渠道");
sunhongwei's avatar
sunhongwei committed
256 257
            this.init();
          } else {
Marcus's avatar
Marcus committed
258
            this.title = this.$t("创建支付渠道");
sunhongwei's avatar
sunhongwei committed
259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358
          }
        }
      }
    }
  },

  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>