import Logger from '@ioc:Adonis/Core/Logger' import type { HttpContextContract } from '@ioc:Adonis/Core/HttpContext' import UserBalance from 'App/Models/UserBalance' import PaginationService from 'App/Services/PaginationService' import { schema } from '@ioc:Adonis/Core/Validator' import UserBalanceService from 'App/Services/UserBalanceService' import Decimal from 'decimal.js' import { BalanceRecordType } from 'App/Models/BalanceRecord' import qs from 'qs' import { format } from 'date-fns' import { createHash } from 'crypto' import axios from 'axios' import { InternalServerException } from 'App/Exceptions/Common' import { Exception } from '@adonisjs/core/build/standalone' export default class UserBalancesController { private paginationService = new PaginationService(UserBalance) public async index({ request }: HttpContextContract) { return await this.paginationService.paginate(request.all()) } public async store({ request }: HttpContextContract) { const data: any = await request.validate({ schema: schema.create({ userId: schema.number(), balance: schema.string() }) }) const userBalance = await UserBalance.create(data) return userBalance } public async show({ params, bouncer }: HttpContextContract) { const row = await UserBalanceService.getBalance(params.id) await bouncer.authorize('owner', row) return row } public async update({ params, request }: HttpContextContract) { const userBalance = await UserBalance.findOrFail(params.id) const data: any = await request.validate({ schema: schema.create({ userId: schema.number.optional(), amount: schema.number.optional(), type: schema.string.optional(), description: schema.string.optional() }) }) userBalance.merge(data) await userBalance.save() return userBalance } public async destroy({ params }: HttpContextContract) { const userBalance = await UserBalance.findOrFail(params.id) await userBalance.delete() } // public async recharge({ request }: HttpContextContract) { // console.log(JSON.stringify(request.all(), null, 4)) // UserBalanceService.modifiyBalance({ // userId: parseInt(request.param('userId')), // amount: new Decimal(request.input('id')), // type: BalanceRecordType.Recharge // }) // const data = request.all() // return { // ok: true, // data: { // id: data.id, // latest_receipt: true, // transaction: data.transaction // } // } // } public async recharge({ request }: HttpContextContract) { const head = { mchtId: '2000713000197336', version: '20', biz: 'qr101' } const body = { orderId: new Date().getTime() + '', orderTime: format(new Date(), 'yyyyMMddHHmmss'), amount: '100', currencyType: 'IDR', goods: 'recharge', notifyUrl: 'https://kaliartdrama.run.place/api/userBalances/rechargeNotify', callBackUrl: 'https://www.baidu.com', email: 'abc@example.com', phone: '+006281234321234', name: 'zhangsan' } const str = qs.stringify(body, { encode: false, sort: (a, b) => { return a.localeCompare(b) } }) Logger.info('param string=%s', str) const md5 = createHash('md5') const sign = md5.update(str + '&key=5cde8dfe0c894429bb6b86ec05f8406f').digest('hex') Logger.info('sign=%s', sign) const res = await axios.post('https://pre.pay.haodamall.com/gateway/api/commPay', { head, body, sign }) Logger.info('res=%s', JSON.stringify(res.data, null, 4)) if (res.data.head.respCode === '0000') { return res.data.body } else { throw new Exception(res.data.head.respMsg) } } public async rechargeNotify({ request }: HttpContextContract) { const data = request.all() Logger.info('rechargeNotify', data) } }