zz 5 jaren geleden
bovenliggende
commit
023f31e02e

+ 184 - 0
app/Console/Commands/CheckOrderStatus.php

@@ -0,0 +1,184 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\Modules\SendOrder\Services\SendOrderService;
+use App\Modules\Subscribe\Services\YearOrderService;
+use App\Modules\User\Models\UserMonthSign;
+use App\Modules\User\Services\UserMonthService;
+use App\Modules\User\Services\UserService;
+use Illuminate\Console\Command;
+use App\Modules\Subscribe\Services\OrderService;
+use Redis;
+use Log;
+use DB;
+
+class CheckOrderStatus extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'checkOrderStatus {--uid= : the uid}';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = 'Command description';
+
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return mixed
+     */
+    public function handle()
+    {
+        //$this->checkOne(157286149);
+        $uid = $this->option('uid');
+        if($uid) {
+            $this->checkOne($uid);
+        }else{
+            $result = UserMonthSign::where('created_at','>=',date('Y-m-d H:i:s',time()-300))->select('uid')->get();
+            if($result->isNotEmpty()){
+                foreach ($result as $item){
+                    $this->checkOne($item->uid);
+                }
+            }
+        }
+    }
+    public function checkOne($uid){
+        //int $user_id,int $plan_id,string $app_id,string $key,string $app_secret
+        $plan_id = env('MONTH_ORDER_PLAN_ID');
+        $app_id = env('MONTH_ORDER_APPID');
+        $key = env('MONTH_ORDER_KEY');
+        $app_secret = env('MONTH_ORDER_APP_SECRET');
+        $result = UserMonthService::checkOrderStatus($uid,$plan_id,$app_id,$key,$app_secret);
+
+        if(isset($result['code']) && !$result['code']){
+            echo sprintf('sign fail ,uid is :%s',$uid).PHP_EOL;
+            return '';
+        }
+        //print_r($result);
+        $trade_no = $result['trade_no'];
+        $out_trade_no = $result['out_trade_no'];
+        $money = $result['money'];
+        if(empty($trade_no) || empty($out_trade_no) || empty($money)){
+            echo sprintf('uid is : %s,order is not exist',$uid).PHP_EOL;
+            return '';
+        }
+
+        if (!UserMonthService::getOrderByOrder($trade_no, $out_trade_no)) {
+            UserMonthService::createLOrder($uid, $plan_id, $money, $trade_no, $out_trade_no);
+            $this->addOrderAndVip($uid, $out_trade_no, $trade_no, $money);
+        }
+    }
+
+    private function addOrderAndVip($uid, $out_trade_no, $trade_no, $price)
+    {
+
+        $order_info = OrderService::getByTradeNo($out_trade_no);
+        //订单已经存在
+        if ($order_info) {
+            return;
+        }
+        $user_info = UserService::getById($uid);
+        if (!$user_info) return;
+        $this->createOrder($uid, $user_info->distribution_channel_id, 0, $price, $out_trade_no, $trade_no);
+        YearOrderService::save_month_order([
+            'uid' => $uid,
+            'distribution_channel_id' => $user_info->distribution_channel_id,
+            'fee' => $price / 100,
+            'send_order_id' => 0
+        ]);
+    }
+
+    private function createOrder($uid, $distribution_channel_id, $product_id, $price, $trade_no, $transaction_id)
+    {
+        $count = OrderService::getUserChargeTimes($uid);
+        $count = $count + 1;
+        $send_order_id = 0;
+        try {
+            $send_order_id = (int)Redis::hget('book_read:' . $uid, 'send_order_id');
+        } catch (\Exception $e) {
+        }
+        $send_order_name = '';
+        if ($send_order_id) {
+            $send_order_info = SendOrderService::getById($send_order_id);
+            if ($send_order_info && isset($send_order_info->name) && !empty($send_order_info->name)) {
+                $send_order_name = $send_order_info->name;
+            }
+        }
+        $init_order = [
+            'distribution_channel_id' => $distribution_channel_id,
+            'uid' => $uid,
+            'product_id' => 6826,
+            'price' => $price / 100,
+            'pay_type' => $count,
+            'trade_no' => $trade_no,
+            'pay_merchant_source' => 'MONTH',
+            'pay_merchant_id' => 99,
+            'create_ip' => '',
+            'send_order_id' => $send_order_id,
+            'send_order_name' => $send_order_name,
+            'order_type' => 'RECHARGE',
+            'from_bid' => '0',
+            'from_type' => 'auto_month',
+            'activity_id' => 0,
+            'inner_send_order_id' => '',
+            'status' => 'PAID',
+            'transaction_id' => $transaction_id,
+            'pay_end_at' => date('Y-m-d H:i:s')
+        ];
+        OrderService::save_order($init_order);
+    }
+
+    protected function successPayPushMsg($uid)
+    {
+        try {
+            $force_sub_info = DB::table('force_subscribe_users')->where('uid', $uid)->where('is_subscribed', 1)->first();
+            $data = UserService::getById($uid);
+            if (!$force_sub_info) {
+                return;
+            }
+
+            $content_format = "包月购买成功通知:\r\n\r\n购买类型: 30元包月\r\n\r\n><a href='%s'>点击继续上次阅读</a>\r\n\r\n为了方便阅读,请<a href='%s'>置顶公众号</a>\r\n\r\n为了方便阅读,请<a href='%s'>置顶公众号</a>\r\n\r\n为了方便阅读,请<a href='%s'>置顶公众号</a>";
+
+            $delay = 0;
+            $url = env('PROTOCOL') . '://site' . encodeDistributionChannelId($data->distribution_channel_id) . '.' . env('CUSTOM_HOST') . '.com/continue';;
+            $top_url = 'https://help.zhuishuyun.com/top.html';
+
+            $content = sprintf($content_format, $url, $top_url, $top_url, $top_url);
+
+            $res['openid'] = $force_sub_info->openid;
+            $res['appid'] = $force_sub_info->appid;
+            $res['content'] = $content;
+            $res['type'] = 'one_task';
+            $res['send_time'] = date("Y-m-d H:i:s");
+            $res['task_id'] = md5('month_pay_success_push');
+            $send_data = array(
+                'send_time' => date("Y-m-d H:i:s"),
+                'data' => $res
+            );
+            dispatch((new SendTexts($send_data))->onConnection('rabbitmq')->delay($delay)->onQueue('send_texts_list'));
+
+
+        } catch (\Exception $e) {
+            Log::error('pay_success_push error');
+            Log::error($e);
+        }
+        return;
+    }
+}

