payment.controller.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. import { FastifyInstance, FastifyReply, FastifyRequest } from 'fastify'
  2. import { PaymentService } from '../services/payment.service'
  3. import {
  4. CreatePaymentParams,
  5. PaymentNotifyParams,
  6. CreatePaymentOrderParams,
  7. UserQueryOrderParams,
  8. CreateSinglePaymentOrderParams,
  9. SingleQueryParams,
  10. SingleListQueryParams
  11. } from '../dto/payment.dto'
  12. export class PaymentController {
  13. private paymentService: PaymentService
  14. constructor(app: FastifyInstance) {
  15. this.paymentService = new PaymentService(app)
  16. }
  17. async createPaymentOrder(request: FastifyRequest<{ Body: CreatePaymentOrderParams }>, reply: FastifyReply) {
  18. try {
  19. const { userId, type } = request.body
  20. const ip = request.ip
  21. if (!userId || !type) {
  22. return reply.code(400).send({
  23. message: '缺少字段'
  24. })
  25. }
  26. const validTypes = ['single', 'hourly', 'daily', 'weekly', 'monthly', 'quarterly', 'yearly', 'lifetime']
  27. if (!validTypes.includes(type)) {
  28. return reply.code(400).send({
  29. message: '不支持的订单类型'
  30. })
  31. }
  32. const result = await this.paymentService.createPaymentOrder({ userId, type, ip })
  33. return reply.send(result)
  34. } catch (error) {
  35. return reply.code(500).send({ message: '创建支付订单失败', error })
  36. }
  37. }
  38. async createSinglePaymentOrder(
  39. request: FastifyRequest<{ Body: CreateSinglePaymentOrderParams }>,
  40. reply: FastifyReply
  41. ) {
  42. try {
  43. const { resourceId, userId } = request.body
  44. const ip = request.ip
  45. if (!userId || !resourceId) {
  46. return reply.code(400).send({
  47. message: '缺少字段'
  48. })
  49. }
  50. const result = await this.paymentService.createSinglePaymentOrder({ resourceId, userId, ip })
  51. return reply.send(result)
  52. } catch (error) {
  53. return reply.code(500).send({ message: '创建单片购买订单失败', error })
  54. }
  55. }
  56. async notifyOrder(request: FastifyRequest<{ Querystring: PaymentNotifyParams }>, reply: FastifyReply) {
  57. try {
  58. await this.paymentService.handlePaymentNotify(request.query)
  59. return reply.send('success')
  60. } catch (error) {
  61. return reply.code(500).send('Failed to handle payment notification')
  62. }
  63. }
  64. async queryOrder(
  65. request: FastifyRequest<{
  66. Querystring: {
  67. trade_no?: string
  68. out_trade_no?: string
  69. }
  70. }>,
  71. reply: FastifyReply
  72. ) {
  73. try {
  74. const { trade_no, out_trade_no } = request.query
  75. if (!trade_no && !out_trade_no) {
  76. return reply.code(400).send({
  77. message: 'trade_no and out_trade_no are required'
  78. })
  79. }
  80. const result = await this.paymentService.queryOrder({ trade_no, out_trade_no })
  81. return reply.send(result)
  82. } catch (error) {
  83. return reply.code(500).send('Failed to query payment order')
  84. }
  85. }
  86. async userQueryOrder(request: FastifyRequest<{ Querystring: UserQueryOrderParams }>, reply: FastifyReply) {
  87. try {
  88. const user = request.user
  89. const { orderNo, resourceId } = request.query
  90. const result = await this.paymentService.userQueryOrder(user.id, orderNo, resourceId)
  91. return reply.send(result)
  92. } catch (error) {
  93. return reply.code(500).send('Failed to query user order')
  94. }
  95. }
  96. async userSingleQuery(request: FastifyRequest<{ Querystring: SingleQueryParams }>, reply: FastifyReply) {
  97. try {
  98. const user = request.user
  99. const { resourceId } = request.query
  100. const result = await this.paymentService.userSingleQuery(user.id, resourceId)
  101. return reply.send(result)
  102. } catch (error) {
  103. return reply.code(500).send('Failed to query user single query')
  104. }
  105. }
  106. async userSingleList(request: FastifyRequest<{ Querystring: SingleListQueryParams }>, reply: FastifyReply) {
  107. try {
  108. const user = request.user
  109. const { page = 0, size = 20, resourceId } = request.query
  110. const result = await this.paymentService.userSingleList(user.id, { page, size, resourceId })
  111. return reply.send(result)
  112. } catch (error) {
  113. return reply.code(500).send('Failed to query user single list')
  114. }
  115. }
  116. }