UserBalancesController.ts 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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 } 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. export default class UserBalancesController {
  16. private paginationService = new PaginationService(UserBalance)
  17. public async index({ request }: HttpContextContract) {
  18. return await this.paginationService.paginate(request.all())
  19. }
  20. public async store({ request }: HttpContextContract) {
  21. const data: any = await request.validate({
  22. schema: schema.create({
  23. userId: schema.number(),
  24. balance: schema.string()
  25. })
  26. })
  27. const userBalance = await UserBalance.create(data)
  28. return userBalance
  29. }
  30. public async show({ params, bouncer }: HttpContextContract) {
  31. const row = await UserBalanceService.getBalance(params.id)
  32. await bouncer.authorize('owner', row)
  33. return row
  34. }
  35. public async update({ params, request }: HttpContextContract) {
  36. const userBalance = await UserBalance.findOrFail(params.id)
  37. const data: any = await request.validate({
  38. schema: schema.create({
  39. userId: schema.number.optional(),
  40. amount: schema.number.optional(),
  41. type: schema.string.optional(),
  42. description: schema.string.optional()
  43. })
  44. })
  45. userBalance.merge(data)
  46. await userBalance.save()
  47. return userBalance
  48. }
  49. public async destroy({ params }: HttpContextContract) {
  50. const userBalance = await UserBalance.findOrFail(params.id)
  51. await userBalance.delete()
  52. }
  53. // public async recharge({ request }: HttpContextContract) {
  54. // console.log(JSON.stringify(request.all(), null, 4))
  55. // UserBalanceService.modifiyBalance({
  56. // userId: parseInt(request.param('userId')),
  57. // amount: new Decimal(request.input('id')),
  58. // type: BalanceRecordType.Recharge
  59. // })
  60. // const data = request.all()
  61. // return {
  62. // ok: true,
  63. // data: {
  64. // id: data.id,
  65. // latest_receipt: true,
  66. // transaction: data.transaction
  67. // }
  68. // }
  69. // }
  70. public async recharge({ request }: HttpContextContract) {
  71. const head = {
  72. mchtId: '2000713000197336',
  73. version: '20',
  74. biz: 'qr101'
  75. }
  76. const body = {
  77. orderId: new Date().getTime() + '',
  78. orderTime: format(new Date(), 'yyyyMMddHHmmss'),
  79. amount: '100',
  80. currencyType: 'IDR',
  81. goods: 'recharge',
  82. notifyUrl: 'https://kaliartdrama.run.place/api/userBalances/rechargeNotify',
  83. callBackUrl: 'https://www.baidu.com',
  84. email: 'abc@example.com',
  85. phone: '+006281234321234',
  86. name: 'zhangsan'
  87. }
  88. const str = qs.stringify(body, {
  89. encode: false,
  90. sort: (a, b) => {
  91. return a.localeCompare(b)
  92. }
  93. })
  94. Logger.info('param string=%s', str)
  95. const md5 = createHash('md5')
  96. const sign = md5.update(str + '&key=5cde8dfe0c894429bb6b86ec05f8406f').digest('hex')
  97. Logger.info('sign=%s', sign)
  98. const res = await axios.post('https://pre.pay.haodamall.com/gateway/api/commPay', {
  99. head,
  100. body,
  101. sign
  102. })
  103. Logger.info('res=%s', JSON.stringify(res.data, null, 4))
  104. if (res.data.head.respCode === '0000') {
  105. return res.data.body
  106. } else {
  107. throw new Exception(res.data.head.respMsg)
  108. }
  109. }
  110. public async rechargeNotify({ request }: HttpContextContract) {
  111. const data = request.all()
  112. Logger.info('rechargeNotify', data)
  113. }
  114. }