+ 160 - 0
app/Console/Commands/selectCrmSites.php

@@ -0,0 +1,160 @@
+<?php
+
+namespace App\Console\Commands;
+
+use Illuminate\Console\Command;
+use DB;
+
+class selectCrmSites extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'selectCrmSites';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = 'Command description';
+
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return mixed
+     */
+    public function handle()
+    {
+        $result = $this->selectSites();
+        $data = [];
+        $times = DB::table('crm_other_channels')->max('times');
+        $times = $times?$times:0;
+        $i = 1;
+        foreach ($result as $item){
+            $data[] = [
+                'distribution_channel_id'=>$item,
+                'times'=>$times+1,
+                'created_at'=>date('Y-m-d H:i:s'),
+                'updated_at'=>date('Y-m-d H:i:s')
+            ];
+            if($i% 100 == 0){
+                DB::table('crm_other_channels')->insert($data);
+                $data = [];
+            }
+            $i++;
+        }
+
+        if($data){
+            DB::table('crm_other_channels')->insert($data);
+        }
+    }
+
+    public function selectSites(){
+        $distribution_channel_id = $this->getSiteNoRegister();
+        $setServiceSites = $this->getSiteSetServices();
+        $opTenCompanyInfo = $this->getTopTenCompanySite();
+        $innerSites = $this->getInnerSite();
+        $result = [];
+        foreach ($distribution_channel_id as $item){
+            //去除设置了二维码的站点
+            if(in_array($item,$setServiceSites)) continue;
+            //去除内部站点
+            if(in_array($item,$innerSites)) continue;
+            //1个月的流水排名前十公司排除
+            if(in_array($item,$opTenCompanyInfo)) continue;
+
+            $result[] = $item;
+        }
+        return $result;
+    }
+
+    public function getTopTenCompanySite(){
+        $data = $this->getTopTenCompanyInfo();
+        $res = [];
+        foreach ($data as $v){
+            $res = array_merge($res,$v['distribution_channel_id']);
+        }
+        return $res;
+    }
+    //最近1个月的流水排名前十公司
+    public function getTopTenCompanyInfo(){
+        //order_day_stats
+        $sql = 'SELECT company_id,GROUP_CONCAT( DISTINCT a.distribution_channel_id) as distribution_channel_id,GROUP_CONCAT(DISTINCT b.channel_user_id) as channel_user_ids ,SUM(a.total_recharge_amount) as total_recharge_amount  FROM order_day_stats a JOIN 
+distribution_channels b on a.distribution_channel_id = b.id 
+JOIN channel_users c on  b.channel_user_id = c.id
+where a.date >= date(DATE_ADD(NOW(),INTERVAL -1 MONTH))
+and c.company_id not in (1,2,3,18,760)
+GROUP BY c.company_id
+ORDER BY total_recharge_amount desc 
+LIMIT 10';
+        $result = DB::select($sql);
+        $data = [];
+        foreach ($result as $item){
+            $data[] = [
+                'company_id'=>$item->company_id,
+                'distribution_channel_id'=>explode(',',$item->distribution_channel_id),
+                'channel_user_ids'=>explode(',',$item->channel_user_ids),
+                'total_recharge_amount'=>$item->total_recharge_amount
+            ];
+        }
+        $res = [];
+        foreach ($data as $v){
+            $res = array_merge($res,$v['distribution_channel_id']);
+        }
+
+        return $data;
+    }
+
+    //内部账号
+    public function getInnerSite():array{
+        $sql = 'SELECT distribution_channels.id FROM distribution_channels JOIN channel_users on distribution_channels.channel_user_id = channel_users.id 
+where channel_users.company_id in (1,2,3,18,760)';
+        $result = DB::select($sql);
+        $data = [];
+        foreach ($result as $item){
+            $data[] = $item->id;
+        }
+        return $data;
+    }
+
+    //最近两周没有新增注册用户的其他渠道站点(小于100)
+    public function getSiteNoRegister():array{
+        $sql = 'SELECT distribution_channel_id,COUNT(users.id) FROM users 
+JOIN distribution_channels on users.distribution_channel_id = distribution_channels.id
+WHERE users.created_at >= date(DATE_ADD(NOW(),INTERVAL -2 WEEK))
+and distribution_channels.created_at <= date(DATE_ADD(NOW(),INTERVAL -1 MONTH))
+and distribution_channel_id >0
+GROUP BY distribution_channel_id
+HAVING COUNT(users.id) <100';
+        $result = DB::select($sql);
+        $data = [];
+        foreach ($result as $item){
+            $data[] = $item->distribution_channel_id;
+        }
+        return $data;
+    }
+
+    //站点所用客服二维码为平台官方
+    public function getSiteSetServices():array{
+        $sql = 'SELECT distribution_channel_id FROM distribution_channel_settings';
+        $result = DB::select($sql);
+        $data = [];
+        foreach ($result as $item){
+            $data[] = $item->distribution_channel_id;
+        }
+        return $data;
+    }
+}

