浏览代码

增加退款API

test 7 月之前
父节点
当前提交
f41a743403
共有 3 个文件被更改,包括 138 次插入3 次删除
  1. 17 1
      src/modules/dj/controller/admin/open.ts
  2. 111 0
      src/modules/dj/service/payRefund.ts
  3. 10 2
      src/modules/dj/service/refund.ts

+ 17 - 1
src/modules/dj/controller/admin/open.ts

@@ -28,6 +28,7 @@ import { KycService } from '../../service/kyc';
 import { RepayService } from '../../service/repay';
 import { WhiteIpMiddleware } from '../../middleware/whiteIp';
 import { KycOpenService } from '../../service/openKyc';
+import { PayRefundService } from '../../service/payRefund';
 
 @Provide()
 @CoolController()
@@ -58,7 +59,10 @@ export class PayOpenController extends BaseController {
   kycOpenService: KycOpenService;
 
   @Inject()
-  repayService: RepayService
+  repayService: RepayService;
+
+  @Inject()
+  payRefundService: PayRefundService;
 
   @Logger()
   logger: ILogger;
@@ -75,6 +79,18 @@ export class PayOpenController extends BaseController {
     return this.ok(await this.payService.query(payload));
   }
 
+  @CoolTag(TagTypes.IGNORE_TOKEN)
+  @Post('/refund/query', { summary: '退款查询' })
+  public async queryRefund(@Body(ALL) payload: any) {
+    return this.ok(await this.payRefundService.queryRefund(payload));
+  }
+
+  @CoolTag(TagTypes.IGNORE_TOKEN)
+  @Post('/refund', { summary: '退款' })
+  public async refund(@Body(ALL) payload: any) {
+    return this.ok(await this.payRefundService.refund(payload));
+  }
+
   @CoolTag(TagTypes.IGNORE_TOKEN)
   @Post('/withdraw', { summary: '发起代付', middleware: [WhiteIpMiddleware] })
   public async withdraw(@Body(ALL) payload: any) {

+ 111 - 0
src/modules/dj/service/payRefund.ts

@@ -0,0 +1,111 @@
+import { Inject, Logger, Provide } from '@midwayjs/decorator';
+import { BaseService } from '@cool-midway/core';
+import { ILogger } from '@midwayjs/logger';
+import { CoolCommException } from '@cool-midway/core';
+import * as _ from 'lodash';
+import { ChannelService } from './channel';
+import { MerchantService } from './merchant';
+import { DispatchService } from './channels/dispatch';
+import { Utils } from '../../../comm/utils';
+import * as md5 from 'md5';
+import { RateService } from './rate';
+import { MchChannelService } from './mchChannel';
+import { RefundService } from './refund';
+import { PayService } from './pay';
+import { OrderService } from './order';
+
+@Provide()
+export class PayRefundService extends BaseService {
+
+  @Inject()
+  orderService: OrderService;
+
+  @Inject()
+  payService: PayService;
+
+  @Inject()
+  merchantService: MerchantService;
+
+  @Inject()
+  refundService: RefundService;
+
+  @Inject()
+  dispatchService: DispatchService;
+
+  @Logger()
+  logger: ILogger;
+
+  @Inject()
+  utils: Utils;
+
+  async queryRefund(payload) {
+    try {
+      this.logger.info('退款查询', JSON.stringify(payload));
+      await this.validQueryParam(payload);
+      const merchant = await this.payService.validMerchant(payload.mchId);
+      await this.payService.validSign(payload, merchant);
+      const refund = await this.refundService.findByRefundNo(
+        payload.refundNo
+      );
+      if (!refund || refund.mchId !== payload.mchId) {
+        throw new Error('退款订单不存在');
+      }
+      return {
+        mchId: refund.mchId,
+        orderNo: refund.orderNo,
+        outOrderNo: refund.outOrderNo,
+        refundNo: refund.refundNo,
+        amount: refund.amount,
+        currency: refund.currency,
+        charge: refund.charge,
+        status: refund.status,
+        reson: refund.reson,
+        remark: refund.remark
+      };
+    } catch (err) {
+      this.logger.error('查询失败', JSON.stringify(payload), err.message);
+      throw new CoolCommException(err.message);
+    }
+  }
+
+  async validQueryParam(payload) {
+    if (_.isEmpty(payload.mchId)) {
+      throw new Error('商户号【mchId】不能为空');
+    }
+    if (_.isEmpty(payload.refundNo)) {
+      throw new Error('退款订单号【refundNo】不能为空');
+    }
+    if (_.isEmpty(payload.sign)) {
+      throw new Error('签名【sign】不能为空');
+    }
+  }
+
+  async refund(payload) {
+    try {
+      this.logger.info('退款下单', JSON.stringify(payload));
+      await this.validParam(payload);
+      const merchant = await this.payService.validMerchant(payload.mchId);
+      await this.payService.validSign(payload, merchant);
+      const order = await this.orderService.findByOrderNo(payload.orderNo);
+      if (!order || +order.status !== 1) {
+        throw new Error('订单不存在或订单状态非支付成功');
+      }
+      return await this.refundService.toRefund(order, order.amount, payload.reason || '');
+    } catch (err) {
+      this.logger.error('退款下单', JSON.stringify(payload), err.message);
+      throw new CoolCommException(err.message);
+    }
+  }
+
+  async validParam(payload) {
+    if (_.isEmpty(payload.mchId)) {
+      throw new Error('商户号【mchId】不能为空');
+    }
+    if (_.isEmpty(payload.orderNo)) {
+      throw new Error('平台订单号【orderNo】不能为空');
+    }
+    if (_.isEmpty(payload.sign)) {
+      throw new Error('签名【sign】不能为空');
+    }
+  }
+}

+ 10 - 2
src/modules/dj/service/refund.ts

@@ -34,6 +34,10 @@ export class RefundService extends BaseService {
   @Logger()
   logger: ILogger;
 
+  async findByRefundNo(refundNo: any) {
+    return await this.refundEntity.findOneBy({ refundNo });
+  }
+
   async toRefund(order, amount, reson) {
     const refund: any = {
       orderNo: order.orderNo,
@@ -76,12 +80,16 @@ export class RefundService extends BaseService {
       await this.refundEntity.update(refund.id, refund);
       this.startQueryRefund(refund.id);
       return {
-        outOrderNo: refund.outOrderNo,
+        mchId: refund.mchId,
         orderNo: refund.orderNo,
+        outOrderNo: refund.outOrderNo,
         refundNo: refund.refundNo,
         amount: refund.amount,
         currency: refund.currency,
-        status: refund.status
+        charge: refund.charge,
+        status: refund.status,
+        reson: refund.reson,
+        remark: refund.remark
       }
     } catch (err) {
       this.logger.error('发起退款失败', refund.orderNo, err.message);