Browse Source

Merge branch 'stabble'

zz 5 years ago
parent
commit
114ed91c3a

+ 134 - 3
app/Http/Controllers/Wap/Pay/OrdersController.php

@@ -770,11 +770,11 @@ class OrdersController extends Controller
         $order = (string)$order;
         $order_info = OrderService::getByTradeNo($order);
         $uid = $order_info->uid;
-        //$bind_info = UserBindPhoneService::bindInfo($uid);
-        $bind_info = false;
+        $bind_info = UserBindPhoneService::bindInfo($uid);
+        //$bind_info = false;
         $page = 'pay.order.wait';
         if(!$bind_info){
-            //$page = 'pay.order.bindPhone';
+            $page = 'pay.order.bindPhone';
         }
         $url = urldecode($request->input('redirect'));
         return view($page, compact('order', 'url','from'));
@@ -1330,6 +1330,137 @@ class OrdersController extends Controller
         echo "success";
     }
 
+    //平安银行支付回调
+    function wcback_originbank(Request $request)
+    {
+        Log::info($request->all());
+        Log::info('wcback_palmpay_request');
+        try {
+            $data = $request->except('_url');
+            unset($data['sign']);
+
+            //订单
+            $trade_no = $data['out_no'];
+            $order = OrderService::getByTradeNo($trade_no);
+            if (!$order) die('failed');
+
+            $pay_merchant = DB::table('pay_merchants')->select('appid', 'source', 'config_info')->where('id', $order->pay_merchant_id)->first();
+
+            // 防止重复推送
+            if (isset($order->status) && $order->status == 'PAID') {
+                Log::info('has_pay:' . $trade_no);
+                echo 'success';
+                exit();
+            }
+
+            //校验签名
+//            $sign = _sign($data, json_decode($pay_merchant->config_info, 1)['appKey']);
+//            if ($sign != $data['sign']) die('failed');
+
+            $trade_result = json_decode($data['trade_result'],true);
+            $transaction_id = $trade_result['transaction_id'];
+
+            if ($trade_result['return_code'] == 'SUCCESS') {
+                Log::info('wcback_palmpay_notify_sign_success');
+                // 修改表比较多,开启事务
+                DB::beginTransaction();
+
+                $uid = $order->uid;
+                $distribution_channel_id = $order->distribution_channel_id;
+                $product_id = $order->product_id;
+                $product = ProductService::getProductSingle($product_id);
+                $send_order_id = $order->send_order_id;
+                $price = $product->price;
+                Log::info('save_order_end');
+
+                Log::info($product);
+
+                Log::info('product_type:' . $product->type);
+                $prize_fee = (int)(($product->price * 100) * 0.1);
+                $this->substituteOrderPrice($order->id, $prize_fee);
+                $this->smartPushTestBookPaidUv($order->from_bid, $order->uid, $order->price);
+                //获取用户充值次数
+                $order->pay_type = $this->getChargeTimes($order->uid);
+                // 更新其他定制Order表
+                if ($product->type == 'YEAR_ORDER') {
+                    Log::info('YEAR_ORDERYEAR_ORDERYEAR_ORDERYEAR_ORDERYEAR_ORDERYEAR_ORDERYEAR_ORDERYEAR_ORDER');
+                    $order_type = 'YEAR';
+                    $this->yearOrder($uid, $distribution_channel_id, $price, $send_order_id);
+                    $order->order_type = $order_type;
+                    $order->status = 'PAID';
+                    $order->pay_end_at = date('Y-m-d H:i:s');
+                    $order->transaction_id = $transaction_id;
+                    $order->save();
+                } elseif ($product->type == 'BOOK_ORDER') {
+                    Log::info('BOOK_ORDERBOOK_ORDERBOOK_ORDERBOOK_ORDERBOOK_ORDERBOOK_ORDERBOOK_ORDERBOOK_ORDER');
+                    $order_type = 'BOOK';
+                    $this->bookOrder($product_id, $uid, $send_order_id, $price, $distribution_channel_id);
+                    $order->order_type = $order_type;
+                    $order->status = 'PAID';
+                    $order->pay_end_at = date('Y-m-d H:i:s');
+                    $order->transaction_id = $transaction_id;
+                    $order->save();
+                } elseif ($product->type == 'TICKET_RECHARGE' || $product->type == 'NEW_USER') {
+                    Log::info('TICKET_RECHARGETICKET_RECHARGETICKET_RECHARGETICKET_RECHARGETICKET_RECHARGE');
+                    $order_type = 'RECHARGE';
+                    $this->userCharge($product, $uid);
+                    $order->order_type = $order_type;
+                    $order->status = 'PAID';
+                    $order->pay_end_at = date('Y-m-d H:i:s');
+                    $order->transaction_id = $transaction_id;
+                    $order->save();
+                } elseif ($product->type == 'FOREVER') {
+                    Log::info('FOREVER------------------------FOREVER');
+                    $order_type = 'FOREVER';
+                    $this->foreverFreeOrder($uid, $distribution_channel_id, $price, $send_order_id);
+                    $order->order_type = $order_type;
+                    $order->status = 'PAID';
+                    $order->pay_end_at = date('Y-m-d H:i:s');
+                    $order->transaction_id = $transaction_id;
+                    $order->save();
+                }
+                $this->successPayPushMsg($uid, $product, $order->id);
+                $this->orderStatistical($order);
+                DB::commit();
+                //redis 删除未支付的uid
+                try {
+                    $key = 'leyuee:to_send_not_pay_uid:distribution_channel_id:' . $distribution_channel_id;
+                    Redis::hdel($key, $uid);
+                } catch (\Exception $e) {
+                    Log::info('redis remote error-----------------------');
+                    Log::info($e);
+                }
+
+                // 注册动作-》回调订单
+                $action_type = 'CallBackOrder';
+                $param = [
+                    'order_sn' => isset($trade_no) ? $trade_no : '0',
+                    'openid' => isset($uid) ? $uid : '0',// 没有openid,用uid写log
+                ];
+                UserService::PushUserActionToQueue($action_type, $distribution_channel_id, $param);
+
+                $this->userProperty($uid,$price,$product->type,$order->activity_id);
+                $this->huaweiActivity($order->activity_id,$uid,$product_id);
+                //交换订单时间
+                $this->exchangeUpdateAndCreated($order->id);
+
+            }else {
+
+                Log::info('wcback_palmpay_notify_sign_fail');
+            }
+        } catch (\Exception $e) {
+            var_dump($e->getMessage());
+            DB::rollBack();
+            Log::info('receive_wcback_palmpay_ept:' . $e->getMessage());
+            echo 'fail';
+            Log::info('pay_callback_end error');
+            return;
+        }
+        Log::info('pay_callback_end');
+
+        echo "success";
+    }
+
     /**
      * 公众号签名@华灯初上
      * @param $params

+ 25 - 8
app/Http/Controllers/Wap/Web/ActivityController.php

@@ -382,17 +382,24 @@ class ActivityController extends BaseController
             $redirect_url = urldecode($redirect_url);
         }
 
-        $product_ids = [6621, 6622,6623];
-
+        //$product_ids = [6621, 6622,6623];
+        $imgs = [
+            'page_bd_img'=>'https://cdn-novel.iycdm.com/h5/activity-2019-07-25/bg.jpg',
+            'page_btn_pre_img'=>'https://cdn-novel.iycdm.com/h5/activity-2019-07-25/undone.png',
+            'page_btn_doing_img'=>'https://cdn-novel.iycdm.com/h5/activity-2019-07-25/doing.png',
+            'page_btn_end_img'=>'https://cdn-novel.iycdm.com/h5/activity-2019-07-25/over.png'
+        ];
         //未开始
         if (time() < strtotime($activity_info->start_time)) {
-            return view('pay.activity.summerHoliday', ['url' => ['javascript:void(0)', 'javascript:void(0)','javascript:void(0)'], 'code' => -1]);
+            //return view('pay.activity.summerHoliday', ['url' => ['javascript:void(0)', 'javascript:void(0)','javascript:void(0)'], 'code' => -1]);
+            return view('pay.order.common', ['url' => [], 'code' => 1, 'img' => $imgs]);
         }
         //结束
         if (time() > strtotime($activity_info->end_time)) {
-            return view('pay.activity.summerHoliday', ['url' => ['javascript:void(0)', 'javascript:void(0)','javascript:void(0)'], 'code' => -2]);
+            return view('pay.order.common', ['url' => [], 'code' => 2, 'img' => $imgs]);
+            //return view('pay.activity.summerHoliday', ['url' => ['javascript:void(0)', 'javascript:void(0)','javascript:void(0)'], 'code' => -2]);
         }
-        $url = [];
+        /*$url = [];
         foreach ($product_ids as $product_id) {
             $param = [
                 'uid' => $this->uid,
@@ -404,9 +411,19 @@ class ActivityController extends BaseController
                 'limit' => 100
             ];
             $url[] = env('CREATE_PAY_URL') . '?' . http_build_query($param);
-        }
-
-        return view('pay.activity.summerHoliday', ['url' => $url, 'code' => 0]);
+        }*/
+        $param = [
+            'uid' => $this->uid,
+            'distribution_channel_id' => $this->distribution_channel_id,
+            'product_id' => $activity_info->product_id,
+            'activity_id' => $activity_info->id,
+            'fromtype' => $from,
+            'pay_redirect_url' => $redirect_url,
+            'limit' => 100,
+        ];
+        $url = env('CREATE_PAY_URL') . '?' . http_build_query($param);
+        return view('pay.order.common', ['url' => $url, 'code' => 0, 'img' => $imgs]);
+        //return view('pay.activity.summerHoliday', ['url' => $url, 'code' => 0]);
     }
 
     public function crmYearActivity(Request $request)

