Ver código fonte

Merge branch 'main' into noah

zerogo 5 meses atrás
pai
commit
7ad75beb5f

+ 1 - 1
src/modules/api/config.ts

@@ -16,7 +16,7 @@ export default () => {
     // 模块加载顺序,默认为0,值越大越优先加载
     order: 0,
     // app参数配置允许读取的key
-    allowKeys: [],
+    // allowKeys: [],
     // jwt 生成解密token的
     // jwt: {
     //   // 单点登录

+ 22 - 0
src/modules/api/controller/admin/openTransaction.ts

@@ -0,0 +1,22 @@
+import { CoolController, BaseController } from '@cool-midway/core';
+import { OpenPaymentOrderEntity } from '../../entity/open_payment_order';
+import { Context } from '@midwayjs/koa';
+import { Provide } from '@midwayjs/core';
+/**
+ * 开发接口的流水订单
+ */
+@Provide()
+@CoolController({
+  api: ['add', 'delete', 'update', 'info', 'list', 'page'],
+  entity: OpenPaymentOrderEntity,
+  pageQueryOp: {
+    where: async (ctx: Context) => {
+      const { merchant, roleId } = ctx.admin;
+      if ([1, 3].includes(roleId)) {
+        return [['mchId=:mchId', { mchId: merchant.mchId }]];
+      }
+      return [];
+    },
+  },
+})
+export class OpenTransactionController extends BaseController {}

+ 37 - 0
src/modules/api/controller/transaction.ts

@@ -0,0 +1,37 @@
+import { CoolController, BaseController } from '@cool-midway/core';
+import { ALL, Body, Get, Inject, Post, Provide, Query } from '@midwayjs/decorator';
+import { OpenPaymentOrderEntity } from '../entity/open_payment_order';
+import { InjectEntityModel } from '@midwayjs/typeorm';
+import { Equal, Repository } from 'typeorm';
+import { OrderType } from '../entity/open_payment_order'
+
+/**
+ * 交易列表
+ */
+@Provide()
+@CoolController('/api/transaction')
+export class TransactionController extends BaseController {
+  @InjectEntityModel(OpenPaymentOrderEntity)
+  transactionEntity: Repository<OpenPaymentOrderEntity>;
+  /**
+   * 获取交易列表
+   * /api/transaction/page
+   */
+  @Get('/page', { summary: '获取交易列表' })
+  async getTransactionPage(
+    @Query('mch_id') mch_id: string,
+    @Query('order_type') order_type: string,
+    @Query('status') status: string,
+    @Query('keyWord') keyWord: string,) {
+    console.log('获取交易列表-=-=-=-=999')
+    const result = this.transactionEntity.find({
+      where: {
+        status: status,
+        mch_id: mch_id,
+        order_type: OrderType[order_type],
+        // keyWord: keyWord,
+      },
+    });
+    return result
+  }
+}

+ 1 - 0
src/modules/api/entity/open_payment_order.ts

@@ -75,4 +75,5 @@ export enum OrderType {
   PAYMENT = 'PAYMENT', // 付款
   TRANSFER = 'TRANSFER', // 转账
   DEPOSIT = 'DEPOSIT', // 入账
+  TRANSACTION_FEE_ORDER = 'TRANSACTION_FEE_ORDER', // 交易手续费订单
 }

+ 9 - 4
src/modules/api/middleware/authority.ts

@@ -68,9 +68,14 @@ export class BaseAuthorityMiddleware
           ? /* ctx?.request.query */ ''
           : ctx?.request.body;
       const merchantInfo = await this.merchantEntity.findOne({
-        where: {
-          apiSecret: `${vaKey}`,
-        },
+        where: [
+          {
+            apikey: `${vaKey}`,
+          },
+          {
+            apiSecret: `${vaKey}`,
+          },
+        ],
       });
       let customer = await this.customerEntity.findOne({
         where: {
@@ -126,7 +131,7 @@ export class BaseAuthorityMiddleware
         `${vaTimestamp}`,
         `${vaNonce}`,
         JSON.stringify(params),
-        `${vaKey}`
+        `${merchantInfo.apiSecret}`
       );
 
       if (`${sign}`.toLocaleUpperCase() !== `${vaSign}`.toLocaleUpperCase()) {

+ 68 - 10
src/modules/api/service/open.ts

@@ -1,5 +1,5 @@
 import { BaseService, CoolTransaction } from '@cool-midway/core';
-import { ILogger, Inject, Provide } from '@midwayjs/core';
+import { ILogger, Init, Inject, Provide } from '@midwayjs/core';
 import { InjectEntityModel } from '@midwayjs/typeorm';
 import { OpenUserEntity } from '../entity/open_user';
 import * as crypto from 'crypto';
@@ -10,6 +10,7 @@ import {
 } from '../entity/open_payment_order';
 import { OpenPaymentAccountEntity } from '../entity/open_payment_account';
 import { EasyPayAdapter } from '../../payment/adapter/easypay.adapter';
+import * as md5 from 'md5';
 
 /**
  * 描述
@@ -31,10 +32,18 @@ export class EasyOpenService extends BaseService {
   @Inject()
   easyPayAdapter: EasyPayAdapter;
 
+
   @Inject()
   ctx;
 
-  /* 
+  @Init()
+  async init() {
+    // await super.init();
+    // this.setEntity(this.businessEntity);
+    this.easyPayAdapter.Init()
+  }
+
+  /*
     记录用户的数据来源
     */
   async save_user(userInfo, params) {
@@ -53,7 +62,7 @@ export class EasyOpenService extends BaseService {
     }
   }
 
-  /* 
+  /*
     记录用户的收款账户数据来源
     */
   async save_user_account(userInfo, params) {
@@ -73,52 +82,66 @@ export class EasyOpenService extends BaseService {
     }
   }
 
-  /* 
+  /*
     记录用户的订单数据来源
   */
-  async save_user_order(orderInfo, params, type: OrderType) {
+  async save_user_order(orderInfo, params, type: OrderType, baseOrderInfo?:any) {
     try {
       let openOrderObj: any = {
         mch_id: this.ctx.admin.merchant.mchId,
         account_id: params.account_id,
-        request_id: params.payment.request_id,
+        request_id: params?.payment?.request_id,
         order_type: type,
         additional_info: {
           orderInfo,
           params,
           type,
+          baseOrderInfo // 当发生流水交易时,记录原始订单,做后续的退款操作
         },
       };
 
       // 收单支付订单
       if (OrderType.ACQUIRING_PAYMENT === type) {
-        openOrderObj.amount = params.payment.amount;
+        openOrderObj.request_id = params?.request_id;
+        openOrderObj.amount = params.payment.amount - this.getTotransfersAmount(params.payment.amount);
         openOrderObj.currency = params.payment.currency;
       }
 
       // 收单退款订单
       if (OrderType.ACQUIRING_REFUND === type) {
+        openOrderObj.request_id = params?.request_id;
         openOrderObj.amount = params.refund.amount;
         openOrderObj.currency = params.refund.currency;
       }
 
       // 换汇
       if (OrderType.CURRENCY_EXCHANGE === type) {
-        openOrderObj.amount = params.sell_amount; // 卖出金额
+        openOrderObj.request_id = params?.request_id;
+        openOrderObj.amount = params.sell_amount - this.getTotransfersAmount(params.sell_amount); // 卖出金额
         openOrderObj.currency = params.sell_currency; // 卖出币种
-
         openOrderObj.target_amount = params.buy_amount; // 买入金额
         openOrderObj.target_currency = params.buy_currency; // 买入币种
       }
 
       // 付款
       if (OrderType.PAYMENT === type) {
-        openOrderObj.amount = params.amount;
+        openOrderObj.amount = params.amount - this.getTotransfersAmount(params.amount);
         openOrderObj.currency = params.currency;
+        openOrderObj.request_id = params?.request_id;
       }
 
       // 转账
       if (OrderType.TRANSFER === type) {
+        openOrderObj.amount = params.amount - this.getTotransfersAmount(params.amount);
+        openOrderObj.currency = params.currency;
+        openOrderObj.from_account_id = params.from_account_id;
+        openOrderObj.to_account_id = params.to_account_id;
+        openOrderObj.request_id = params?.request_id;
+      }
+
+      // 流水的转账
+      if (OrderType.TRANSACTION_FEE_ORDER === type) {
+        openOrderObj.request_id = params?.request_id;
         openOrderObj.amount = params.amount;
         openOrderObj.currency = params.currency;
         openOrderObj.from_account_id = params.from_account_id;
@@ -132,6 +155,10 @@ export class EasyOpenService extends BaseService {
       // }
 
       await this.openPaymentOrderEntity.insert(openOrderObj);
+      // 如果不是流水交易和退款交易的话,进行费率扣除
+      if(type !== OrderType.TRANSACTION_FEE_ORDER && OrderType.ACQUIRING_REFUND !== type) {
+        await this.capturedTransferStream(openOrderObj, type)
+      }
 
       /* 更新相关订单信息 */
 
@@ -148,6 +175,7 @@ export class EasyOpenService extends BaseService {
         await this.openPaymentOrderEntity.update(paymentOrder, {
           status: 'REFUNDED',
         });
+        // TODO 取消流水利润 退回原帐户
       }
       this.logger.info(
         `save_user_order 商户: ${this.ctx.admin.merchant.mchId}; userInfo${JSON.stringify(orderInfo)} params${JSON.stringify(params)}`
@@ -156,6 +184,36 @@ export class EasyOpenService extends BaseService {
       this.logger.error('save_user_order:error: ', error);
     }
   }
+  createRequest_id(openOrderObj) {
+    md5(JSON.stringify({
+        mch_id: openOrderObj.mchId,
+        account_id: openOrderObj.account_id,
+        request_id: openOrderObj.request_id,
+    }))
+  }
+  getTotransfersAmount(amount) {
+    const rate = this.ctx.admin.merchant.baseRate / 100;
+    const result = Math.round(amount * rate * 100) / 100;
+    return result;
+  }
+  // 截取流水的转账
+  async capturedTransferStream(openOrderObj, type) {
+    // /v1/transfers
+    const params = {
+      // ...openOrderObj,
+      request_id: this.createRequest_id(openOrderObj),
+      from_account_id: openOrderObj.account_id,
+      to_account_id: this.easyPayAdapter.baseInfo.account_id,
+      currency: openOrderObj.currency,
+      amount: this.getTotransfersAmount(openOrderObj.amount),
+      purpose: "收取手续费用"
+    }
+    // 截取流水的转账
+    const res = await this.easyPayAdapter.request("POST", "/v1/transfers", params);
+    // 记录流水
+    await this.save_user_order(res, params, OrderType.TRANSACTION_FEE_ORDER, openOrderObj);
+  }
+
 
   createSign(params, timestamp, nonce, secret) {
     // 2. 生成签名

+ 12 - 1
src/modules/payment/adapter/easypay.adapter.ts

@@ -96,6 +96,8 @@ export class EasyPayAdapter {
   @Inject()
   logger: ILogger;
 
+
+
   private config: {
     apiKey: string;
     apiSecret: string;
@@ -106,6 +108,14 @@ export class EasyPayAdapter {
     tokenManager: TokenManager;
   };
 
+  baseInfo: {
+    account_id?: string
+  }
+
+
+  Init() {
+    this.initConfig()
+  }
   /**
    * 初始化渠道配置
    */
@@ -132,6 +142,7 @@ export class EasyPayAdapter {
         chainApiUrl: channel.chainApiUrl,
         tokenManager: tokenManager,
       };
+      this.baseInfo = channel.config
     }
   }
 
@@ -165,7 +176,7 @@ export class EasyPayAdapter {
       // console.log('response', response.data.data);
       return response.data.data;
     } catch (error) {
-      
+
       // console.log(error.response.data);
       if (axios.isAxiosError(error) && error.response) {
         // console.log(error.response.data);

+ 6 - 0
src/modules/payment/entity/merchant.ts

@@ -21,6 +21,12 @@ export class MerchantEntity extends BaseEntity {
   @Column({ comment: '邮箱' })
   email: string;
 
+  @Column({ comment: '基础费率' })
+  baseRate: number;
+
+  @Column({ comment: 'API Secret', default: '' , nullable: true})
+  apikey!: string;
+
   @Column({ comment: 'API Secret', default: '' , nullable: true})
   apiSecret!: string;
 

+ 10 - 0
src/modules/payment/service/merchant.ts

@@ -49,6 +49,11 @@ export class MerchantService extends BaseService {
       ...param,
       userId,
       apiSecret: apiSecretParams,
+      apikey:  crypto
+        .createHash('md5')
+        .update(apiSecretParams)
+        .digest('hex')
+        .toUpperCase()
     });
 
     return param.id;
@@ -119,6 +124,11 @@ export class MerchantService extends BaseService {
       mchId: params.mchId
     })
     merchant.apiSecret = this.generateSignature(`${JSON.stringify(params)}`)
+    merchant.apikey = crypto
+      .createHash('md5')
+      .update(merchant.apiSecret)
+      .digest('hex')
+      .toUpperCase();
     await this.merchantEntity.save(merchant)
     return merchant
   }