wesmiler 1 месяц назад
Родитель
Сommit
aedd42d1ce
2 измененных файлов с 88 добавлено и 4 удалено
  1. 8 1
      app/Services/Api/OrderService.php
  2. 80 3
      app/Services/PaymentService.php

+ 8 - 1
app/Services/Api/OrderService.php

@@ -329,7 +329,14 @@ class OrderService extends BaseService
         ];
 
         // 调起支付
-        $payment = PaymentService::make()->minPay($userInfo, $payOrder, 'store');
+        $appSources = isset($system['app_sources']) && $system['app_sources'] ? $system['app_sources'] : 'ios';
+        $platform = isset($appSources['platform']) && $appSources['platform']? $appSources['platform'] : 'min';
+        if($platform == 'mp'){
+            $payment = PaymentService::make()->mp($userInfo, $payOrder, 'store');
+        }else{
+            $payment = PaymentService::make()->minPay($userInfo, $payOrder, 'store');
+        }
+
         if (empty($payment)) {
             DB::rollBack();
             RedisService::clear($cacheLockKey);

+ 80 - 3
app/Services/PaymentService.php

@@ -190,7 +190,7 @@ class PaymentService extends BaseService
         // 创建支付
         try {
             $pay = $this->createPay($scene, 10, 'min');
-            RedisService::set("caches:payments:wechat:{$scene}_{$outTradeNo}", ['order' => $order, 'config' => $this->config], 7200);
+            RedisService::set("caches:payments:wechat:minPay_{$scene}_{$outTradeNo}", ['order' => $order, 'config' => $this->config], 7200);
             if (empty($pay)) {
                 $this->error = 2616;
                 return false;
@@ -198,7 +198,84 @@ class PaymentService extends BaseService
 
             $pay = $pay->mini($payData);
         } catch (\Exception $exception) {
-            RedisService::set("caches:payments:wechat:{$scene}_{$outTradeNo}_error", ['order' => $order, 'error' => $exception->getTrace(), 'config' => $this->config], 7200);
+            RedisService::set("caches:payments:wechat:minPay_{$scene}_{$outTradeNo}_error", ['order' => $order, 'error' => $exception->getTrace(), 'config' => $this->config], 7200);
+            $this->error = $exception->getMessage();
+            return false;
+        }
+
+        if ($pay->package) {
+            $data = [
+                'user_id' => $userInfo['id'],
+                'out_trade_no' => $outTradeNo,
+                'order_no' => $order['order_no'],
+                'params' => json_encode($pay, 256),
+                'total_fee' => $amount,
+                'pay_type' => 10,
+                'create_time' => time(),
+                'status' => 2,
+                'mark' => 1,
+            ];
+            if ($this->model->insertGetId($data)) {
+                $this->error = 2617;
+                return $pay;
+            }
+        }
+
+        $this->error = 2618;
+        return false;
+    }
+
+    /**
+     * 微信公众号支付
+     * @param $userInfo
+     * @param $order
+     * @param string $scene
+     * @return false|\Yansongda\Supports\Collection
+     */
+    public function mpPay($userInfo, $order, $scene = 'store')
+    {
+        $amount = isset($order['pay_money']) ? $order['pay_money'] : 0;
+        $openid = isset($order['openid']) ? $order['openid'] : '';
+        if ($amount < 0) {
+            $this->error = 2615;
+            return false;
+        }
+
+        if (empty($openid)) {
+            $this->error = 2614;
+            return false;
+        }
+
+        $outTradeNo = isset($order['order_no']) && $order['order_no'] ? $order['order_no'] : get_order_num('PR');
+        // 是否调用过支付,是则用新的支付单号
+        if ($outTradeNo && $this->model->where(['out_trade_no' => $outTradeNo, 'mark' => 1])->value('id')) {
+            $outTradeNo = $outTradeNo . date('is') . rand(1, 9);
+        }
+        $body = isset($order['body']) ? $order['body'] : '';
+        $payData = [
+            'out_trade_no' => $outTradeNo,
+            'description' => $body ? $body : '订单支付',
+            'amount' => [
+                'total' => intval($amount * 100),
+                'currency' => 'CNY'
+            ],
+            'payer' => [
+                'openid' => $openid,
+            ],
+        ];
+
+        // 创建支付
+        try {
+            $pay = $this->createPay($scene, 10, 'mp');
+            RedisService::set("caches:payments:wechat:mp_{$scene}_{$outTradeNo}", ['order' => $order, 'config' => $this->config], 7200);
+            if (empty($pay)) {
+                $this->error = 2616;
+                return false;
+            }
+
+            $pay = $pay->mp($payData);
+        } catch (\Exception $exception) {
+            RedisService::set("caches:payments:wechat:mp_{$scene}_{$outTradeNo}_error", ['order' => $order, 'error' => $exception->getTrace(), 'config' => $this->config], 7200);
             $this->error = $exception->getMessage();
             return false;
         }
@@ -226,7 +303,7 @@ class PaymentService extends BaseService
     }
 
     /**
-     * 微信支付
+     * 微信APP支付
      * @param $userInfo
      * @param $order
      * @param string $scene