wechatJsApiForm.vue 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. <template>
  2. <div>
  3. <el-dialog :visible.sync="transferParam.open" @close="close" append-to-body>
  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%'}"></el-input>
  36. </el-form-item>
  37. <div v-if="form.weChatConfig.apiVersion === 'v3'">
  38. <el-form-item label-width="180px" label="apiclient_key.perm证书" prop="weChatConfig.privateKeyContent">
  39. <el-input v-model="form.weChatConfig.privateKeyContent" type="textarea"
  40. placeholder="请上传apiclient_key.perm证书"
  41. readonly :autosize="{minRows: 8, maxRows: 8}" :style="{width: '100%'}"></el-input>
  42. </el-form-item>
  43. <el-form-item label-width="180px" label="" prop="privateKeyContentFile">
  44. <el-upload ref="privateKeyContentFile"
  45. :limit="1"
  46. :accept="fileAccept"
  47. :headers="header"
  48. :action="pemUploadAction"
  49. :before-upload="pemFileBeforeUpload"
  50. :on-success="privateKeyUploadSuccess"
  51. >
  52. <el-button size="small" type="primary" icon="el-icon-upload">点击上传</el-button>
  53. </el-upload>
  54. </el-form-item>
  55. <el-form-item label-width="180px" label="apiclient_cert.perm证书" prop="weChatConfig.privateCertContent">
  56. <el-input v-model="form.weChatConfig.privateCertContent" type="textarea"
  57. placeholder="请上传apiclient_cert.perm证书"
  58. readonly :autosize="{minRows: 8, maxRows: 8}" :style="{width: '100%'}"></el-input>
  59. </el-form-item>
  60. <el-form-item label-width="180px" label="" prop="privateCertContentFile">
  61. <el-upload ref="privateCertContentFile"
  62. :limit="1"
  63. :accept="fileAccept"
  64. :headers="header"
  65. :action="pemUploadAction"
  66. :before-upload="pemFileBeforeUpload"
  67. :on-success="privateCertUploadSuccess"
  68. >
  69. <el-button size="small" type="primary" icon="el-icon-upload">点击上传</el-button>
  70. </el-upload>
  71. </el-form-item>
  72. </div>
  73. <el-form-item label-width="180px" label="备注" prop="remark">
  74. <el-input v-model="form.remark" :style="{width: '100%'}"></el-input>
  75. </el-form-item>
  76. </el-form>
  77. <div slot="footer" class="dialog-footer">
  78. <el-button @click="close">取消</el-button>
  79. <el-button type="primary" @click="handleConfirm">确定</el-button>
  80. </div>
  81. </el-dialog>
  82. </div>
  83. </template>
  84. <script>
  85. import {DICT_TYPE, getDictDatas} from "@/utils/dict";
  86. import {createWechatChannel, getWechatChannel, updateWechatChannel} from "@/api/pay/channel";
  87. export default {
  88. name: "wechatJsApiForm",
  89. components: {},
  90. props: {
  91. // 传输的参数
  92. transferParam: {
  93. // 加载动画
  94. "loading": false,
  95. // 是否修改
  96. "edit": false,
  97. // 是否显示
  98. "open": false,
  99. // 应用ID
  100. "appId": null,
  101. // 渠道编码
  102. "payCode": null,
  103. // 商户对象
  104. "payMerchant": {
  105. // 编号
  106. "id": null,
  107. // 名称
  108. "name": null
  109. },
  110. }
  111. },
  112. data() {
  113. return {
  114. form: {
  115. code: undefined,
  116. status: undefined,
  117. remark: undefined,
  118. feeRate: undefined,
  119. appId: undefined,
  120. merchantId: undefined,
  121. weChatConfig: {
  122. appId: undefined,
  123. mchId: undefined,
  124. apiVersion: undefined,
  125. mchKey: undefined,
  126. privateKeyContent: undefined,
  127. privateCertContent: undefined,
  128. }
  129. },
  130. rules: {
  131. feeRate: [{
  132. required: true,
  133. message: '请输入渠道费率',
  134. trigger: 'blur'
  135. }],
  136. 'weChatConfig.mchId': [{
  137. required: true,
  138. message: '请传入商户号',
  139. trigger: 'blur'
  140. }],
  141. 'weChatConfig.appId': [{
  142. required: true,
  143. message: '请输入公众号APPID',
  144. trigger: 'blur'
  145. }],
  146. status: [{
  147. required: true,
  148. message: '渠道状态不能为空',
  149. trigger: 'change'
  150. }],
  151. 'weChatConfig.apiVersion': [{
  152. required: true,
  153. message: 'API版本不能为空',
  154. trigger: 'change'
  155. }],
  156. 'weChatConfig.mchKey': [{
  157. required: true,
  158. message: '请输入商户秘钥',
  159. trigger: 'blur'
  160. }],
  161. 'weChatConfig.privateKeyContent': [{
  162. required: true,
  163. message: '请上传apiclient_key.perm证书',
  164. trigger: 'blur'
  165. }],
  166. 'weChatConfig.privateCertContent': [{
  167. required: true,
  168. message: '请上传apiclient_cert.perm证书',
  169. trigger: 'blur'
  170. }],
  171. },
  172. // 文件上传的header
  173. header: {
  174. "Authorization": null
  175. },
  176. pemUploadAction: 'http://127.0.0.1:48080/api/pay/channel/parsing-pem',
  177. fileAccept: ".pem",
  178. // 渠道状态 数据字典
  179. statusDictDatas: getDictDatas(DICT_TYPE.PAY_CHANNEL_STATUS),
  180. versionDictDatas: getDictDatas(DICT_TYPE.PAY_CHANNEL_WECHAT_VERSION),
  181. }
  182. },
  183. watch: {
  184. transferParam: {
  185. deep: true, // 深度监听
  186. handler(newVal) {
  187. this.form.code = newVal.payCode;
  188. this.form.appId = newVal.appId;
  189. this.form.merchantId = newVal.payMerchant.id;
  190. // 只有在初次进来为编辑 并且为加载中的时候才回去请求数据
  191. if (newVal.edit === true && newVal.loading) {
  192. this.init();
  193. }
  194. }
  195. }
  196. },
  197. created() {
  198. this.header.Authorization = "Bearer " + this.$store.getters.token;
  199. },
  200. methods: {
  201. init() {
  202. getWechatChannel(this.transferParam.payMerchant.id, this.transferParam.appId, this.transferParam.payCode)
  203. .then(response => {
  204. this.form = response.data;
  205. this.transferParam.loading = false;
  206. })
  207. },
  208. close() {
  209. this.transferParam.open = false;
  210. this.$refs['wechatJsApiForm'].resetFields();
  211. },
  212. handleConfirm() {
  213. this.$refs['wechatJsApiForm'].validate(valid => {
  214. if (!valid) {
  215. return
  216. }
  217. if (this.transferParam.edit) {
  218. updateWechatChannel(this.form).then(response => {
  219. if (response.code === 0 ) {
  220. this.msgSuccess("修改成功");
  221. this.close();
  222. }
  223. })
  224. } else {
  225. createWechatChannel(this.form).then(response => {
  226. if (response.code === 0) {
  227. this.msgSuccess("新增成功");
  228. this.$parent.refreshTable();
  229. this.close();
  230. }
  231. });
  232. }
  233. });
  234. },
  235. pemFileBeforeUpload(file) {
  236. let format = '.' + file.name.split(".")[1];
  237. if (format !== this.fileAccept) {
  238. this.$message.error('请上传指定格式"' + this.fileAccept + '"文件');
  239. return false;
  240. }
  241. let isRightSize = file.size / 1024 / 1024 < 2
  242. if (!isRightSize) {
  243. this.$message.error('文件大小超过 2MB')
  244. }
  245. return isRightSize
  246. },
  247. privateKeyUploadSuccess(response) {
  248. this.form.weChatConfig.privateKeyContent = response.data;
  249. },
  250. privateCertUploadSuccess(response) {
  251. this.form.weChatConfig.privateCertContent = response.data;
  252. }
  253. }
  254. }
  255. </script>
  256. <style scoped>
  257. </style>