Преглед изворни кода

feat(payment): 添加统一的退款接口,实现余额退款

runphp пре 6 месеци
родитељ
комит
fe127a239b
3 измењених фајлова са 41 додато и 10 уклоњено
  1. 9 6
      src/Controller/LogController.php
  2. 1 1
      src/Entity/ExtensionBalpayLogEntity.php
  3. 31 3
      src/PaymentProvider.php

+ 9 - 6
src/Controller/LogController.php

@@ -1,27 +1,30 @@
 <?php
 declare(strict_types=1);
+
 namespace SixShop\Balpay\Controller;
 
 
-use SixShop\Core\Helper;
-use SixShop\Core\Request;
 use SixShop\Balpay\Entity\ExtensionBalpayLogEntity;
 use SixShop\Balpay\Enum\BalpayLogTypeEnum;
+use SixShop\Core\Request;
 use SixShop\System\Middleware\MacroPageMiddleware;
 use think\Response;
+use function SixShop\Core\page_response;
+use function SixShop\Core\success_response;
 
 class LogController
 {
     protected array $middleware = [
         MacroPageMiddleware::class
     ];
+
     public function index(Request $request, ExtensionBalpayLogEntity $entity): Response
     {
         $data = $request->get([
             'user_id/d' => 0,
-            'type/d' =>  0,
+            'type/d' => 0,
         ]);
-        return Helper::page_response($entity->getList($data['user_id'], BalpayLogTypeEnum::tryFrom($data['type']), $request->pageAndLimit()));
+        return page_response($entity->getList($data['user_id'], BalpayLogTypeEnum::tryFrom($data['type']), $request->pageAndLimit()));
     }
 
     public function save(Request $request, ExtensionBalpayLogEntity $entity): Response
@@ -48,12 +51,12 @@ class LogController
             'type.in' => '类型必须为1或2',
             'description.require' => '描述不能为空',
         ])->check($data);
-        $entity->add(
+        $entity->change(
             $data['user_id'],
             $data['amount'],
             BalpayLogTypeEnum::from($data['type']),
             $data['description']
         );
-        return Helper::success_response($entity);
+        return success_response($entity);
     }
 }

+ 1 - 1
src/Entity/ExtensionBalpayLogEntity.php

@@ -15,7 +15,7 @@ use think\Paginator;
 class ExtensionBalpayLogEntity extends BaseEntity
 {
 
-    public function add(int $userID, float $amount, BalpayLogTypeEnum $type, string $description, int $orderID = 0)
+    public function change(int $userID, float $amount, BalpayLogTypeEnum $type, string $description, int $orderID = 0): void
     {
         $user = User::find($userID);
         if (!$user) {

+ 31 - 3
src/PaymentProvider.php

@@ -11,12 +11,17 @@ use SixShop\Payment\Contracts\PaymentNotifyResult;
 use SixShop\Payment\Contracts\PaymentProviderInterface;
 use SixShop\Payment\Contracts\PaymentQueryResult;
 use SixShop\Payment\Contracts\PaymentRefundQueryResult;
+use SixShop\Payment\Contracts\PaymentRefundRequest;
 use SixShop\Payment\Contracts\PaymentRefundResult;
 use SixShop\Payment\Contracts\PaymentResponse;
 use SixShop\Payment\Entity\ExtensionPaymentEntity;
+use SixShop\Payment\Entity\ExtensionRefundEntity;
 use SixShop\Payment\Enum\PaymentBizEnum;
 use SixShop\Payment\Enum\PaymentStatusEnum;
+use SixShop\Payment\Enum\RefundStatusEnum;
 use SixShop\Payment\Event\PaymentSuccessEvent;
+use SixShop\Payment\Event\RefundSuccessEvent;
+use think\facade\Db;
 use think\facade\Event;
 
 class PaymentProvider implements PaymentProviderInterface
@@ -26,6 +31,7 @@ class PaymentProvider implements PaymentProviderInterface
     public function __construct(
         private readonly ExtensionBalpayLogEntity $logEntity,
         private readonly ExtensionPaymentEntity   $extensionPaymentEntity,
+        private readonly ExtensionRefundEntity  $extensionRefundEntity,
     )
     {
     }
@@ -51,7 +57,7 @@ class PaymentProvider implements PaymentProviderInterface
                 'amount' => $order['pay_amount'],
                 'status' => PaymentStatusEnum::SUCCESS,
             ]);
-            $this->logEntity->add(
+            $this->logEntity->change(
                 $order['user_id'],
                 (float)$order['pay_amount'],
                 BalpayLogTypeEnum::CONSUMTION,
@@ -77,9 +83,31 @@ class PaymentProvider implements PaymentProviderInterface
 
     }
 
-    public function refund(array $refund): PaymentRefundResult
+    public function refund(int $recordID, PaymentRefundRequest $param): PaymentRefundResult
     {
-        throw new \Exception('未实现refund方法');
+        $payment = $this->extensionPaymentEntity->find($recordID);
+        $reund = Db::transaction(function () use ($payment, $param) {
+            $reund = $this->extensionRefundEntity->create([
+                'payment_id' => $payment->id,
+                'order_sn' => $payment->out_trade_no,
+                'reason' => $param->getReason(),
+                'amount' => $param->getAmount(),
+                'status' => RefundStatusEnum::SUCCESS,
+                'status_desc' => '已经退款到用户余额',
+            ]);
+            $this->logEntity->change(
+                $payment->user_id,
+                $param->getAmount(),
+                BalpayLogTypeEnum::REFUND,
+                sprintf('订单退款成功,订单编号:%s', $payment->order_sn),
+                $payment->order_id
+            );
+            // 余额退款直接成功
+            Event::trigger(new RefundSuccessEvent($reund));
+            return $reund;
+        });
+
+        return new PaymentRefundResult($reund);
     }
 
     public function refundQuery(string $refundNo): PaymentRefundQueryResult