wesmiler пре 3 месеци
родитељ
комит
4253c762bb
3 измењених фајлова са 107 додато и 0 уклоњено
  1. 21 0
      app/Http/Controllers/Api/v1/OrderController.php
  2. 85 0
      app/Services/Api/OrderService.php
  3. 1 0
      routes/api.php

+ 21 - 0
app/Http/Controllers/Api/v1/OrderController.php

@@ -103,4 +103,25 @@ class OrderController extends webApp
         }
     }
 
+    /**
+     * 支付
+     * @return array
+     */
+    public function pay()
+    {
+        $params = request()->all();
+        $id = isset($params['id'])? $params['id'] : 0;
+        try {
+            if (!$result = OrderService::make()->pay($this->userId, $id)) {
+                $error = OrderService::make()->getError();
+                return showJson($error, false, '', $error == 2206 ? '405' : -1);
+            } else {
+                return showJson(OrderService::make()->getError(), true, $result);
+            }
+        } catch (\Exception $exception) {
+            $error = ['data' => $exception->getTrace(), 'err' => $exception->getMessage()];
+            return showJson(1046, false, $error);
+        }
+    }
+
 }

+ 85 - 0
app/Services/Api/OrderService.php

@@ -330,6 +330,91 @@ class OrderService extends BaseService
         ];
     }
 
+    public function pay($userId, $id)
+    {
+        if ($id <= 0) {
+            $this->error = '请选择支付订单';
+            return false;
+        }
+
+        // 缓存锁
+        $cacheLockKey = "caches:orders:pay_lock:{$userId}_{$id}";
+        if (RedisService::get($cacheLockKey)) {
+            $this->error = '订单处理中~';
+            return false;
+        }
+
+        // 商品数据
+        RedisService::set($cacheLockKey, ['order_id' => $id, 'user_id' => $userId], rand(3, 5));
+
+        // 用户信息
+        $userInfo = MemberModel::where(['id' => $userId, 'mark' => 1])
+            ->select(['id', 'openid', 'mobile', 'nickname', 'realname', 'balance', 'status'])
+            ->first();
+        $status = isset($userInfo['status']) ? $userInfo['status'] : 0;
+        $openid = isset($userInfo['openid']) ? $userInfo['openid'] : '';
+        if (empty($userInfo) || $status != 1) {
+            $this->error = 1045;
+            RedisService::clear($cacheLockKey);
+            return false;
+        }
+
+        if (empty($openid)) {
+            $this->error = '用户微信未授权,请重新授权登录';
+            RedisService::clear($cacheLockKey);
+            return false;
+        }
+
+        // 订单信息
+        $info = $this->model->where(['id'=> $id,'mark'=>1])
+            ->select(['id','order_no','pay_total','status'])
+            ->first();
+        $orderTotal = isset($info['pay_total'])? $info['pay_total'] : 0;
+        $orderNo = isset($info['order_no'])? $info['order_no'] : '';
+        $status = isset($info['status'])? $info['status'] : 0;
+        if(empty($info) || empty($orderNo)){
+            $this->error = '订单信息不存在';
+            RedisService::clear($cacheLockKey);
+            return false;
+        }
+
+        if($status != 1){
+            $this->error = '订单已支付';
+            RedisService::clear($cacheLockKey);
+            return false;
+        }
+
+        // 获取支付参数
+        /* TODO 支付处理 */
+        $payOrder = [
+            'type' => 1,
+            'order_no' => $orderNo,
+            'pay_money' => $orderTotal,
+            'body' => '购物消费',
+            'openid' => $openid
+        ];
+
+        // 调起支付
+        $payment = PaymentService::make()->minPay($userInfo, $payOrder, 'store');
+        if (empty($payment)) {
+            DB::rollBack();
+            RedisService::clear($cacheLockKey);
+            $this->error = PaymentService::make()->getError();
+            return false;
+        }
+
+        // 用户操作记录
+        DB::commit();
+        $this->error = '支付请求成功,请前往支付~';
+        RedisService::clear($cacheLockKey);
+        return [
+            'order_id' => $id,
+            'payment' => $payment,
+            'total' => $payOrder['pay_money'],
+            'pay_type' => 10,
+        ];
+    }
+
     /**
      * 今日数量统计数据
      * @param $userId

+ 1 - 0
routes/api.php

@@ -66,6 +66,7 @@ Route::prefix('v1')->middleware('web.login')->group(function() {
     Route::get('/order/info', [\App\Http\Controllers\Api\v1\OrderController::class, 'info']);
     Route::post('/order/count', [\App\Http\Controllers\Api\v1\OrderController::class, 'count']);
     Route::post('/order/submit', [\App\Http\Controllers\Api\v1\OrderController::class, 'submit']);
+    Route::post('/order/pay', [\App\Http\Controllers\Api\v1\OrderController::class, 'pay']);
 
     // 购物车
     Route::post('/cart/index', [\App\Http\Controllers\Api\v1\CartController::class, 'index']);