test.vue 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <!-- eslint-disable prettier/prettier -->
  2. <!-- eslint-disable prettier/prettier -->
  3. <template>
  4. <div class="test">
  5. <div class="tip custom-block"></div>
  6. <el-card shadow="never">
  7. <template #header>
  8. <div class="card-header">
  9. <span>在线调试</span>
  10. <el-link type="primary" href="https://doc.apipost.net/docs/detail/3a406d7ed003000?target_id=2406377fb07129"
  11. target="_blank">点击查看对接文档</el-link>
  12. </div>
  13. </template>
  14. <el-form :model="form" label-width="200px">
  15. <el-form-item label="商户号(mchId)" required>
  16. <el-input v-model="form.mchId" />
  17. </el-form-item>
  18. <el-form-item label="密钥(key)" required>
  19. <el-input v-model="key" />
  20. </el-form-item>
  21. <el-form-item label="商户订单号(outOrderNo)" required>
  22. <el-input v-model="form.outOrderNo" style="width: 80%;"></el-input>
  23. <el-button type="primary" style="margin-left: 2px;" @click="makeKey()">自动生成</el-button>
  24. </el-form-item>
  25. <el-form-item label="金额(amount)" required>
  26. <el-input-number :min="1" :max="99999" :precision="2" v-model="form.amount" />
  27. </el-form-item>
  28. <el-form-item label="货币单位(currency)" required>
  29. <el-input v-model="form.currency" />
  30. </el-form-item>
  31. <el-form-item label="支付类型(payType)" required>
  32. <el-input v-model="form.payType" />
  33. </el-form-item>
  34. <el-form-item label="平台用户ID(userId)" required>
  35. <el-input v-model="form.userId" />
  36. </el-form-item>
  37. <el-form-item label="平台用户IP(userIp)">
  38. <el-input v-model="form.userIp" />
  39. </el-form-item>
  40. <el-form-item label="同步跳转地址(returnUrl)">
  41. <el-input v-model="form.returnUrl" />
  42. </el-form-item>
  43. <el-form-item label="支付回调地址(notifyUrl)" required>
  44. <el-input v-model="form.notifyUrl" />
  45. </el-form-item>
  46. <el-form-item label="待签字符串">
  47. <code>{{ signStr }}</code>
  48. </el-form-item>
  49. <el-form-item label="签名(sign)" required>
  50. <el-input v-model="sign" />
  51. </el-form-item>
  52. <el-form-item>
  53. <el-button type="primary" :loading="loading" @click="onSubmit">确认</el-button>
  54. <el-button @click="onReset" :loading="loading">重置</el-button>
  55. </el-form-item>
  56. <el-form-item label="接口返回(JSON)" required>
  57. <el-input v-model="data" :rows="6" type="textarea" />
  58. </el-form-item>
  59. <el-form-item>
  60. <el-link v-if="payUrl" type="primary" :href="payUrl" target="_blank">前往支付页面</el-link>
  61. <el-link v-if="formText" type="primary" @click="toFormPay">前往支付页面</el-link>
  62. </el-form-item>
  63. </el-form>
  64. </el-card>
  65. </div>
  66. </template>
  67. <script lang="ts" name="test" setup>
  68. import { useCool } from "/@/cool";
  69. import { ref, computed } from "vue";
  70. import md5 from "md5";
  71. import dayjs from "dayjs";
  72. const { service } = useCool();
  73. const loading = ref(false);
  74. function makeKey() {
  75. form.value.outOrderNo = "TEST" + dayjs().format("YYYYMMDDHHmmss");
  76. }
  77. function toFormPay() {
  78. document.write(formText.value);
  79. }
  80. const key = ref("32394ae8b550485c53326f10764f8492");
  81. const defaultForm = {
  82. mchId: "TEST",
  83. outOrderNo: "",
  84. notifyUrl: "http://157.175.73.225/api/admin/dj/open/notifyTest",
  85. returnUrl: "https://www.baidu.com",
  86. amount: 100,
  87. payType: "",
  88. userIp: "127.0.0.1",
  89. userId: "test",
  90. currency: 'USD'
  91. };
  92. const form = ref({
  93. ...defaultForm
  94. });
  95. const payUrl = ref("");
  96. const formText = ref("");
  97. const onSubmit = async () => {
  98. loading.value = true;
  99. try {
  100. const res = await service.dj.open.order({
  101. ...form.value,
  102. sign: sign.value
  103. });
  104. data.value = JSON.stringify(res);
  105. payUrl.value = res.payUrl || "";
  106. formText.value = res.form || "";
  107. } catch (err) {
  108. data.value = JSON.stringify(err);
  109. }
  110. loading.value = false;
  111. };
  112. const signStr = computed(() => {
  113. return signSort(form.value) + `&key=${key.value}`;
  114. });
  115. const sign = computed(() => {
  116. return md5(signSort(form.value) + `&key=${key.value}`);
  117. });
  118. const data = ref("");
  119. function signSort(args: any) {
  120. var keys = Object.keys(args);
  121. keys = keys.sort();
  122. var newArgs = {};
  123. keys.forEach(function (key) {
  124. newArgs[key] = args[key];
  125. });
  126. var string = "";
  127. for (var k in newArgs) {
  128. string += "&" + k + "=" + newArgs[k];
  129. }
  130. string = string.substr(1);
  131. return string;
  132. }
  133. const onReset = () => {
  134. form.value = {
  135. ...defaultForm
  136. };
  137. };
  138. </script>
  139. <style lang="scss">
  140. .test {
  141. padding: 0 16px;
  142. .card-header {
  143. display: flex;
  144. justify-content: space-between;
  145. align-items: center;
  146. }
  147. }
  148. </style>