wesmiler hai 2 meses
pai
achega
dd28edb2f7

+ 36 - 0
app/Console/Commands/SwooleTask.php

@@ -251,6 +251,31 @@ class SwooleTask extends Command
             }
         });
 
+        // 充值订单支付成功下单失败退款
+        \swoole_timer_tick(20000, function ($timer) use ($serv, &$time) { // 启用定时器,每20秒执行一次
+            $date = date('Y-m-d H:i:s');
+            $orders = PayOrdersService::make()->getFailedOrderList();
+            if($orders){
+                foreach ($orders as $k => $item){
+                    if(!RedisService::get('caches:task:lock:order_failed_loaded_'.$k)){
+                        $taskData = [
+                            'taskName' => 'failedOrderRefund',
+                            'name' => "充值订单下单失败退款",
+                            'date' => date('Y-m-d'),
+                            'params'=> $item,
+                        ];
+                        $res = $serv->task($taskData);
+                        RedisService::set('caches:task:lock:order_failed_loaded_'.$k, true, rand(3,5));
+                        echo "[Task failedOrderRefund {$date}] 充值订单下单失败退款结果:{$res}\n";
+                    }else{
+                        echo "[Task failedOrderRefund {$date}] 充值订单下单失败退款间隔时间调用\n";
+                    }
+                }
+            }else{
+                echo "[Task failedOrderRefund {$date}] 暂无可退款的充值订单\n";
+            }
+        });
+
         // 订单自动收货
         \swoole_timer_tick(10000, function ($timer) use ($serv, &$time) { // 启用定时器,每10秒执行一次
             $date = date('Y-m-d H:i:s');
@@ -309,6 +334,17 @@ class SwooleTask extends Command
         $params = isset($data['params']) ? $data['params'] : [];
         try {
             switch ($taskName) {
+                case 'failedOrderRefund': // 支付成功下单失败退款
+                    // 调用处理
+                    if($res = PayOrdersService::make()->failedOrderRefund($params)){
+                        $res = is_array($res) && $res? json_encode($res, 256) : 'success';
+                        echo "[Task {$taskName} {$date}][{$task_id}] 充值订单下单失败退款处理结果:{$res}\n";
+                    }else{
+                        $error = PayOrdersService::make()->getError();
+                        $error = $error? lang($error) : 'failed';
+                        echo "[Task {$taskName} {$date}][{$task_id}] 充值订单下单失败退款处理结果:{$error}\n";
+                    }
+                    break;
                 case 'checkOrder': // 更新状态
                     // 调用处理
                     if($res = PayOrdersService::make()->checkOrder($params)){

+ 58 - 0
app/Services/Common/PayOrdersService.php

@@ -221,6 +221,64 @@ class PayOrdersService extends BaseService
     }
 
     /**
+     * 已支付充值失败退款失败订单
+     * @return array|mixed
+     */
+    public function getFailedOrderList()
+    {
+        $cacheKey = "caches:orders:failedList";
+        $datas = RedisService::get($cacheKey);
+        if ($datas) {
+            return $datas;
+        }
+
+        $datas = $this->model->where(['refund_status'=>3,'status'=>5,'mark' => 1])
+            ->select(['id', 'order_no', 'transaction_id', 'pay_total as money', 'status'])
+            ->orderBy('id', 'desc')
+            ->limit(500)
+            ->get()
+            ->keyBy('order_no');
+        $datas = $datas ? $datas->toArray() : [];
+        if ($datas) {
+            $datas = array_chunk($datas, 100);
+            RedisService::set($cacheKey, $datas, rand(20, 30));
+        }
+
+        return $datas;
+    }
+
+    /**
+     * 充值订单退款(补充处理)
+     * @param $orders
+     * @return array
+     * @throws \Yansongda\Pay\Exception\ContainerException
+     * @throws \Yansongda\Pay\Exception\InvalidParamsException
+     * @throws \Yansongda\Pay\Exception\ServiceNotFoundException
+     */
+    public function failedOrderRefund($orders)
+    {
+        $success = [];
+        if ($orders) {
+            foreach ($orders as $order) {
+                $total = isset($order['money']) ? $order['money'] : 0;
+                $refundStatus = PaymentService::make()->refund($order, 'pay');
+                $updateData = ['refund_status' => $refundStatus ? 1 : 3, 'status' => 5, 'failed_remark' => '充值失败原路退款','refund_remark'=>PaymentService::make()->getError(), 'refund_money' => $refundStatus ? $total : 0,'refund_at'=>date('Y-m-d H:i:s'), 'update_time' => time()];
+                if (!PayOrdersModel::where(['id' => $order['id']])->update($updateData)) {
+                    $errors[$order['order_no']] = '充值失败退款处理失败';
+                } else {
+                    $success[$order['order_no']] = "退款{$total}成功";
+                    $errors[$order['order_no']] = $refundStatus ? '充值失败原路退款' : '充值失败退款失败';
+                }
+
+                sleep(2);
+            }
+        }
+
+        $this->error = '充值订单退款处理成功';
+        return ['success' => $success, 'errors' => $errors];
+    }
+
+    /**
      * 验证订单状态
      * @param $orders
      * @return array

+ 2 - 1
app/Services/PaymentService.php

@@ -593,9 +593,10 @@ class PaymentService extends BaseService
 
                         // 退款
                         $orderInfo['money'] = $payTotal;
+                        $orderInfo['transaction_id'] = $transactionId;
                         $orderInfo['remark'] = '充值失败退款';
                         $refundStatus = PaymentService::make()->refund($orderInfo,'pay');
-                        $updateData = ['refund_status'=> $refundStatus?1:3,'status'=>5,'result'=>json_encode(['amount'=>$amount,'params'=>$params,'result'=>$result],256),'failed_remark'=> $errmsg,'refund_at'=>date('Y-m-d H:i:s'),'refund_money'=>$refundStatus?$payTotal:0,'update_time'=>time()];
+                        $updateData = ['refund_status'=> $refundStatus?1:3,'status'=>5,'result'=>json_encode(['amount'=>$amount,'params'=>$params,'msg'=>$this->error,'result'=>$result],256),'failed_remark'=> $errmsg,'refund_at'=>date('Y-m-d H:i:s'),'refund_money'=>$refundStatus?$payTotal:0,'update_time'=>time()];
                         $this->saveLog("caches:payments:notify_{$scene}:pay_failed_{$orderNo}_{$orderUserId}", ['error'=>$this->error,'update'=>$updateData,'order' => $orderInfo,'result'=>$result, 'notify' => $data]);
                         if(!PayOrdersModel::where(['id'=>$orderId])->update($updateData)){
                             $this->error = '订单退款状态更新错误~';