payment.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. /**
  2. * 支付工具类
  3. * 处理扫码支付相关的业务逻辑
  4. */
  5. class PaymentService {
  6. constructor() {
  7. this.baseUrl = process.env.VUE_APP_API_BASE_URL || 'https://api.example.com';
  8. }
  9. /**
  10. * 创建支付订单
  11. * @param {Object} orderData 订单数据
  12. * @param {number} orderData.amount 支付金额
  13. * @param {string} orderData.paymentMethod 支付方式
  14. * @param {string} orderData.orderId 订单ID
  15. * @param {string} orderData.description 订单描述
  16. */
  17. async createPaymentOrder(orderData) {
  18. try {
  19. const response = await uni.request({
  20. url: `${this.baseUrl}/api/payment/create`,
  21. method: 'POST',
  22. data: {
  23. amount: orderData.amount,
  24. paymentMethod: orderData.paymentMethod,
  25. orderId: orderData.orderId,
  26. description: orderData.description,
  27. timestamp: Date.now()
  28. },
  29. header: {
  30. 'Content-Type': 'application/json',
  31. 'Authorization': `Bearer ${this.getToken()}`
  32. }
  33. });
  34. if (response.statusCode === 200 && response.data.success) {
  35. return {
  36. success: true,
  37. data: response.data.data,
  38. message: '订单创建成功'
  39. };
  40. } else {
  41. throw new Error(response.data.message || '订单创建失败');
  42. }
  43. } catch (error) {
  44. console.error('创建支付订单失败:', error);
  45. return {
  46. success: false,
  47. message: error.message || '网络错误,请重试'
  48. };
  49. }
  50. }
  51. /**
  52. * 发起支付
  53. * @param {Object} paymentData 支付数据
  54. * @param {string} paymentData.orderId 订单ID
  55. * @param {string} paymentData.paymentMethod 支付方式
  56. */
  57. async requestPayment(paymentData) {
  58. try {
  59. // 只支持支付宝支付
  60. if (paymentData.paymentMethod === 'alipay') {
  61. return await this.alipayPay(paymentData);
  62. } else {
  63. throw new Error('不支持的支付方式');
  64. }
  65. } catch (error) {
  66. console.error('支付请求失败:', error);
  67. return {
  68. success: false,
  69. message: error.message || '支付失败,请重试'
  70. };
  71. }
  72. }
  73. /**
  74. * 支付宝支付
  75. * @param {Object} paymentData 支付数据
  76. */
  77. async alipayPay(paymentData) {
  78. return new Promise((resolve) => {
  79. // 模拟支付宝支付流程
  80. uni.showLoading({
  81. title: '正在调起支付宝...'
  82. });
  83. setTimeout(() => {
  84. uni.hideLoading();
  85. // 模拟支付结果(实际项目中需要调用真实的支付宝API)
  86. const success = Math.random() > 0.1; // 90%成功率
  87. if (success) {
  88. // 支付成功,更新订单状态
  89. this.updateOrderStatus(paymentData.orderId, 'paid');
  90. resolve({
  91. success: true,
  92. message: '支付成功',
  93. transactionId: this.generateTransactionId()
  94. });
  95. } else {
  96. resolve({
  97. success: false,
  98. message: '支付失败,请重试'
  99. });
  100. }
  101. }, 2000);
  102. });
  103. }
  104. /**
  105. * 更新订单状态
  106. * @param {string} orderId 订单ID
  107. * @param {string} status 订单状态
  108. */
  109. async updateOrderStatus(orderId, status) {
  110. try {
  111. await uni.request({
  112. url: `${this.baseUrl}/api/order/update-status`,
  113. method: 'POST',
  114. data: {
  115. orderId,
  116. status,
  117. timestamp: Date.now()
  118. },
  119. header: {
  120. 'Content-Type': 'application/json',
  121. 'Authorization': `Bearer ${this.getToken()}`
  122. }
  123. });
  124. } catch (error) {
  125. console.error('更新订单状态失败:', error);
  126. }
  127. }
  128. /**
  129. * 查询支付结果
  130. * @param {string} orderId 订单ID
  131. */
  132. async queryPaymentResult(orderId) {
  133. try {
  134. const response = await uni.request({
  135. url: `${this.baseUrl}/api/payment/query`,
  136. method: 'GET',
  137. data: { orderId },
  138. header: {
  139. 'Authorization': `Bearer ${this.getToken()}`
  140. }
  141. });
  142. if (response.statusCode === 200) {
  143. return {
  144. success: true,
  145. data: response.data.data
  146. };
  147. } else {
  148. throw new Error('查询支付结果失败');
  149. }
  150. } catch (error) {
  151. console.error('查询支付结果失败:', error);
  152. return {
  153. success: false,
  154. message: error.message
  155. };
  156. }
  157. }
  158. /**
  159. * 获取用户token
  160. */
  161. getToken() {
  162. return uni.getStorageSync('token') || '';
  163. }
  164. /**
  165. * 生成交易ID
  166. */
  167. generateTransactionId() {
  168. const timestamp = Date.now();
  169. const random = Math.floor(Math.random() * 10000);
  170. return `TXN${timestamp}${random}`;
  171. }
  172. /**
  173. * 格式化金额
  174. * @param {number} amount 金额
  175. * @param {number} decimals 小数位数
  176. */
  177. formatAmount(amount, decimals = 2) {
  178. return parseFloat(amount).toFixed(decimals);
  179. }
  180. /**
  181. * 验证金额格式
  182. * @param {string} amount 金额字符串
  183. */
  184. validateAmount(amount) {
  185. const amountRegex = /^\d+(\.\d{1,2})?$/;
  186. const numAmount = parseFloat(amount);
  187. return amountRegex.test(amount) && numAmount > 0 && numAmount <= 999999.99;
  188. }
  189. /**
  190. * 获取支付方式配置
  191. */
  192. getPaymentMethods() {
  193. return [
  194. {
  195. id: 'alipay',
  196. name: '支付宝',
  197. description: '安全便捷的支付方式',
  198. icon: 'alipay',
  199. enabled: true
  200. }
  201. ];
  202. }
  203. /**
  204. * 处理扫码结果
  205. * @param {string} scanResult 扫码结果
  206. */
  207. parseScanResult(scanResult) {
  208. try {
  209. // 解析扫码结果,提取订单信息
  210. const url = new URL(scanResult);
  211. const params = new URLSearchParams(url.search);
  212. return {
  213. orderId: params.get('orderId'),
  214. amount: params.get('amount'),
  215. description: params.get('description'),
  216. merchantId: params.get('merchantId')
  217. };
  218. } catch (error) {
  219. console.error('解析扫码结果失败:', error);
  220. return null;
  221. }
  222. }
  223. }
  224. // 创建单例实例
  225. const paymentService = new PaymentService();
  226. export default paymentService;