UserBalancesController.ts 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. import Logger from '@ioc:Adonis/Core/Logger'
  2. import type { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'
  3. import UserBalance from 'App/Models/UserBalance'
  4. import PaginationService from 'App/Services/PaginationService'
  5. import { schema, rules } from '@ioc:Adonis/Core/Validator'
  6. import UserBalanceService from 'App/Services/UserBalanceService'
  7. import Decimal from 'decimal.js'
  8. import { BalanceRecordType } from 'App/Models/BalanceRecord'
  9. import qs from 'qs'
  10. import { format } from 'date-fns'
  11. import { createHash } from 'crypto'
  12. import axios from 'axios'
  13. import { InternalServerException } from 'App/Exceptions/Common'
  14. import { Exception } from '@adonisjs/core/build/standalone'
  15. import RechargeOrder, { RechargeOrderStatus } from 'App/Models/RechargeOrder'
  16. import { DateTime } from 'luxon'
  17. export default class UserBalancesController {
  18. private paginationService = new PaginationService(UserBalance)
  19. public async index({ request }: HttpContextContract) {
  20. return await this.paginationService.paginate(request.all())
  21. }
  22. public async store({ request }: HttpContextContract) {
  23. const data: any = await request.validate({
  24. schema: schema.create({
  25. userId: schema.number(),
  26. balance: schema.string()
  27. })
  28. })
  29. const userBalance = await UserBalance.create(data)
  30. return userBalance
  31. }
  32. public async show({ params, bouncer }: HttpContextContract) {
  33. const row = await UserBalanceService.getBalance(params.id)
  34. await bouncer.authorize('owner', row)
  35. return row
  36. }
  37. public async update({ params, request }: HttpContextContract) {
  38. const userBalance = await UserBalance.findOrFail(params.id)
  39. const data: any = await request.validate({
  40. schema: schema.create({
  41. userId: schema.number.optional(),
  42. amount: schema.number.optional(),
  43. type: schema.string.optional(),
  44. description: schema.string.optional()
  45. })
  46. })
  47. userBalance.merge(data)
  48. await userBalance.save()
  49. return userBalance
  50. }
  51. public async destroy({ params }: HttpContextContract) {
  52. const userBalance = await UserBalance.findOrFail(params.id)
  53. await userBalance.delete()
  54. }
  55. // public async recharge({ request }: HttpContextContract) {
  56. // console.log(JSON.stringify(request.all(), null, 4))
  57. // UserBalanceService.modifiyBalance({
  58. // userId: parseInt(request.param('userId')),
  59. // amount: new Decimal(request.input('id')),
  60. // type: BalanceRecordType.Recharge
  61. // })
  62. // const data = request.all()
  63. // return {
  64. // ok: true,
  65. // data: {
  66. // id: data.id,
  67. // latest_receipt: true,
  68. // transaction: data.transaction
  69. // }
  70. // }
  71. // }
  72. public async recharge({ request, auth }: HttpContextContract) {
  73. // const data: any = await request.validate({
  74. // schema: schema.create({
  75. // amount: schema.number(),
  76. // type: schema.string.optional()
  77. // })
  78. // })
  79. const amount = '2000000'
  80. const order = await RechargeOrder.create({
  81. userId: auth.user!.id,
  82. amount: new Decimal(amount),
  83. status: RechargeOrderStatus.Pending
  84. })
  85. const head = {
  86. mchtId: '2000220000449457',
  87. version: '20',
  88. biz: 'wp101'
  89. }
  90. const body = {
  91. orderId: order.id.toString(),
  92. orderTime: format(new Date(), 'yyyyMMddHHmmss'),
  93. amount: amount,
  94. currencyType: 'IDR',
  95. goods: 'recharge',
  96. notifyUrl: 'https://kaliartdrama.run.place/api/userBalances/rechargeNotify',
  97. callBackUrl: 'https://kaliartdrama.run.place',
  98. email: 'aaabbb@example.com',
  99. phone: '621111111111',
  100. name: 'zhang san',
  101. operator: 'OVO'
  102. }
  103. const str = qs.stringify(body, {
  104. encode: false,
  105. sort: (a, b) => {
  106. return a.localeCompare(b)
  107. }
  108. })
  109. Logger.info('param string=%s', str)
  110. const md5 = createHash('md5')
  111. const sign = md5.update(str + '&key=83cdc062cba24ea6b166adfdb9b782c1').digest('hex')
  112. Logger.info('sign=%s', sign)
  113. Logger.info(
  114. JSON.stringify(
  115. {
  116. head,
  117. body,
  118. sign
  119. },
  120. null,
  121. 4
  122. )
  123. )
  124. const res = await axios.post('https://api.haodamall.com/gateway/api/commPay', {
  125. head,
  126. body,
  127. sign
  128. })
  129. Logger.info('res=%s', JSON.stringify(res.data, null, 4))
  130. if (res.data.head.respCode === '0000') {
  131. return res.data.body
  132. } else {
  133. throw new Exception(res.data.head.respMsg)
  134. }
  135. }
  136. public async rechargeNotify({ request }: HttpContextContract) {
  137. const data = request.all()
  138. Logger.info('rechargeNotify: ' + JSON.stringify(data, null, 4))
  139. if (data.head.respCode === '0000') {
  140. try {
  141. const order = await RechargeOrder.findOrFail(parseInt(data.body.orderId))
  142. if (order.status === RechargeOrderStatus.Pending) {
  143. order.status = RechargeOrderStatus.Success
  144. order.transactionId = data.body.tradeId
  145. order.payTime = DateTime.now()
  146. await order.save()
  147. await UserBalanceService.modifiyBalance({
  148. userId: order.userId,
  149. amount: order.amount,
  150. type: BalanceRecordType.Recharge
  151. })
  152. }
  153. } catch (error) {
  154. Logger.error(error)
  155. }
  156. }
  157. return 'SUCCESS'
  158. }
  159. }