Explorar o código

wesmiler 报恩寺项目提交

wesmiler %!s(int64=4) %!d(string=hai) anos
pai
achega
8ff69709e1

+ 3 - 0
app/Http/Controllers/Api/v1/NotifyController.php

@@ -77,6 +77,9 @@ class NotifyController extends BaseController
                 case 'recharge': // 充值
                     return NotifyService::make()->notifyRecharge($postData, $outTradeNo);
                     break;
+                case 'shop': // 商城支付
+                    return NotifyService::make()->notifyShop($postData, $outTradeNo);
+                    break;
                 default:
                     break;
             }

+ 84 - 1
app/Services/NotifyService.php

@@ -14,6 +14,7 @@ namespace App\Services;
 use App\Models\DynamicNoticeModel;
 use App\Models\GongdengOrderModel;
 use App\Models\MemberModel;
+use App\Models\OrdersModel;
 use App\Models\RechargeModel;
 use App\Models\SignsModel;
 use App\Models\TradeModel;
@@ -41,6 +42,7 @@ class NotifyService extends BaseService
     {
         $this->model = new GongdengOrderModel();
         $this->rechargeModel = new RechargeModel();
+        $this->orderModel = new OrdersModel();
     }
 
     /**
@@ -188,7 +190,7 @@ class NotifyService extends BaseService
     }
 
     /**
-     * 供灯订单回调处理
+     * 充值订单回调处理
      * @param $notifyData
      * @param $outTradeNo
      * @return false
@@ -274,6 +276,87 @@ class NotifyService extends BaseService
 
         return NotifyService::rebackMsg('支付处理成功','success');
     }
+
+    /**
+     * 商城订单回调处理
+     * @param $notifyData
+     * @param $outTradeNo
+     * @return false
+     */
+    public function notifyShop($notifyData, $outTradeNo){
+        $errorKey = "caches:orders:shop:{$outTradeNo}";
+        // 验证订单是否存在
+        $orderInfo = $this->orderModel::where(['order_sn'=> $outTradeNo])
+            ->select(['id','type','user_id','goods_id','order_sn','num','total','status'])
+            ->first();
+
+
+        // 验证参数
+        RedisService::set($errorKey.':order',['order'=> $orderInfo,'notify'=> $notifyData], 3600);
+        $orderStatus = isset($orderInfo['status']) ? intval($orderInfo['status']) : 0;
+        $userId = isset($orderInfo['user_id']) ? intval($orderInfo['user_id']) : 0;
+        if (empty($orderInfo) || $userId<=0) {
+            return NotifyService::rebackMsg('订单数据不存在', 'success');
+        }
+
+        // 订单用户
+        $memberInfo = MemberModel::where(['id'=> $userId])->select(['id','openid','nickname','balance','coupon','status'])->first();
+        if(!$memberInfo){
+            return NotifyService::rebackMsg('订单用户不存在', 'success');
+        }
+
+        // 验证订单状态是否可处理
+        if ($orderStatus != 1) {
+            return NotifyService::rebackMsg('订单已处理', 'success');
+        }
+
+        // 验证订单金额是否正确
+        $payDebug = config('weixin.payDebug');
+        $amount = isset($notifyData['amount'])? $notifyData['amount'] : [];
+        $payMoney = isset($amount['total']) ? moneyFormat($amount['total']) : 0;
+        $orderMoney = isset($orderInfo['total']) ? moneyFormat($orderInfo['total']) : 0.00;
+        $orderAmount = moneyFormat($orderMoney);
+        if (!$payDebug && intval($orderAmount * 100) != intval($payMoney)) {
+            RedisService::set($errorKey.':error_money',['notify'=> $notifyData, 'error'=> '实付金额与订单金额不一致','order'=> $orderInfo
+            ], 3600);
+            return NotifyService::rebackMsg('实付金额与订单金额不一致', 'error');
+        }
+
+        // 更新订单数据
+        DB::beginTransaction();
+        $tradeNo = isset($notifyData['transaction_id'])? $notifyData['transaction_id'] : '';
+        if(!$this->orderModel::where(['order_sn'=> $outTradeNo])->update(['status'=> 2,'trade_no'=> $tradeNo,'pay_at'=> date('Y-m-d H:i:s'),'pay_money'=> moneyFormat($payMoney/100),'remark'=> '已支付'])){
+            RedisService::set($errorKey.':error_update',['notify'=> $notifyData, 'error'=> '更新订单信息失败','order'=> $orderInfo
+            ], 3600);
+            DB::rollBack();
+            return NotifyService::rebackMsg('更新订单数据失败', 'error');
+        }
+
+        // 处理支付明细
+        $data = [
+            'user_id'=> $userId,
+            'type'=> 1,
+            'coin_type'=> 2,
+            'pay_type'=> 2,
+            'money'=> moneyFormat($payMoney/100),
+            'change_type'=> 2,
+            'balance'=> 0,
+            'create_time'=> time(),
+            'remark'=> '商城订单支付',
+            'status'=> 1
+        ];
+        if(!TradeModel::insertGetId($data)){
+            RedisService::set($errorKey.':error_account',['notify'=> $notifyData, 'error'=> '处理交易明细失败','order'=> $orderInfo
+            ], 3600);
+            DB::rollBack();
+            return NotifyService::rebackMsg('处理交易明细失败', 'error');
+        }
+
+        DB::commit();
+
+        return NotifyService::rebackMsg('支付处理成功','success');
+    }
+
     /**
      * 回去回调报文内容
      * @param $message

+ 70 - 32
app/Services/OrdersService.php

@@ -206,7 +206,7 @@ class OrdersService extends BaseService
         }
 
         $payType = isset($params['payType']) ? $params['payType'] : 0;
-        if (!in_array($payType, [1,4])) {
+        if (!in_array($payType, [1,2,4])) {
             return message('支付方式暂不支持', false);
         }
 
@@ -224,6 +224,10 @@ class OrdersService extends BaseService
             return message('账号已被冻结,请联系客服', false);
         }
 
+        if($payType==2 && !$memberInfo->openid){
+            return message('授权失效,请刷新重试', false);
+        }
+
         // 创建订单
 
         $price = 0;
@@ -238,6 +242,13 @@ class OrdersService extends BaseService
                 return message( "账号{$payTypeName}不足,请先充值", false);
             }
 
+        }else if($payType == 2){
+            $field = 'balance';
+            $payTypeName = '微信支付';
+            $rate = ConfigService::make()->getConfigByCode('recharge_rate');
+            $rate = $rate>0? $rate : 1;
+            $price = moneyFormat($info->price*$rate, 2);
+            $total = moneyFormat($num * $price);
         }else if($payType == 4){
             $field = 'score';
             $payTypeName = '积分';
@@ -272,45 +283,72 @@ class OrdersService extends BaseService
             'status' => 2,
         ];
 
-        if(!$this->model::insertGetId($data)){
+        if(!$oid = $this->model::insertGetId($data)){
             \DB::rollBack();
             return message( "订单创建失败,请刷新重试", false);
         }
 
-        // 扣除账户
-        if(!MemberModel::where(['id'=> $userId,'mark'=> 1])->decrement($field, $total)){
-            \DB::rollBack();
-            return message( "订单支付失败,请刷新重试", false);
-        }
+        // 非账户支付
+        if($payType == 2){
+            // 扣除库存
+            if(!GoodsModel::where(['id'=> $id])->decrement('stock', $num)){
+                \DB::rollBack();
+                return message( "库存处理失败,请刷新重试", false);
+            }
 
-        // 明细
-        $data = [
-            'user_id'=> $userId,
-            'type'=> 1,
-            'coin_type'=> $payType==4? 3 : $payType,
-            'pay_type'=> 1,
-            'money'=> $total,
-            'change_type'=> 2,
-            'balance'=> $payType==1? $memberInfo->coupon : $memberInfo->score,
-            'create_time'=> time(),
-            'update_time'=> time(),
-            'remark'=> '商品兑换订单支付',
-            'status'=> 1
-        ];
+            // 提交订单
+            \DB::commit();
+
+            $order = [
+                'openid' => $memberInfo->openid,
+                'orderNo' => $data['order_sn'],
+                'amount' => $data['total'],
+                'body' => '商城订单支付',
+            ];
+
+            $jsapiParams = WechatService::jsapiUnifiedorder($order,'shop');
+            $code = isset($jsapiParams['code']) ? $jsapiParams['code'] : '';
+            if ($code == 'error' || empty($jsapiParams)) {
+                $message = isset($jsapiParams['message']) && $jsapiParams['message'] ? $jsapiParams['message'] : '订单支付处理失败';
+                return message($message, false);
+            }
+            return message('商城订单创建成功', true, ['id' => $oid, 'params' => $jsapiParams]);
+        }else{
+            // 扣除账户
+            if(!MemberModel::where(['id'=> $userId,'mark'=> 1])->decrement($field, $total)){
+                \DB::rollBack();
+                return message( "订单支付失败,请刷新重试", false);
+            }
 
-        if(!TradeModel::insertGetId($data)){
-            \DB::rollBack();
-            return message( "交易处理失败,请刷新重试", false);
-        }
+            // 明细
+            $data = [
+                'user_id'=> $userId,
+                'type'=> 1,
+                'coin_type'=> $payType==4? 3 : $payType,
+                'pay_type'=> 1,
+                'money'=> $total,
+                'change_type'=> 2,
+                'balance'=> $payType==1? $memberInfo->coupon : $memberInfo->score,
+                'create_time'=> time(),
+                'update_time'=> time(),
+                'remark'=> '商品兑换订单支付',
+                'status'=> 1
+            ];
+
+            if(!TradeModel::insertGetId($data)){
+                \DB::rollBack();
+                return message( "交易处理失败,请刷新重试", false);
+            }
 
-        // 扣除库存
-        if(!GoodsModel::where(['id'=> $id])->decrement('stock', $num)){
-            \DB::rollBack();
-            return message( "库存处理失败,请刷新重试", false);
-        }
+            // 扣除库存
+            if(!GoodsModel::where(['id'=> $id])->decrement('stock', $num)){
+                \DB::rollBack();
+                return message( "库存处理失败,请刷新重试", false);
+            }
 
-        \DB::commit();
-        return message('兑换订单支付成功', true);
+            \DB::commit();
+            return message('兑换订单支付成功', true);
+        }
     }
 
 }