+ 4 - 1
app/Console/Kernel.php

@@ -24,7 +24,8 @@ class Kernel extends ConsoleKernel
         Commands\YqBook::class,
         Commands\channelCpcCode::class,
         Commands\updateFromNewYunqi::class,
-        Commands\InnerOuterWeixinStats::class
+        Commands\InnerOuterWeixinStats::class,
+        Commands\CheckOrderStatus::class,
     ];
 
     /**
@@ -38,5 +39,7 @@ class Kernel extends ConsoleKernel
         $schedule->command('book:update')->dailyAt('06:00');
 
         $schedule->command('book:update')->dailyAt('18:00');
+
+        $schedule->command('checkOrderStatus')->everyFiveMinutes();
     }
 }

+ 41 - 23
app/Http/Controllers/Wap/Order/OrdersController.php

@@ -3,6 +3,7 @@
 namespace App\Http\Controllers\Wap\Order;
 
 use App\Modules\Book\Services\BookGiftsService;
+use App\Modules\SendOrder\Services\SendOrderService;
 use App\Modules\Subscribe\Models\Order;
 use App\Http\Controllers\Wap\BaseController;
 use App\Modules\Book\Services\BookConfigService;
@@ -865,33 +866,50 @@ class OrdersController extends BaseController
         }
     }
 
-    /*public function monthPay(Request $request,$channel_id,$domain){
+    public function monthPay(Request $request){
         \Log::info('monthPay url--------------');
         \Log::info($request->all());
-        $from = $request->get('from_wxpay');
-        if($from && $from == 1){
-            //if()
-            $source = Cookie::get('month_pay_redirect');
-            if($source){
-                $source = urldecode($source);
-            }else{
-                $source = '/person';
+        $uid = $this->uid;
+        $count = OrderService::getUserChargeTimes($uid);
+        $count = $count + 1;
+        $send_order_id = 0;
+        try {
+            $send_order_id = (int)Redis::hget('book_read:' . $uid, 'send_order_id');
+        } catch (\Exception $e) {
+        }
+        $distribution_channel_id = $this->distribution_channel_id;
+        $trade_no = date("YmdHis") . str_shuffle(hexdec(uniqid()));
+        $send_order_name = '';
+        if ($send_order_id) {
+            $send_order_info = SendOrderService::getById($send_order_id);
+            if ($send_order_info && isset($send_order_info->name) && !empty($send_order_info->name)) {
+                $send_order_name = $send_order_info->name;
             }
-            return redirect()->to($source);
-        }
-        $source = $request->get('redirect_url');
-        if($source){
-            Cookie::queue('month_pay_redirect',$source,600);
         }
-        $url = generateMonthOrderUrl($this->uid);
-        $h5_scheme = env('PROTOCOL', 'https');
-
-        $refer = str_replace('http://', $h5_scheme . '://', url()->current());
-        \Log::info('$refer is :'.$refer);
-        return redirect()->to($url)->withHeaders([
-            'Referer'=>$refer
-        ]);
-    }*/
+        $init_order = [
+            'distribution_channel_id' => $distribution_channel_id,
+            'uid' => $uid,
+            'product_id' => 6826,
+            'price' => 30,
+            'pay_type' => $count,
+            'trade_no' => $trade_no,
+            'pay_merchant_source' => 'MONTH',
+            'pay_merchant_id' => 99,
+            'create_ip' => '',
+            'send_order_id' => $send_order_id,
+            'send_order_name' => $send_order_name,
+            'order_type' => 'RECHARGE',
+            'from_bid' => '0',
+            'from_type' => 'auto_month',
+            'activity_id' => 0,
+            'inner_send_order_id' => '',
+            'status'=>'UNPAID',
+            'transaction_id'=>''
+        ];
+        $init_order['pay_end_at'] = '0000-00-00 00:00:00';
+        $info = Order::create($init_order);
+        return redirect()->to(generateMonthOrderUrl($info->id));
+    }
 
     private function monthPayExposureRecord($property,$openid){
         if (!$property) return '';

+ 154 - 41
app/Http/Controllers/Wap/Pay/MonthOrderController.php

@@ -8,6 +8,8 @@
 
 namespace App\Http\Controllers\Wap\Pay;
 
+use App\Jobs\SendTexts;
+use App\Modules\OfficialAccount\Services\OfficialAccountService;
 use App\Modules\SendOrder\Services\SendOrderService;
 use App\Modules\Subscribe\Models\Order;
 use App\Modules\Subscribe\Services\OrderService;
@@ -23,7 +25,8 @@ use Redis;
 class MonthOrderController extends Controller
 {
 
-    public function getH5RedirectUrl(Request $request){
+    public function getH5RedirectUrl(Request $request)
+    {
         $app_id = 'Aekgrv87yo5wxnl715';
         $app_secret = '57gwsnd158ib2sn7wluq5716brp8fzm';
         $key = 'sn7wluq5716brp8fzm';
@@ -31,16 +34,17 @@ class MonthOrderController extends Controller
         $plan_id = 39603;
         $user_id = 10008;
         $ip = _getIp();
-        $sign = _sign(compact('app_id','app_secret','plan_id','user_id','ip'),$key.$key);
+        $sign = _sign(compact('app_id', 'app_secret', 'plan_id', 'user_id', 'ip'), $key . $key);
         $sign = strtoupper($sign);
         $client = new  Client();
-        Log::info(compact('app_id','app_secret','plan_id','user_id','ip','sign'));
-        $url = 'http://pap.manyuedu.org/h5.php?'.http_build_query(compact('app_id','app_secret','plan_id','user_id','ip','sign'));
+        Log::info(compact('app_id', 'app_secret', 'plan_id', 'user_id', 'ip', 'sign'));
+        $url = 'http://pap.manyuedu.org/h5.php?' . http_build_query(compact('app_id', 'app_secret', 'plan_id', 'user_id', 'ip', 'sign'));
         //$url = 'http://pap.manyuedu.org/?'.http_build_query(compact('app_id','app_secret','plan_id','user_id','ip','sign'));
         return $client->get($url)->getBody()->getContents();
     }
 
-    public function getWechatRedirectUrl(Request $request){
+    public function getWechatRedirectUrl(Request $request)
+    {
         $app_id = 'Aekgrv87yo5wxnl715';
         $app_secret = '57gwsnd158ib2sn7wluq5716brp8fzm';
         $key = 'sn7wluq5716brp8fzm';
@@ -48,17 +52,18 @@ class MonthOrderController extends Controller
         $plan_id = 39603;
         $user_id = 10008;
         $ip = _getIp();
-        $sign = _sign(compact('app_id','app_secret','plan_id','user_id','ip'),$key.$key);
+        $sign = _sign(compact('app_id', 'app_secret', 'plan_id', 'user_id', 'ip'), $key . $key);
         $sign = strtoupper($sign);
         $client = new  Client();
-        Log::info(compact('app_id','app_secret','plan_id','user_id','ip','sign'));
+        Log::info(compact('app_id', 'app_secret', 'plan_id', 'user_id', 'ip', 'sign'));
         //$url = 'http://pap.manyuedu.org/h5.php?'.http_build_query(compact('app_id','app_secret','plan_id','user_id','ip','sign'));
-        $url = 'http://pap.manyuedu.org/?'.http_build_query(compact('app_id','app_secret','plan_id','user_id','ip','sign'));
+        $url = 'http://pap.manyuedu.org/?' . http_build_query(compact('app_id', 'app_secret', 'plan_id', 'user_id', 'ip', 'sign'));
         return $client->get($url)->getBody()->getContents();
     }
 
 
-    public function signCallBack(Request $request){
+    public function signCallBack(Request $request)
+    {
         Log::info('signCallBack------------------------------------------signCallBack');
         Log::info($request->all());
         Log::info($request->getMethod());
@@ -68,40 +73,91 @@ class MonthOrderController extends Controller
         $plan_id = $request->post('plan_id');
         $user_id = $request->post('user_id');
         $change_type = $request->post('change_type');
-        if($check = checkParam($request->except('_url'),['app_id','plan_id','user_id','change_type'])){
-            return response()->error('PARAM_EMPTY',['msg'=>$check]);
+        if ($check = checkParam($request->except('_url'), ['app_id', 'plan_id', 'user_id', 'change_type'])) {
+            //return response()->error('PARAM_EMPTY', ['msg' => $check]);
+            return response('fail');
         }
-        $sign = _sign(compact('app_id','plan_id','user_id','change_type'),$key.$key);
+        $sign = _sign(compact('app_id', 'plan_id', 'user_id', 'change_type'), $key . $key);
         $sign = strtoupper($sign);
         $user_info = UserService::getById($user_id);
-        if($sign == $request->post('sign')){
-            UserMonthService::createSign($user_id,$plan_id,$change_type,$user_info->openid);
+        if (!$user_info) {
+            Log::error('signCallBack user is not exist,uid is :' . $user_id);
+            return response('fail');
+        }
+        if ($sign == $request->post('sign')) {
+            UserMonthService::createSign($user_id, $plan_id, $change_type, $user_info->openid);
         }
         Log::info('signCallBack-------------------end-----------------------signCallBack');
         return response('success');
     }
 
-    public function orderCallBack(Request $request){
+
+    public function orderCallBackV2(Request $request)
+    {
+        Log::info('orderCallBack------------------------------------------orderCallBack');
+        Log::info($request->all());
+        Log::info($request->getMethod());
+
+        $key = env('MONTH_ORDER_KEY');//'sn7wluq5716brp8fzm';
+        $app_id = $request->post('app_id');
+        $plan_id = $request->post('plan_id', 0);
+        $user_id = $request->post('user_id');
+        $total_fee = $request->post('total_fee');
+        $trade_no = $request->post('trade_no');
+        $out_trade_no = $request->post('out_trade_no');
+        if ($check = checkParam($request->except('_url'), ['app_id', 'user_id', 'total_fee', 'trade_no', 'out_trade_no'])) {
+            return response()->error('PARAM_EMPTY', ['msg' => $check]);
+        }
+        $sign = _sign(compact('app_id', 'user_id', 'total_fee', 'trade_no', 'out_trade_no'), $key . $key);
+        $sign = strtoupper($sign);
+        Log::info('self sign is: ' . $sign);
+        $order_info = Order::find($user_id);
+        if (!$order_info) {
+            Log::error('month order not exist !!!order is :' . $trade_no);
+            return response('fail');
+        }
+        if ($order_info->status == 'PAID') {
+            Log::error('month order had deal !!!, order is :' . $trade_no);
+            return response('fail');
+        }
+        //if($sign == $request->post('sign')){
+        if (!UserMonthService::getOrderByOrder($trade_no, $out_trade_no)) {
+            UserMonthService::createLOrder($order_info->uid, $plan_id, $total_fee, $trade_no, $out_trade_no);
+            $order_info->transaction_id = $trade_no;
+            $order_info->status = 'PAID';
+            $order_info->pay_end_at = date('Y-m-d H:i:s');
+            $order_info->save();
+            self::addOrderAndVipV2($order_info->uid, $total_fee);
+        }
+        //}
+
+        Log::info('orderCallBack--------------------endend----------------------orderCallBack');
+        return response('success');
+    }
+
+    public function orderCallBack(Request $request)
+    {
         Log::info('orderCallBack------------------------------------------orderCallBack');
         Log::info($request->all());
         Log::info($request->getMethod());
 
         $key = env('MONTH_ORDER_KEY');//'sn7wluq5716brp8fzm';
         $app_id = $request->post('app_id');
-        $plan_id = $request->post('plan_id',0);
+        $plan_id = $request->post('plan_id', 0);
         $user_id = $request->post('user_id');
         $total_fee = $request->post('total_fee');
         $trade_no = $request->post('trade_no');
         $out_trade_no = $request->post('out_trade_no');
-        if($check = checkParam($request->except('_url'),['app_id','user_id','total_fee','trade_no','out_trade_no'])){
-            return response()->error('PARAM_EMPTY',['msg'=>$check]);
+        if ($check = checkParam($request->except('_url'), ['app_id', 'user_id', 'total_fee', 'trade_no', 'out_trade_no'])) {
+            return response()->error('PARAM_EMPTY', ['msg' => $check]);
         }
-        $sign = _sign(compact('app_id','user_id','total_fee','trade_no','out_trade_no'),$key.$key);
+        $sign = _sign(compact('app_id', 'user_id', 'total_fee', 'trade_no', 'out_trade_no'), $key . $key);
         $sign = strtoupper($sign);
         //if($sign == $request->post('sign')){
-        if(!UserMonthService::getOrderByOrder($trade_no,$out_trade_no)){
-            UserMonthService::createLOrder($user_id,$plan_id,$total_fee,$trade_no,$out_trade_no);
-            self::addOrderAndVip($user_id,$out_trade_no,$trade_no,$total_fee);
+        if (!UserMonthService::getOrderByOrder($trade_no, $out_trade_no)) {
+            UserMonthService::createLOrder($user_id, $plan_id, $total_fee, $trade_no, $out_trade_no);
+            $this->addOrderAndVip($user_id, $out_trade_no, $trade_no, $total_fee);
+            $this->successPayPushMsg($user_id);
         }
         //}
 
@@ -109,25 +165,43 @@ class MonthOrderController extends Controller
         return response('success');
     }
 
-    private function addOrderAndVip($uid,$out_trade_no,$trade_no,$price){
+
+    private function addOrderAndVip($uid, $out_trade_no, $trade_no, $price)
+    {
 
         $order_info = OrderService::getByTradeNo($out_trade_no);
         //订单已经存在
-        if($order_info){
-            return ;
+        if ($order_info) {
+            return;
         }
         $user_info = UserService::getById($uid);
-        if(!$user_info) return ;
-        $this->createOrder($uid,$user_info->distribution_channel_id,0,$price,$out_trade_no,$trade_no);
+        if (!$user_info) return;
+        $this->createOrder($uid, $user_info->distribution_channel_id, 0, $price, $out_trade_no, $trade_no);
+        YearOrderService::save_month_order([
+            'uid' => $uid,
+            'distribution_channel_id' => $user_info->distribution_channel_id,
+            'fee' => $price / 100,
+            'send_order_id' => 0
+        ]);
+    }
+
+    private function addOrderAndVipV2($uid, $price)
+    {
+
+
+        $user_info = UserService::getById($uid);
+        if (!$user_info) return;
+
         YearOrderService::save_month_order([
-            'uid'=>$uid,
-            'distribution_channel_id'=>$user_info->distribution_channel_id,
-            'fee'=>$price / 100,
-            'send_order_id'=>0
+            'uid' => $uid,
+            'distribution_channel_id' => $user_info->distribution_channel_id,
+            'fee' => $price / 100,
+            'send_order_id' => 0
         ]);
     }
 
-    private function createOrder($uid,$distribution_channel_id,$product_id,$price,$trade_no,$transaction_id){
+    private function createOrder($uid, $distribution_channel_id, $product_id, $price, $trade_no, $transaction_id)
+    {
         $count = OrderService::getUserChargeTimes($uid);
         $count = $count + 1;
         $send_order_id = 0;
@@ -159,34 +233,73 @@ class MonthOrderController extends Controller
             'from_type' => 'auto_month',
             'activity_id' => 0,
             'inner_send_order_id' => '',
-            'status'=>'PAID',
-            'transaction_id'=>$transaction_id,
-            'pay_end_at'=>date('Y-m-d H:i:s')
+            'status' => 'PAID',
+            'transaction_id' => $transaction_id,
+            'pay_end_at' => date('Y-m-d H:i:s')
         ];
         OrderService::save_order($init_order);
     }
 
-    public function wait(Request $request){
+    public function wait(Request $request)
+    {
         //$user_cookie = \Cookie::get(env('COOKIE_AUTH_WEB_WECHAT'));
         //$uid = $user_cookie ? decrypt($user_cookie) : null;
         $r = $request->get('r');
         $r = urldecode($r);
-        return view('pay.order.monthpaywait',['url'=>$r]);
+        return view('pay.order.monthpaywait', ['url' => $r]);
     }
 
-    public function issuccess(Request $request){
+    public function issuccess(Request $request)
+    {
         $uid = \Cookie::get(env('COOKIE_AUTH_WEB_WECHAT'));
         //$uid = $user_cookie ? decrypt($user_cookie) : null;
-        if(!$uid){
+        if (!$uid) {
             return response()->success();
         }
         $last = UserMonthService::getLastOrder($uid);
-        if(!$last){
+        if (!$last) {
             return response()->error('WAP_SYS_ERROR');
         }
-        if(time()-strtotime($last->created_at) <20){
+        if (time() - strtotime($last->created_at) < 20) {
             return response()->success();
         }
         return response()->error('WAP_SYS_ERROR');
     }
+
+    protected function successPayPushMsg($uid)
+    {
+        try {
+            $force_sub_info = DB::table('force_subscribe_users')->where('uid', $uid)->where('is_subscribed', 1)->first();
+            $data = UserService::getById($uid);
+            if (!$force_sub_info) {
+                return;
+            }
+
+            $content_format = "包月购买成功通知:\r\n\r\n购买类型: 30元包月\r\n\r\n><a href='%s'>点击继续上次阅读</a>\r\n\r\n为了方便阅读,请<a href='%s'>置顶公众号</a>\r\n\r\n为了方便阅读,请<a href='%s'>置顶公众号</a>\r\n\r\n为了方便阅读,请<a href='%s'>置顶公众号</a>";
+
+            $delay = 0;
+            $url = env('PROTOCOL') . '://site' . encodeDistributionChannelId($data->distribution_channel_id) . '.' . env('CUSTOM_HOST') . '.com/continue';;
+            $top_url = 'https://help.zhuishuyun.com/top.html';
+
+            $content = sprintf($content_format, $url, $top_url, $top_url, $top_url);
+
+            $res['openid'] = $force_sub_info->openid;
+            $res['appid'] = $force_sub_info->appid;
+            $res['content'] = $content;
+            $res['type'] = 'one_task';
+            $res['send_time'] = date("Y-m-d H:i:s");
+            $res['task_id'] = md5('month_pay_success_push');
+            $send_data = array(
+                'send_time' => date("Y-m-d H:i:s"),
+                'data' => $res
+            );
+            dispatch((new SendTexts($send_data))->onConnection('rabbitmq')->delay($delay)->onQueue('send_texts_list'));
+
+
+        } catch (\Exception $e) {
+            Log::error('pay_success_push error');
+            Log::error($e);
+        }
+        return;
+    }
 }

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

@@ -2199,6 +2199,7 @@ class WelcomeController extends BaseController
                     'price'=>'30元',
                     'text' => '30元包月 全站万本精彩小说免费看',
                     'link'=> generateMonthOrderUrl($this->uid)
+                    //'link'=> '/rmonthpay'
                 ];
             }
         }

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

@@ -308,6 +308,8 @@ Route::group(['domain'=>env('WAP_DOMAIN'),'namespace'=>'App\Http\Controllers\Wap
         //随机每日领5-15书币
         Route::get('randSign','User\UserController@day_rand_sign');
 
+        Route::get('rmonthpay','Order\OrdersController@monthPay');
+
         Route::any('{slug}','Web\WelcomeController@index')->where('slug', '(.*)?');
 
     });

+ 12 - 0
app/Modules/User/Services/UserMonthService.php

@@ -10,6 +10,7 @@ namespace App\Modules\User\Services;
 
 use App\Modules\User\Models\UserMonthOrder;
 use App\Modules\User\Models\UserMonthSign;
+use GuzzleHttp\Client;
 
 class UserMonthService
 {
@@ -57,4 +58,15 @@ class UserMonthService
         $info = $model->where('trade_no',$trade_no)->first();
         return $info;
     }
+
+    public static function checkOrderStatus(int $user_id,int $plan_id,string $app_id,string $key,string $app_secret){
+        $pay_year = date('Y');
+        $pay_month = date('m');
+        $sign = strtoupper(_sign(compact('app_id','app_secret','user_id','plan_id','pay_year','pay_month'),$key.$key));
+        $client = new Client();
+        $url = 'http://pap.manyuedu.org/checkpay.php?';
+        $url .= http_build_query(compact('user_id','app_secret','app_id','plan_id','pay_year','pay_month','sign'));
+        $result = $client->request('post',$url)->getBody()->getContents();
+        return json_decode($result,true);
+    }
 }

+ 115 - 0
app/Modules/User/Services/UserService.php

@@ -8,8 +8,16 @@
 
 namespace App\Modules\User\Services;
 
+use App\Modules\Book\Models\BookGiftsSend;
+use App\Modules\Book\Models\UserShelfBooks;
+use App\Modules\Book\Services\UserShelfBooksService;
+use App\Modules\Subscribe\Models\BookOrder;
+use App\Modules\Subscribe\Models\ChapterOrder;
+use App\Modules\Subscribe\Services\BookOrderService;
+use App\Modules\Subscribe\Services\ChapterOrderService;
 use App\Modules\User\Models\User;
 use App\Modules\User\Models\UserEnv;
+use App\Modules\User\Models\UserSign;
 use DB;
 use App\Jobs\ActionTrigger;
 use App\Modules\OfficialAccount\Models\DistributionSelfDefineConfig;
@@ -359,4 +367,111 @@ WHERE u.openid in (SELECT openid from users WHERE  id = %s)";
     {
         return UserEnv::recordUA($ua,$uid);
     }
+
+    public static function transfer(int $from,int $to,int $distribution_channel_id){
+        //阅读记录迁移***************************************
+        $record = Redis::hgetall('book_read:'.$from);
+        $not_uid_key = ['last_read','sign_counts','sign_info','sign_day'];
+        $data = [];
+        foreach ($record as $k=>$item){
+            if(is_numeric($k) || in_array($k,$not_uid_key)){
+                $data[$k] = $item;
+            }
+        }
+        if($data) Redis::hmset('book_read:'.$to,$data);
+        //签到记录
+        $user_sign_model = new UserSign();
+        $user_sign_model->setCurrentTable(date('Ym'));
+        $sign_record = $user_sign_model->where('uid',$from)->select('price','sign_time','day','created_at')->orderBy('sign_time','desc')->get();
+        $temp = [];
+        if($sign_record){
+            foreach ($sign_record as $item){
+                $temp[] = [
+                    'uid'=>$to,
+                    'price'=>$item->price,
+                    'day'=>$item->day,
+                    'sign_time'=>$item->sign_time,
+                    'created_at'=>$item->created_at,
+                    'updated_at'=>date('Y-m-d H:i:s'),
+                ];
+            }
+            DB::table('user_sign'.date('Ym'))->insert($temp);
+        }
+        //订阅记录(按本)
+        $book_order = BookOrder::where('uid',$from)->where('bid','>',0)->get();
+        if($book_order){
+            $temp = [];
+            foreach ($book_order as $book){
+                $temp[] = [
+                    'distribution_channel_id'=>$distribution_channel_id,
+                    'bid'=>$book->bid,
+                    'book_name'=>$book->book_name,
+                    'uid'=>$to,
+                    'u'=>$book->u,
+                    'fee'=>0,
+                    'created_at'=>$book->created_at,
+                    'updated_at'=>date('Y-m-d H:i:s'),
+                ];
+            }
+            DB::table('book_orders')->insert($temp);
+        }
+        //订阅记录(按章)
+        $chapter_order_record = ChapterOrderService::getRecordByUid($from,'','',true);
+        if($chapter_order_record){
+            $temp = [];
+            $i = 1;
+            $chapter_model = new ChapterOrder();
+            $chapter_model->setCurrentTable($to);
+            foreach ($chapter_order_record as $chapter_order){
+                $temp[] = [
+                    'distribution_channel_id'=>$distribution_channel_id,
+                    'bid'=>$chapter_order->bid,
+                    'cid'=>$chapter_order->cid,
+                    'chapter_name'=>$chapter_order->chapter_name,
+                    'book_name'=>$chapter_order->book_name,
+                    'uid'=>$to,
+                    'send_order_id'=>0,
+                    'fee'=>0,
+                    'created_at'=>$chapter_order->created_at,
+                    'updated_at'=>date('Y-m-d H:i:s')
+                ];
+            }
+            $chapter_model->insert($temp);
+        }
+        //打赏记录
+        $gift_result = BookGiftsSend::where('uid',$from)->get();
+        if($gift_result){
+            $tmp = [];
+            foreach ($gift_result as $g){
+                $tmp[] =  [
+                    'uid'=>$to,
+                    'gift_id'=>$g->gift_id,
+                    'bid'=>$g->bid,
+                    'icon'=>$g->icon,
+                    'name_desc'=>$g->name_desc,
+                    'cost'=>$g->cost,
+                    'cost_reward'=>$g->cost_reward,
+                    'cost_recharge'=>$g->cost_recharge,
+                    'created_at'=>$g->created_at,
+                    'updated_at'=>date('Y-m-d H:i:s')
+                ];
+            }
+            DB::table('book_gifts_send')->insert($tmp);
+        }
+        //书架
+        $result = UserShelfBooks::where('uid',$from)->get();
+        if($result){
+            $tmp = [];
+            foreach ($result as $s){
+                $tmp[] = [
+                    'uid'=>$to,
+                    'distribution_channel_id'=>$distribution_channel_id,
+                    'bid'=>$s->bid,
+                    'created_at'=>$s->created_at,
+                    'updated_at'=>date('Y-m-d H:i:s')
+                ];
+            }
+            DB::table('user_shelf_books')->insert($tmp);
+        }
+    }
 }