wesmiler hai 6 meses
pai
achega
28c8fab651

+ 3 - 3
app/Http/Controllers/Api/v1/MemberController.php

@@ -112,10 +112,10 @@ class MemberController extends webApp
     public function vipBuy()
     {
         $vipId = request()->post('id');
-        if (!MemberService::make()->vipBuy($this->userId, $vipId)) {
-            return showJson(MemberService::make()->getError(), false);
+        if ($result = MemberService::make()->vipBuy($this->userId, $vipId)) {
+            return showJson(MemberService::make()->getError(), true, $result);
         } else {
-            return showJson(1013, true);
+            return showJson(MemberService::make()->getError(), false);
         }
     }
 

+ 26 - 12
app/Services/Api/MemberService.php

@@ -560,6 +560,12 @@ class MemberService extends BaseService
         return $datas;
     }
 
+    /**
+     * 购买VIP
+     * @param $userId
+     * @param $vipId
+     * @return array|false
+     */
     public function vipBuy($userId, $vipId)
     {
         $cacheKey = "caches:members:vipBuy:{$userId}_{$vipId}";
@@ -589,23 +595,30 @@ class MemberService extends BaseService
         }
 
         $info = $this->model->where(['id' => $userId, 'mark' => 1])
-            ->select(['id','is_zg_vip', 'zg_vip_expired','is_zsb_vip','zsb_vip_expired','is_video_vip','video_expired', 'status'])
+            ->select(['id','openid','mobile','is_zg_vip', 'zg_vip_expired','is_zsb_vip','zsb_vip_expired','is_video_vip','video_vip_expired', 'status'])
             ->first();
-        $isZgVip = isset($info['is_zg_vip'])? $info['is_zg_vip'] : '';
-        $isZsbVip = isset($info['is_zsb_vip'])? $info['is_zsb_vip'] : '';
-        $isVideoVip = isset($info['is_video_vip'])? $info['is_video_vip'] : '';
+        $isZgVip = isset($info['is_zg_vip'])? $info['is_zg_vip'] : 0;
+        $isZsbVip = isset($info['is_zsb_vip'])? $info['is_zsb_vip'] : 0;
+        $isVideoVip = isset($info['is_video_vip'])? $info['is_video_vip'] : 0;
         $zgVipExpired = isset($info['zg_vip_expired'])? $info['zg_vip_expired'] : '';
         $zsbVipExpired = isset($info['zsb_vip_expired'])? $info['zsb_vip_expired'] : '';
-        $videoVipExpired = isset($info['zsb_vip_expired'])? $info['zsb_vip_expired'] : '';
+        $videoVipExpired = isset($info['video_vip_expired'])? $info['video_vip_expired'] : '';
+        $openid = isset($info['openid'])? $info['openid'] : '';
         if (!$info || $info['status'] != 1) {
             $this->error = 1045;
             RedisService::clear($cacheKey . '_lock');
             return false;
         }
 
+        if(empty($openid)){
+            $this->error = '用户参数错误,请重新授权登录后尝试~';
+            RedisService::clear($cacheKey . '_lock');
+            return false;
+        }
+
         // 验证是否
         $expiredTime = time();
-        $vipLimitOpen = ConfigService::make()->getConfigByCode('vip_limit_more', 1);
+        $vipLimitOpen = ConfigService::make()->getConfigByCode('vip_limit_more', 0);
         if($vipLimitOpen){
             // 已开通职高VIP无法再开通
             if($vipType == 1 && ($isZgVip==1 && $zgVipExpired >= date('Y-m-d H:i:s'))){
@@ -654,7 +667,7 @@ class MemberService extends BaseService
 
         DB::beginTransaction();
         if(!$orderId = OrderModel::insertGetId($order)){
-            $this->error = '创建购买订单失败';
+            $this->error = '创建VIP订单失败';
             return false;
         }
 
@@ -664,26 +677,27 @@ class MemberService extends BaseService
             'order_no'=> $orderNo,
             'pay_money'=> $price,
             'body'=> "购买{$vipName}VIP",
+            'openid'=> $openid
         ];
 
         // 调起支付
-        $payment = PaymentService::make()->wechatPay($info, $payOrder,'vip');
+        $payment = PaymentService::make()->minPay($info, $payOrder,'vip');
         if(empty($payment)){
             DB::rollBack();
-            RedisService::clear($cacheLockKey);
+            RedisService::clear($cacheKey.'_lock');
             $this->error = PaymentService::make()->getError();
             return false;
         }
 
         // 用户操作记录
         DB::commit();
-        $this->error = 2122;
-        RedisService::clear($cacheLockKey);
+        $this->error = '创建VIP订单成功,请前往支付~';
+        RedisService::clear($cacheKey.'_lock');
         return [
             'order_id'=> $orderId,
             'payment'=> $payment,
             'total'=> $payOrder['pay_money'],
-            'pay_type'=> $payType,
+            'pay_type'=> 10,
         ];
 
     }

