wechatChannelForm.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. <template>
  2. <div>
  3. <el-dialog :visible.sync="transferParam.wechatOpen" :title="title" @close="close" append-to-body width="800px">
  4. <el-form ref="wechatJsApiForm" :model="form" :rules="rules" size="medium" label-width="100px"
  5. v-loading="transferParam.loading">
  6. <el-form-item label-width="180px" label="渠道费率" prop="feeRate">
  7. <el-input v-model="form.feeRate" placeholder="请输入渠道费率" clearable :style="{width: '100%'}">
  8. <template slot="append">%</template>
  9. </el-input>
  10. </el-form-item>
  11. <el-form-item label-width="180px" label="公众号APPID" prop="weChatConfig.appId">
  12. <el-input v-model="form.weChatConfig.appId" placeholder="请输入公众号APPID" clearable :style="{width: '100%'}">
  13. </el-input>
  14. </el-form-item>
  15. <el-form-item label-width="180px" label="商户号" prop="weChatConfig.mchId">
  16. <el-input v-model="form.weChatConfig.mchId" :style="{width: '100%'}"></el-input>
  17. </el-form-item>
  18. <el-form-item label-width="180px" label="渠道状态" prop="status">
  19. <el-radio-group v-model="form.status" size="medium">
  20. <el-radio v-for="dict in statusDictDatas" :key="parseInt(dict.value)" :label="parseInt(dict.value)">
  21. {{ dict.label }}
  22. </el-radio>
  23. </el-radio-group>
  24. </el-form-item>
  25. <el-form-item label-width="180px" label="API 版本" prop="weChatConfig.apiVersion">
  26. <el-radio-group v-model="form.weChatConfig.apiVersion" size="medium">
  27. <el-radio v-for="dict in versionDictDatas" :key="dict.value" :label="dict.value">
  28. {{ dict.label }}
  29. </el-radio>
  30. </el-radio-group>
  31. </el-form-item>
  32. <el-form-item label-width="180px" label="商户秘钥" prop="weChatConfig.mchKey"
  33. v-if="form.weChatConfig.apiVersion === 'v2'">
  34. <el-input v-model="form.weChatConfig.mchKey" placeholder="请输入商户秘钥" clearable
  35. :style="{width: '100%'}" type="textarea" :autosize="{minRows: 8, maxRows: 8}"></el-input>
  36. </el-form-item>
  37. <div v-if="form.weChatConfig.apiVersion === 'v3'">
  38. <el-form-item label-width="180px" label="API V3秘钥" prop="weChatConfig.apiV3Key">
  39. <el-input v-model="form.weChatConfig.apiV3Key" placeholder="请输入API V3秘钥" clearable
  40. :style="{width: '100%'}" type="textarea" :autosize="{minRows: 8, maxRows: 8}"></el-input>
  41. </el-form-item>
  42. <el-form-item label-width="180px" label="apiclient_key.perm证书" prop="weChatConfig.privateKeyContent">
  43. <el-input v-model="form.weChatConfig.privateKeyContent" type="textarea"
  44. placeholder="请上传apiclient_key.perm证书"
  45. readonly :autosize="{minRows: 8, maxRows: 8}" :style="{width: '100%'}"></el-input>
  46. </el-form-item>
  47. <el-form-item label-width="180px" label="" prop="privateKeyContentFile">
  48. <el-upload ref="privateKeyContentFile"
  49. :limit="1"
  50. :accept="fileAccept"
  51. :headers="header"
  52. action=""
  53. :before-upload="pemFileBeforeUpload"
  54. :http-request="privateKeyUpload"
  55. >
  56. <el-button size="small" type="primary" icon="el-icon-upload">点击上传</el-button>
  57. </el-upload>
  58. </el-form-item>
  59. <el-form-item label-width="180px" label="apiclient_cert.perm证书" prop="weChatConfig.privateCertContent">
  60. <el-input v-model="form.weChatConfig.privateCertContent" type="textarea"
  61. placeholder="请上传apiclient_cert.perm证书"
  62. readonly :autosize="{minRows: 8, maxRows: 8}" :style="{width: '100%'}"></el-input>
  63. </el-form-item>
  64. <el-form-item label-width="180px" label="" prop="privateCertContentFile">
  65. <el-upload ref="privateCertContentFile"
  66. :limit="1"
  67. :accept="fileAccept"
  68. :headers="header"
  69. action=""
  70. :before-upload="pemFileBeforeUpload"
  71. :http-request="privateCertUpload"
  72. >
  73. <el-button size="small" type="primary" icon="el-icon-upload">点击上传</el-button>
  74. </el-upload>
  75. </el-form-item>
  76. </div>
  77. <el-form-item label-width="180px" label="备注" prop="remark">
  78. <el-input v-model="form.remark" :style="{width: '100%'}"></el-input>
  79. </el-form-item>
  80. </el-form>
  81. <div slot="footer" class="dialog-footer">
  82. <el-button @click="close">取消</el-button>
  83. <el-button type="primary" @click="handleConfirm">确定</el-button>
  84. </div>
  85. </el-dialog>
  86. </div>
  87. </template>
  88. <script>
  89. import {DICT_TYPE, getDictDatas} from "@/utils/dict";
  90. import {createChannel, getChannel, updateChannel} from "@/api/pay/channel";
  91. const defaultForm = {
  92. code: '',
  93. status: null,
  94. remark: '',
  95. feeRate: null,
  96. appId: '',
  97. merchantId: null,
  98. weChatConfig: {
  99. appId: '',
  100. mchId: '',
  101. apiVersion: '',
  102. mchKey: '',
  103. privateKeyContent: '',
  104. privateCertContent: '',
  105. apiV3Key:'',
  106. }
  107. }
  108. export default {
  109. name: "wechatChannelForm",
  110. components: {},
  111. props: {
  112. // 传输的参数
  113. transferParam: {
  114. // 加载动画
  115. "loading": false,
  116. // 是否修改
  117. "edit": false,
  118. // 是否显示
  119. "wechatOpen": false,
  120. // 应用ID
  121. "appId": null,
  122. // 渠道编码
  123. "payCode": null,
  124. // 商户对象
  125. "payMerchant": {
  126. // 编号
  127. "id": null,
  128. // 名称
  129. "name": null
  130. },
  131. }
  132. },
  133. data() {
  134. return {
  135. title:'',
  136. form: JSON.parse(JSON.stringify(defaultForm)),
  137. rules: {
  138. feeRate: [{
  139. required: true,
  140. message: '请输入渠道费率',
  141. trigger: 'blur'
  142. }],
  143. 'weChatConfig.mchId': [{
  144. required: true,
  145. message: '请传入商户号',
  146. trigger: 'blur'
  147. }],
  148. 'weChatConfig.appId': [{
  149. required: true,
  150. message: '请输入公众号APPID',
  151. trigger: 'blur'
  152. }],
  153. status: [{
  154. required: true,
  155. message: '渠道状态不能为空',
  156. trigger: 'blur'
  157. }],
  158. 'weChatConfig.apiVersion': [{
  159. required: true,
  160. message: 'API版本不能为空',
  161. trigger: 'blur'
  162. }],
  163. 'weChatConfig.mchKey': [{
  164. required: true,
  165. message: '请输入商户秘钥',
  166. trigger: 'blur'
  167. }],
  168. 'weChatConfig.privateKeyContent': [{
  169. required: true,
  170. message: '请上传apiclient_key.perm证书',
  171. trigger: 'blur'
  172. }],
  173. 'weChatConfig.privateCertContent': [{
  174. required: true,
  175. message: '请上传apiclient_cert.perm证书',
  176. trigger: 'blur'
  177. }],
  178. 'weChatConfig.apiV3Key': [{
  179. required: true,
  180. message: '请上传apiV3秘钥值',
  181. trigger: 'blur'
  182. }],
  183. },
  184. // 文件上传的header
  185. header: {
  186. "Authorization": null
  187. },
  188. fileAccept: ".pem",
  189. // 渠道状态 数据字典
  190. statusDictDatas: getDictDatas(DICT_TYPE.SYS_COMMON_STATUS),
  191. versionDictDatas: getDictDatas(DICT_TYPE.PAY_CHANNEL_WECHAT_VERSION),
  192. }
  193. },
  194. watch: {
  195. transferParam: {
  196. deep: true, // 深度监听
  197. handler(newVal) {
  198. if (newVal.wechatOpen) {
  199. this.form.code = newVal.payCode;
  200. this.form.appId = newVal.appId;
  201. this.form.merchantId = newVal.payMerchant.id;
  202. // 只有在初次进来为编辑 并且为加载中的时候才回去请求数据
  203. if (newVal.edit && newVal.loading) {
  204. this.title = "编辑支付渠道";
  205. this.init();
  206. } else {
  207. this.title = "创建支付渠道";
  208. }
  209. }
  210. }
  211. }
  212. },
  213. methods: {
  214. init() {
  215. getChannel(this.transferParam.payMerchant.id, this.transferParam.appId, this.transferParam.payCode)
  216. .then(response => {
  217. this.form.id = response.data.id;
  218. this.form.feeRate = response.data.feeRate;
  219. this.form.appId = response.data.appId;
  220. this.form.status = response.data.status;
  221. this.form.remark = response.data.remark;
  222. let config = JSON.parse(response.data.config);
  223. this.form.weChatConfig.appId = config.appId;
  224. this.form.weChatConfig.apiVersion = config.apiVersion;
  225. this.form.weChatConfig.mchId = config.mchId;
  226. this.form.weChatConfig.mchKey = config.mchKey;
  227. this.form.weChatConfig.privateKeyContent = config.privateKeyContent;
  228. this.form.weChatConfig.privateCertContent = config.privateCertContent;
  229. this.form.weChatConfig.apiV3Key = config.apiV3Key;
  230. this.transferParam.loading = false;
  231. })
  232. },
  233. close() {
  234. this.transferParam.wechatOpen = false;
  235. this.form = JSON.parse(JSON.stringify(defaultForm));
  236. },
  237. handleConfirm() {
  238. this.$refs['wechatJsApiForm'].validate(valid => {
  239. if (!valid) {
  240. return
  241. }
  242. let data = this.form;
  243. data.config = JSON.stringify(this.form.weChatConfig);
  244. if (this.transferParam.edit) {
  245. updateChannel(data).then(response => {
  246. if (response.code === 0) {
  247. this.msgSuccess("修改成功");
  248. this.close();
  249. }
  250. })
  251. } else {
  252. createChannel(data).then(response => {
  253. if (response.code === 0) {
  254. this.msgSuccess("新增成功");
  255. this.$parent.refreshTable();
  256. this.close();
  257. }
  258. });
  259. }
  260. });
  261. },
  262. pemFileBeforeUpload(file) {
  263. let format = '.' + file.name.split(".")[1];
  264. if (format !== this.fileAccept) {
  265. this.$message.error('请上传指定格式"' + this.fileAccept + '"文件');
  266. return false;
  267. }
  268. let isRightSize = file.size / 1024 / 1024 < 2
  269. if (!isRightSize) {
  270. this.$message.error('文件大小超过 2MB')
  271. }
  272. return isRightSize
  273. },
  274. privateKeyUpload(event) {
  275. const readFile = new FileReader()
  276. readFile.onload = (e) => {
  277. this.form.weChatConfig.privateKeyContent = e.target.result
  278. }
  279. readFile.readAsText(event.file);
  280. },
  281. privateCertUpload(event) {
  282. const readFile = new FileReader()
  283. readFile.onload = (e) => {
  284. this.form.weChatConfig.privateCertContent = e.target.result
  285. }
  286. readFile.readAsText(event.file);
  287. }
  288. }
  289. }
  290. </script>
  291. <style scoped>
  292. </style>