+ 2 - 1
app/Http/Controllers/Wap/Web/WelcomeController.php

@@ -498,7 +498,8 @@ class WelcomeController extends BaseController
                     } else {
                         $activity_img = 'https://cdn-novel.iycdm.com/h5/activity-2019-05-10/reader-50.jpg';
                     }*/
-                    $activity_img = sprintf('https://cdn-novel.iycdm.com/h5/activity-2019-07-10/reader-banner%s.jpg',random_int(1,3));
+                    //$activity_img = sprintf('https://cdn-novel.iycdm.com/h5/activity-2019-07-10/reader-banner%s.jpg',random_int(1,3));
+                    $activity_img = 'https://cdn-novel.iycdm.com/h5/activity-2019-07-25/reader-banner.png';
                     $url = $h5_scheme . '://' . _domain() . $activity_info->activity_page . '&fromtype=reader';
                 }
             }

+ 1 - 0
app/Http/Routes/Wap/WapRoutes.php

@@ -15,6 +15,7 @@ Route::group(['domain'=>env('PAY_WAP_DOMAIN'),'namespace'=>'App\Http\Controllers
     Route::any('pay/wcback_official','Pay\OrdersController@wcback_official');
     Route::any('pay/wcback_lianlianpay','Pay\OrdersController@wcback_lianlianpay');
     Route::any('pay/wcback_palmpay','Pay\OrdersController@wcback_palmpay');
+    Route::any('pay/wcback_originbank','Pay\OrdersController@wcback_originbank');
     Route::post('pay/reportError','Pay\OrdersController@reportError');
     //包月
     Route::get('monthpay/getH5RedirectUrl','Pay\getH5RedirectUrl@getH5RedirectUrl');

+ 120 - 0
app/Libs/Pay/Merchants/OriginBank.php

@@ -0,0 +1,120 @@
+<?php
+
+namespace App\Libs\Pay\Merchants;
+
+use GuzzleHttp\Client;
+use Log;
+
+class OriginBank
+{
+    function __construct($config)
+    {
+        $this->open_id = $config['open_id'];
+        $this->open_key = $config['open_key'];
+        $this->sub_appid = $config['sub_appid'];
+        $this->PayClient = new client(['base_uri'=>'https://api.orangebank.com.cn/','timeout'=>3]);
+    }
+
+    //生成订单
+    function send($data)
+    {
+        $time = time();
+        $base_data = [
+            'open_id'=>$this->open_id,
+            'timestamp'=>$time,
+        ];
+        $data = [
+            'out_no'=>$data['trade_no'],
+            'pmt_tag'=>'WeixinOL',
+            'ord_name'=>$data['body'],
+            'original_amount'=>$data['price'],
+            'trade_amount'=>$data['price'],
+            'notify_url'=>env('ORIGINBANK_NOFITY_URL'),
+            'sub_appid'=>$this->sub_appid,
+            'sub_openid'=>$data['openid'],
+            'JSAPI'=>1
+        ];
+
+        $base_data['data'] = $this->encrypt(json_encode($data),$this->open_key);
+        $base_data['sign'] = $this->signs($base_data);
+
+        $response = $this->PayClient->request('POST','/mct1/payorder',['form_params'=>$base_data])->getBody()->getContents();
+        return $this->getPayInfo($response);
+    }
+
+    function getPayInfo($response)
+    {
+        try{
+            $return_info = json_decode($response,1);
+            if($return_info['errcode'] == 0)
+            {
+                $data = json_decode($this->decrypt($return_info['data'],$this->open_key,true),true);
+                $trade_result = json_decode($data['trade_result'],true);
+                $wc_pay_data = json_decode($trade_result['wc_pay_data'],true);
+                $pay_info = [
+                    'appId'=>$wc_pay_data['appId'],
+                    'timeStamp'=>$wc_pay_data['timeStamp'],
+                    'nonceStr'=>$wc_pay_data['nonceStr'],
+                    'signType'=>$wc_pay_data['signType'],
+                    'package'=>$wc_pay_data['package'],
+                    'paySign'=>$wc_pay_data['paySign']
+                ];
+                return $pay_info;
+            }
+        }catch (\Exception $e)
+        {
+            echo $e->getMessage();
+            Log::error($response);
+            return null;
+        }
+
+    }
+
+    //签名
+    public function signs($array){
+        $signature = array();
+        foreach($array as $key=>$value){
+            $signature[$key]=$key.'='.$value;
+        }
+        $signature['open_key']='open_key'.'='.$this->open_key;
+        ksort($signature);
+        #先sha1加密 在md5加密
+        $sign_str = md5(sha1(implode('&', $signature)));
+        return $sign_str;
+    }
+
+    #@todo AES加解密
+    #加密
+    private function encrypt($input, $key) {
+        $size = @mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
+        $input = $this->pkcs5_pad($input, $size);
+        $td = @mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');
+        $iv = @mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
+        @mcrypt_generic_init($td, $key, $iv);
+        $data = @mcrypt_generic($td, $input);
+        @mcrypt_generic_deinit($td);
+        @mcrypt_module_close($td);
+        $data = strtoupper(bin2hex($data));
+        return $data;
+    }
+
+    private function pkcs5_pad ($text, $blocksize) {
+        $pad = $blocksize - (strlen($text) % $blocksize);
+        return $text . str_repeat(chr($pad), $pad);
+    }
+
+    public function decrypt($sStr, $sKey) {
+        $sStr=hex2bin($sStr);
+        $decrypted= @mcrypt_decrypt(
+            MCRYPT_RIJNDAEL_128,
+            $sKey,
+            $sStr,
+            MCRYPT_MODE_ECB
+        );
+
+        $dec_s = strlen($decrypted);
+        $padding = ord($decrypted[$dec_s-1]);
+        $decrypted = substr($decrypted, 0, -$padding);
+        return $decrypted;
+    }
+}

+ 4 - 0
app/Libs/Pay/WechatPay.php

@@ -9,6 +9,7 @@ use App\Libs\Pay\Merchants\Official;
 use App\Libs\Pay\Merchants\LianLianPay;
 use App\Libs\Pay\Merchants\Palmpay;
 use App\Libs\Pay\Merchants\PalmpayV2;
+use App\Libs\Pay\Merchants\OriginBank;
 
 class WechatPay 
 {
@@ -42,6 +43,9 @@ class WechatPay
                 case 'PALMPAYV2':
                     self::$_instance = new PalmpayV2($config);
                     break;
+                case 'ORIGINBANK':
+                    self::$_instance = new OriginBank($config);
+                    break;
                 default:
                     return null;
 			}