+ 100 - 4
app/Services/PaymentService.php

@@ -62,17 +62,21 @@ class PaymentService extends BaseService
 
     /**
      * 创建支付
-     * @param string $scene 场景,deposit-保证金,depositRefund-保证金退款,withdraw-提现
+     * @param string $scene 场景,vip-VIP会员
      * @param int $payType
+     * @param int $isMin 是否是小程序
      * @return false|\Yansongda\Pay\Provider\Alipay|Wechat
      */
-    public function createPay($scene, $payType = 10)
+    public function createPay($scene, $payType = 10, $payPt= '')
     {
         $config = ConfigService::make()->getConfigOptionByGroup(6);
         if ($payType == 10) {
             $appid = isset($config['wxpay_appid']) ? $config['wxpay_appid'] : '';
+            $mpAppid = isset($config['wxpay_mp_appid']) ? $config['wxpay_mp_appid'] : '';
+            $minAppid = isset($config['wxpay_min_appid']) ? $config['wxpay_min_appid'] : '';
             $mchid = isset($config['wxpay_mchd']) ? $config['wxpay_mchd'] : '';
             $secretV3Key = isset($config['wxpay_key_v3']) ? $config['wxpay_key_v3'] : '';
+            $secretV2Key = isset($config['wxpay_key_v2']) ? $config['wxpay_key_v2'] : '';
             $wxpaySecretCert = isset($config['wxpay_secret_cert']) ? $config['wxpay_secret_cert'] : '';
             $wxpayPublicCert = isset($config['wxpay_public_cert']) ? $config['wxpay_public_cert'] : '';
             if (empty($appid) || empty($mchid) || empty($secretV3Key)) {
@@ -83,8 +87,23 @@ class PaymentService extends BaseService
             // 支付参数
             $payConfig = config('payment.wechat');
             $payConfig['wechat']['default']['mch_id'] = $mchid;
-            $payConfig['wechat']['default']['app_id'] = $appid;
-            $payConfig['wechat']['default']['mch_secret_key'] = $secretV3Key;
+            if($payPt == 'min'){
+                // 小程序支付
+                $payConfig['wechat']['default']['mini_app_id'] = $minAppid? $minAppid : $appid;
+            }else if($payPt == 'mp'){
+                // 公众号
+                $payConfig['wechat']['default']['mp_app_id'] = $mpAppid? $mpAppid : $appid;
+            }else{
+                // APP支付
+                $payConfig['wechat']['default']['app_id'] = $appid;
+            }
+
+            if($secretV3Key){
+                $payConfig['wechat']['default']['mch_secret_key'] = $secretV3Key;
+            }else if($secretV2Key){
+                $payConfig['wechat']['default']['mch_secret_key_v2'] = $secretV2Key;
+            }
+
             if ($wxpaySecretCert) {
                 $payConfig['wechat']['default']['mch_secret_cert'] = $wxpaySecretCert;
             }
@@ -131,6 +150,83 @@ class PaymentService extends BaseService
     }
 
     /**
+     * 微信小程序支付
+     * @param $userInfo
+     * @param $order
+     * @param string $scene
+     * @return false|\Yansongda\Supports\Collection
+     */
+    public function minPay($userInfo, $order, $scene = 'pay')
+    {
+        $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, 'min');
+            RedisService::set("caches:payments:wechat:{$scene}_{$outTradeNo}", ['order' => $order, 'config' => $this->config], 7200);
+            if (empty($pay)) {
+                $this->error = 2616;
+                return false;
+            }
+
+            $pay = $pay->mini($payData);
+        } catch (\Exception $exception) {
+            RedisService::set("caches:payments:wechat:{$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

+ 1 - 0
resources/lang/zh-cn/api.php

@@ -48,6 +48,7 @@ return [
     '2014'=>"手机号获取失败",
 
 
+    '2614'=> '支付用户OPENID缺少',
     '2615'=> '支付金额错误',
     '2616'=> '微信支付参数未配置',
     '2617'=> '微信支付调用成功',