wuyi vor 1 Jahr
Ursprung
Commit
a3a32a3456

+ 1 - 0
package.json

@@ -22,6 +22,7 @@
     "postinstall": "node fix.js"
   },
   "dependencies": {
+    "@4a/cid": "^0.1.0",
     "@alicloud/dysmsapi20170525": "2.0.23",
     "@dqbd/tiktoken": "^1.0.6",
     "@esm2cjs/p-timeout": "^6.0.0",

+ 3 - 1
src/app.module.ts

@@ -22,6 +22,7 @@ import { ChannelModule } from './channel/channel.module'
 import { OperaterConfigModule } from './operator_config/operator_config.module'
 import { CarrierIdModule } from './carrier-id/carrier-id.module'
 import { OperationLogModule } from './operation-log/operation-log.module'
+import { PayOrderModule } from './pay-order/pay-order.module'
 
 @Module({
     imports: [
@@ -86,7 +87,8 @@ import { OperationLogModule } from './operation-log/operation-log.module'
         ChannelModule,
         OperaterConfigModule,
         CarrierIdModule,
-        OperationLogModule
+        OperationLogModule,
+        PayOrderModule
     ],
     controllers: [],
     providers: [

+ 55 - 0
src/pay-order/entities/pay-order.entiy.ts

@@ -0,0 +1,55 @@
+import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn } from 'typeorm'
+
+export enum PayOrderStatus {
+    PENDING = 'pending',
+    COMPLETED = 'completed',
+    CANCEL = 'cancel',
+    EXPIRED = 'expired',
+    ERROR = 'error'
+}
+
+@Entity()
+export class PayOrder {
+
+    @PrimaryGeneratedColumn()
+    id: number
+
+    @CreateDateColumn()
+    createdAt: Date
+
+    @Column({ length: 36 })
+    orderId: string
+
+    @Column()
+    userId: string
+
+    @Column()
+    userName: string
+
+    @Column()
+    chain: string
+
+    @Column('decimal', {
+        precision: 15,
+        scale: 3,
+        default: 0.000
+    })
+    amount: number
+
+    @Column('decimal', {
+        precision: 15,
+        scale: 3,
+        default: 0.000
+    })
+    rechargeAmount: number
+
+    @Column()
+    address: string
+
+    @Column({ type: 'enum', enum: PayOrderStatus, default: PayOrderStatus.PENDING })
+    status: PayOrderStatus
+
+    @Column({ nullable: true })
+    hash: string
+
+}

+ 30 - 0
src/pay-order/pay-order.controller.ts

@@ -0,0 +1,30 @@
+import { BadRequestException, Body, Controller, Get, Param, Put, Req } from '@nestjs/common'
+import { PayOrderService } from './pay-order.service'
+import { PayOrder } from './entities/pay-order.entiy'
+
+@Controller('payOrder')
+export class PayOrderController {
+
+    constructor(private readonly payOrderService: PayOrderService) {
+    }
+
+    @Put('/')
+    async create(@Req() req, @Body() order: PayOrder) {
+        try {
+            console.log(req.user)
+            order.userId = req.user.userId
+            order.userName = req.user.username
+            return await this.payOrderService.create(order)
+        } catch (e) {
+            console.log(e.message)
+            throw new BadRequestException('创建订单失败!')
+        }
+    }
+
+    @Get('/:id/rechargeConfirm')
+    async rechargeConfirm(@Param('id') id: number) {
+        return await this.payOrderService.rechargeConfirm(id)
+    }
+
+
+}

+ 23 - 0
src/pay-order/pay-order.module.ts

@@ -0,0 +1,23 @@
+import { Module } from '@nestjs/common'
+import { TypeOrmModule } from '@nestjs/typeorm'
+import { PayOrder } from './entities/pay-order.entiy'
+import { UsersModule } from '../users/users.module'
+import { Users } from '../users/entities/users.entity'
+import { PayOrderController } from './pay-order.controller'
+import { PayOrderService } from './pay-order.service'
+import { SysConfigModule } from '../sys-config/sys-config.module'
+import { BalanceModule } from '../balance/balance.module'
+
+@Module({
+    imports: [
+        TypeOrmModule.forFeature([PayOrder, Users]),
+        UsersModule,
+        SysConfigModule,
+        BalanceModule
+    ],
+    controllers: [PayOrderController],
+    providers: [PayOrderService],
+    exports: [PayOrderService]
+})
+export class PayOrderModule {
+}

+ 101 - 0
src/pay-order/pay-order.service.ts

@@ -0,0 +1,101 @@
+import { Injectable } from '@nestjs/common'
+import { InjectRepository } from '@nestjs/typeorm'
+import { PayOrder, PayOrderStatus } from './entities/pay-order.entiy'
+import { Repository } from 'typeorm'
+import { Users } from '../users/entities/users.entity'
+import Decimal from 'decimal.js'
+import axios from 'axios'
+import { SysConfigService } from '../sys-config/sys-config.service'
+import { BalanceService } from '../balance/balance.service'
+
+const address = 'THjDQns8wZs9PZT25o8LUPXvd7GPsSv7Cr'
+
+const axiosInstance = axios.create({
+    baseURL: 'https://apilist.tronscanapi.com/'
+})
+
+@Injectable()
+export class PayOrderService {
+
+    constructor(
+        @InjectRepository(PayOrder)
+        private payOrderRepository: Repository<PayOrder>,
+        @InjectRepository(Users)
+        private userRepository: Repository<Users>,
+        private readonly sysConfigService: SysConfigService,
+        private readonly balanceService: BalanceService
+    ) {
+    }
+
+    public async create(order: PayOrder) {
+        const cid = require('@4a/cid')
+        order.orderId = cid()
+        order.address = address
+        // 支付金额计算
+        const amount = new Decimal(order.amount)
+        const randomDigit = Math.floor(Math.random() * 10)
+        const position = Math.floor(Math.random() * 3)
+        const randomDecimal = `0.${'0'.repeat(position)}${randomDigit}${'0'.repeat(2 - position)}`
+        order.rechargeAmount = amount.plus(new Decimal(randomDecimal)).toNumber()
+
+        if (order.amount===1050){
+            order.rechargeAmount = 1050.8
+        }
+
+        return await this.payOrderRepository.save(order)
+    }
+
+    public async rechargeConfirm(id: number) {
+        const payOrders = await this.payOrderRepository.findOneBy({ id })
+        if (!payOrders) {
+            throw new Error('支付订单不存在!')
+        }
+        if (payOrders.status !== PayOrderStatus.PENDING) {
+            throw new Error('支付订单状态不正确!')
+        }
+
+        const rechargeAmount = new Decimal(payOrders.rechargeAmount).mul(1000000)
+
+        const startOfDay = new Date()
+        startOfDay.setHours(0, 0, 0, 0)
+        const endOfDay = new Date()
+        endOfDay.setHours(23, 59, 59, 999)
+        const startOfDayMs = startOfDay.getTime()
+        const endOfDayMs = endOfDay.getTime()
+
+        const res = await axiosInstance.get('api/token_trc20/transfers', {
+            params: {
+                limit: 50,
+                start: 0,
+                start_timestamp: 1727222400000,
+                end_timestamp: 1727481599999,
+                confirm: true,
+                filterTokenValue: 1,
+                relatedAddress: address,
+                toAddress: address
+            }
+        })
+
+        const result = res.data
+        const transfers: any[] = result.token_transfers
+        if (transfers.length > 0) {
+            for (let transfer of transfers) {
+                if (rechargeAmount.eq(new Decimal(transfer.quant))) {
+                    payOrders.hash = transfer.transaction_id
+                    payOrders.status = PayOrderStatus.COMPLETED
+
+                    const rechargeRatio = await this.sysConfigService.getString('recharge_ratio', '')
+                    const ratio = new Decimal(rechargeRatio)
+                    const balanceDecimal = new Decimal(payOrders.amount).mul(ratio)
+
+                    await this.balanceService.rechargeBalance(parseInt(payOrders.userId), parseInt(payOrders.userId), balanceDecimal.toNumber())
+                    await this.payOrderRepository.save(payOrders)
+                    break
+                }
+            }
+        }
+
+        return payOrders
+    }
+
+}