Jelajahi Sumber

Merge branch 'stabble' of iqiyoo:zhuishuyun_wap into zhoulj

onlinetest 6 tahun lalu
induk
melakukan
2040a36416
30 mengubah file dengan 1600 tambahan dan 6528102 penghapusan
  1. 154 0
      app/Http/Controllers/Wap/Advertises/AdvertiseController.php
  2. 19 0
      app/Http/Controllers/Wap/Advertises/Transformers/AdvertiseTransformer.php
  3. 7 7
      app/Http/Controllers/Wap/BaseController.php
  4. 30 1
      app/Http/Controllers/Wap/Book/ChapterController.php
  5. 77 9
      app/Http/Controllers/Wap/Order/OrdersController.php
  6. 5 10
      app/Http/Controllers/Wap/Pay/OrdersController.php
  7. 80 59
      app/Http/Controllers/Wap/Subscribe/LinkSubscribeController.php
  8. 9 0
      app/Http/Controllers/Wap/User/ReadRecordController.php
  9. 2 1
      app/Http/Controllers/Wap/User/Transformers/ReadRecordTransformer.php
  10. 57 3
      app/Http/Controllers/Wap/Web/RedirectController.php
  11. 75 4
      app/Http/Controllers/Wap/Web/WelcomeController.php
  12. 10 8
      app/Http/Middleware/ReadOauth.php
  13. 4 0
      app/Http/Routes/Wap/WapRoutes.php
  14. 2 1
      app/Libs/Helpers.php
  15. 23 0
      app/Modules/Cpa/Models/Advertise.php
  16. 29 0
      app/Modules/Cpa/Models/AdvertiseUserQueque.php
  17. 39 0
      app/Modules/Cpa/Models/AdvertiseUsers.php
  18. 22 0
      app/Modules/Cpa/Services/AdvertiseService.php
  19. 27 0
      app/Modules/Cpa/Services/AdvertiseUserQueueService.php
  20. 30 0
      app/Modules/Cpa/Services/AdvertiseUsersService.php
  21. 20 0
      app/Modules/Subscribe/Services/OrderService.php
  22. 101 0
      app/Modules/User/Services/ForceSubscribeUserIService.php
  23. 5 1
      app/Modules/User/Services/UserSignService.php
  24. 0 6527971
      nohup.out
  25. TEMPAT SAMPAH
      public/static/img/banner.jpg
  26. TEMPAT SAMPAH
      public/static/img/mask.png
  27. 200 0
      resources/views/wap/advertise.blade.php
  28. 4 4
      resources/views/wap/index.blade.php
  29. 23 23
      resources/views/wap/subscribeV2.blade.php
  30. 546 0
      resources/views/wap/subscribeV3.blade.php

+ 154 - 0
app/Http/Controllers/Wap/Advertises/AdvertiseController.php

@@ -0,0 +1,154 @@
+<?php
+
+namespace App\Http\Controllers\Wap\Advertises;
+
+use App\Http\Controllers\Wap\BaseController;
+
+use App\Modules\Cpa\Services\AdvertiseService;
+use App\Modules\Cpa\Services\AdvertiseUsersService;
+use App\Modules\Book\Services\BookConfigService;
+use App\Modules\Cpa\Services\AdvertiseUserQueueService;
+use App\Modules\User\Services\ReadRecordService;
+use Illuminate\Http\Request;
+use Redis;
+use Hashids;
+use DB;
+
+class AdvertiseController extends BaseController
+{
+    public function jump(Request $request){
+        //$bid=$request->input('bid','');
+        $uid_pre=$request->input('uid','');
+        if(empty($uid_pre)){
+            return response()->error('PARAM_ERROR');
+        }
+        $uid = Hashids::decode($uid_pre)[0];
+        \Log::info('---uid:'.$uid);
+        $bid= ReadRecordService::getSimpleFirstReadRecord($uid);   //TODO 获取最近阅读
+        $books_info = BookConfigService::getBookById($bid);
+        $book_name=$books_info->book_name;
+        //$bid=$books_info[''];
+        Redis::incr("advertise_jump_h5_pv:");
+
+        $uid=$uid_pre;
+        $ads = $this->getOneAd(1);
+        $timestamp = time();
+        $private_key = '^^zhuishuyun';
+        $bid=Hashids::encode($bid);
+        $pre_str = arr_to_url(compact('bid','uid','timestamp'));
+        \Log::info('pre_str:'.$pre_str);
+        $my_sign = md5($pre_str.$private_key);
+        $ua = $_SERVER['HTTP_USER_AGENT'];
+        $my_bid = $bid;
+        if($my_bid && preg_match('/Android/',$ua)) {
+            try{
+                AdvertiseUsersService::addAdAccessRec(['uid'=>Hashids::decode($uid)[0],
+                    'bid'=>Hashids::decode($my_bid)[0],
+                    'position'=>'JUMP',
+                    'created_at'=>date('Y-m-d H:i:s'),
+                    'updated_at'=>date('Y-m-d H:i:s'),
+                    'remark'=>$ua
+                ]);
+            }catch(\Exception $e){
+                \Log::error('insert into advertise_access_rec failded:'.$e->getMessage());
+            }
+        }
+        return view('wap.advertise',['params'=>compact('bid','book_name','uid','timestamp','my_sign'),'ads'=>$ads]);
+    }
+
+    public function jumpToSource(Request $request){
+        $bid=$request->input('bid','');
+        $uid=$request->input('uid','');
+        $ad =$request->input('ad','');
+        $timestamp = $request->input('timestamp','');
+        $sign = $request->input('sign','');
+        if(empty($bid)||empty($uid)||empty($ad)){
+            return response()->error('PARAM_EMPTY');
+        }
+        //签名
+        $pre_str = arr_to_url(compact('bid','uid','timestamp'));
+        \Log::info('my_pre_str:'.$pre_str);
+        $private_key = '^^zhuishuyun';
+        $my_sign = md5($pre_str.$private_key);
+        //签名时间超过两小时过期
+        $now = time();
+        if(($now-$timestamp) > 60*60*2){
+            return response()->error('PARAM_ERROR');
+        }
+        if($my_sign != $sign){
+            return response()->error('PARAM_ERROR');
+        }
+        \Log::info('ad:'.$ad);
+        $bid=Hashids::decode($bid)[0];
+        $uid = Hashids::decode($uid)[0];
+        \Log::info('bid:'.$bid.':uid:'.$uid);
+        $AdUers = AdvertiseUsersService::addOrUpdateAdUsers(['bid'=>$bid,'uid'=>$uid,'advertise_id'=>$ad]);
+        \Log::info('ad_users:'.$AdUers);
+        \Log::info('ad_users:----');
+        $toQueue = array(
+            'uid'=>$uid,
+            'bid'=>$bid,
+            'ad_user_id'=>$AdUers->id,
+            'advertise_id'=>$ad,
+            //'add_time'=>time(),
+            'status'=>0
+        );
+        AdvertiseUserQueueService::addToQueue($toQueue);
+        $adInfo = AdvertiseService::getOneById($ad);
+        \Log::info($adInfo);
+        header('Location:'.($adInfo->source_url));
+    }
+
+    public function getAds(Request $request){
+        $uid=$request->input('uid','');
+        if(empty($uid)) {
+            return response()->error('PARAM_EMPTY');
+        }
+        $ads = AdvertiseService::getAds();
+        foreach ($ads as &$ad){
+            $adv = AdvertiseUsersService::getOne(['uid'=>$uid,'advertise_id'=>$ad->advertise_id]);
+            if($adv){
+                $ad->is_download=1;
+            }else{
+                $ad->is_download =0;
+            }
+        }
+        return response()->success($ads);
+    }
+
+    private static function getAdvs($uid) {
+        $ads = AdvertiseService::getAds();
+        foreach ($ads as &$ad){
+            $adv = AdvertiseUsersService::getOne(['uid'=>$uid,'advertise_id'=>$ad->advertise_id]);
+            if($adv){
+                $ad->is_download=1;
+            }else{
+                $ad->is_download =0;
+            }
+        }
+        return $ads;
+    }
+    private function getOneAd($id) {
+        $ads = AdvertiseService::getOneById($id);
+        return $ads;
+    }
+
+    /**
+     * 点击下载按钮上报
+     * @param Request $request
+     * @return mixed
+     */
+    public function recieveUserBehavior(Request $request){
+        $uid = $request->input('uid','');
+        $bid = $request->input('bid','');
+        $uid=Hashids::decode($uid)[0];
+        $bid=Hashids::decode($bid)[0];
+        $position = $request->input('position','');
+        $params = compact('uid','bid','position');
+        $params['created_at'] = $params['updated_at'] = date('Y-m-d H:i:s');
+        $ua = $_SERVER['HTTP_USER_AGENT'];
+        $params['remark'] = $ua;
+        DB::table('advertise_access_rec')->insert($params);
+        return response()->success();
+    }
+}

+ 19 - 0
app/Http/Controllers/Wap/Advertises/Transformers/AdvertiseTransformer.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace App\Http\Controllers\Wap\Advertise\Transformers;
+
+class AdvertiseTransformer
+{
+    public function transform($order){
+        return [
+            'merchant_order_id'       =>  $order->merchant_order_id,
+            'user_id'       =>  $order->user_id,
+            'user_nickname'       =>  $order->user_nickname,
+            'pay_money'       =>  (int)$order->pay_money/100,
+            'pay_flag'   =>  $order->pay_flag,
+            'pay_time'   =>  $order->pay_time ? date('Y-m-d H:i:s',$order->pay_time) : '',
+            'send_order_id' => isset($order->send_order_id) ? $order->send_order_id : 0,
+            'send_order_name' => isset($order->send_order_name) ? $order->send_order_name : ''
+        ];
+    }
+}

+ 7 - 7
app/Http/Controllers/Wap/BaseController.php

@@ -74,14 +74,14 @@ class BaseController extends Controller
                 $this->uid = $auth_uid;
             }
         }
-        $send_order_id = Cookie::get('send_order_id');
-        if(!$send_order_id){
-            if($this->uid){
-                $send_order_id = ReadRecordService::getSendOrderId($this->uid);
-            }else{
-                $send_order_id = 0;
-            }
+        //$send_order_id = Cookie::get('send_order_id');
+
+        if($this->uid){
+            $send_order_id = ReadRecordService::getSendOrderId($this->uid);
+        }else{
+            $send_order_id = 0;
         }
+
         if($this->uid == 114933690) {
             $this->uid = 108535910;
         }

+ 30 - 1
app/Http/Controllers/Wap/Book/ChapterController.php

@@ -13,6 +13,7 @@ use App\Modules\Statistic\Services\DataAnalysisChapterService;
 use App\Modules\Statistic\Services\DataAnalysisSelectUserService;
 use App\Modules\Statistic\Services\WapVisitStatService;
 use App\Modules\Subscribe\Services\OrderService;
+use App\Modules\User\Services\ForceSubscribeUserIService;
 use App\Modules\User\Services\ReadRecordStatsService;
 use App\Modules\YunQi\Services\BookUserService;
 use Illuminate\Http\Request;
@@ -70,6 +71,10 @@ class ChapterController extends BaseController
     //强关时间
     private $force_subscribe_time = null;
 
+    //关注的appid
+    private  $need_subscribe_appid;
+    private  $need_subscribe_name;
+
     /**
      * @apiVersion 1.0.0
      * @apiDescription 章节列表不分页
@@ -586,6 +591,7 @@ class ChapterController extends BaseController
                     $my_log->info('balance lack remind');
                 }
                 return response()->error('WAP_BOOK_BALANCE_PAY', $data);
+                //return response()->error('WAP_BOOK_SECOND_BALANCE_PAY', $data);
             } else {
                 if($special_user_log && $special_user_log == $this->uid){
                     $my_log = myLog('special');
@@ -828,12 +834,17 @@ class ChapterController extends BaseController
 
     private function forceSubscribe()
     {
+        if($this->need_subscribe_appid){
+            $src = $this->getRcodeInfo(['appid' => $this->need_subscribe_appid], $this->book_info->bid);
+            if (empty($src)) return false;
+            $url = '/subscribe/qrcode?img=' . urlencode($src) . '&title=' . $this->need_subscribe_name . '&uid=' . $this->uid;
+            return ['error_type' => 'WAP_NOT_SUBSCRIBE', 'data' => ['src' => $url, 'head_img' => '']];
+        }
         //获取公众号信息
         $officialAccount = $this->getOfficialAccount();
         if (!$officialAccount || empty($officialAccount->appid)) {
             return false;
         }
-
         //如果是链接强关,则跳转
         $sub_type = $this->getSubscribeType($officialAccount->appid, $this->book_info->bid);
 
@@ -1078,6 +1089,16 @@ class ChapterController extends BaseController
      */
     protected function getSubscribe()
     {
+        if($this->send_order_id &&
+            in_array($this->distribution_channel_id,explode(',',env('INNER_CHANNEL_SUB','1'))) &&
+            ($send_order_info = SendOrderService::getById($this->send_order_id)) &&
+            $send_order_info->promotion_type == 'EXTERNAL'
+        ){
+            $subscribe_info = ForceSubscribeUserIService::subscribes($this->uid,$this->distribution_channel_id,$this->send_order_id);
+            $this->need_subscribe_appid = $subscribe_info['appid'];
+            $this->need_subscribe_name = $subscribe_info['name'];
+            return $subscribe_info['is_subscribed'];
+        }
         $res = ForceSubscribeService::forceSubscribeUsersByUid(['uid' => $this->uid]);
         if ($res) {
             $this->force_subscribe_time = isset($res->created_at)?$res->created_at:null;
@@ -1396,6 +1417,14 @@ class ChapterController extends BaseController
     private function isOffShelf()
     {
         $book_info = $this->book_info;
+
+        //针对米玩站点部分图书放开
+        $miwan_sites = [4340,4834,4842,4992,5014,5021,5030,5035,5036,5037,5042,5043,5048,5049,5051,5066,5075,5094,5095,5096,5106,5110,5111,5112,5122,5131,5157,5167,5180,5189,5232,5234,5237,5238,5240];
+        if(in_array($this->distribution_channel_id,$miwan_sites) && in_array($book_info->bid,[1154,1232,1276,1295,1535,1542,1629,2430,4437,4730]))
+        {
+            return false;
+        }
+
         if ($book_info->is_on_shelf == 0 || $book_info->is_on_shelf == 3) {
             return true;
         }

+ 77 - 9
app/Http/Controllers/Wap/Order/OrdersController.php

@@ -3,9 +3,14 @@
 namespace App\Http\Controllers\Wap\Order;
 
 use App\Http\Controllers\Wap\BaseController;
+use App\Modules\Book\Services\BookConfigService;
 use App\Modules\Channel\Services\ChannelService;
+use App\Modules\Cpa\Services\AdvertiseUserQueueService;
+use App\Modules\Cpa\Services\AdvertiseUsersService;
+use App\Modules\OfficialAccount\Services\ForceSubscribeService;
 use App\Modules\Statistic\Services\AdVisitStatService;
 use App\Modules\Statistic\Services\DataAnalysisSelectUserService;
+use App\Modules\User\Services\ForceSubscribeUserIService;
 use App\Modules\User\Services\UserService;
 use App\Modules\Book\Services\BookService;
 use App\Modules\Channel\Services\PayTemplateService;
@@ -28,7 +33,7 @@ class OrdersController extends BaseController
      * @apiDefine Order 订单
      */
 
-
+    private $force_subscribe_info;
     /**
      * @apiVersion 1.0.0
      * @apiDescription 充值列表
@@ -110,6 +115,7 @@ class OrdersController extends BaseController
 
             }*/
 
+
             foreach ($res as $v) {
                 $intro = [];
                 if ($v->given > 0 && $v->type == 'TICKET_RECHARGE') {
@@ -168,6 +174,7 @@ class OrdersController extends BaseController
                     'intro' => $intro,
                     'intro2' => $intro2,
                     'is_default' => $v->is_default,
+
                 ];
             }
             return response()->success($data);
@@ -193,13 +200,23 @@ class OrdersController extends BaseController
         //}
         \Log::info('order:$template_id:' . $template_id);
         \Log::info('order:$distribution_channel_id:' . ($this->distribution_channel_id));
-
+        $book_config = null;
+        if($bid){
+            $bid = Hashids::decode($bid)[0];
+            //$book = BookService::getBookById($bid);
+            $book_config = BookConfigService::getBookById($bid);
+        }
         if ($template_id == 2) { //模板2只有在长篇小说过来的用户才显示
             //部分渠道需要2元模板不管哪个入口进来都展示
             $exclude_channels = explode(',', env('PRICE_TWO_SHOW_ALL_CHANNEL'));
             if(!in_array($this->distribution_channel_id,$exclude_channels))
             {
-                if ($bid) {
+                if($book_config){
+                    if($book_config->charge_type == 'BOOK') $template_id = 1;
+                }else{
+                    //$template_id = 1;
+                }
+                /*if ($bid) {
                     $bid = Hashids::decode($bid)[0];
                     \Log::info('order:$bid:' . $bid);
                     $book = BookService::getBookById($bid);
@@ -209,10 +226,10 @@ class OrdersController extends BaseController
                     }
                 } else {
                     $template_id = 1;
-                }
+                }*/
             }
         }
-        if($temp){
+        /*if($temp){
             $temp_bid = 0;
             try{
                 $temp_bid =  Hashids::decode($temp)[0];
@@ -222,7 +239,7 @@ class OrdersController extends BaseController
             if ($t) {
                 $template_id = $t;
             }
-        }
+        }*/
 
         //男频站点 支付模板
         if( ($male_site_template = $this->maleSite($this->distribution_channel_id)) ){
@@ -259,7 +276,30 @@ class OrdersController extends BaseController
         //yqLog('user')->info('user is ',['user'=>$user]);
         //yqLog('user')->info('user is ',['charge_count'=>$user->charge_count]);
         $data = [];
+        $appad =0;
+        if(in_array($this->distribution_channel_id,explode(',',env('ADS_OPEN_SITE')))){
+            $appad = $this->appad();
+            $my_bid = $bid;
+            if($appad) {
+                try{
+                    AdvertiseUsersService::addAdAccessRec(['uid'=>$this->uid,
+                        'bid'=>$my_bid,
+                        'position'=>'RECHARGE',
+                        'created_at'=>date('Y-m-d H:i:s'),
+                        'updated_at'=>date('Y-m-d H:i:s'),
+                        'remark'=>$request->url()
+                    ]);
+                }catch(\Exception $e){
+                    \Log::error('insert into advertise_access_rec failded:'.$e->getMessage());
+                }
+            }
+        }
+        //\Log::info('ad-tu:uid:'.$uid.':'.$appad);
         foreach ($res as $v) {
+            if($template_id == 7 && $book_config && $book_config->charge_type == 'BOOK' && $v->price == 2){
+                continue;
+            }
+
             if ($v->type == 'NEW_USER' && $is_first_recharge) {
                 if (env('NO_NEW_USER_CHARGE') &&
                     in_array(
@@ -276,7 +316,8 @@ class OrdersController extends BaseController
                     'first_charge' => true,
                     'today_special' => false,
                     'save_text' => round($v->given / 100, 1) . '元',
-                    'product_id' => $v->id
+                    'product_id' => $v->id,
+                    'show_free_ads'=>$appad
                 ];
                 $data[] = $temp;
             } elseif ($v->type == 'YEAR_ORDER') {
@@ -292,7 +333,8 @@ class OrdersController extends BaseController
                     'first_charge' => false,
                     'today_special' => false,
                     'save_text' => $save_text,
-                    'product_id' => $v->id
+                    'product_id' => $v->id,
+                    'show_free_ads'=>$appad
                 ];
                 $data[] = $temp;
             } else {
@@ -314,7 +356,8 @@ class OrdersController extends BaseController
                     'first_charge' => false,
                     'today_special' => $v->is_default == 1 ? true : false,
                     'save_text' => $save_text,
-                    'product_id' => $v->id
+                    'product_id' => $v->id,
+                    'show_free_ads'=>$appad
                 ];
                 $data[] = $temp;
             }
@@ -696,4 +739,29 @@ class OrdersController extends BaseController
         return 0;
     }
 
+    private function appad(){
+        if($this->force_subscribe_info){
+            $force_subscribe_info = $this->force_subscribe_info;
+        }else{
+            $force_subscribe_info = $this->force_subscribe_info = ForceSubscribeService::forceSubscribeUsersByUid(['uid' => $this->uid]);
+        }
+        if(!$force_subscribe_info){
+            return 0;
+        }
+        //\Log::info('force1:'.json_encode($force_subscribe_info));
+        $force_sub_user_by_openid = ForceSubscribeUserIService::getForceSubscribeByUidOpenid($this->uid);
+        if($force_sub_user_by_openid){
+            $force_subscribe_info = $force_sub_user_by_openid;
+            //\Log::info('force:'.json_encode($force_subscribe_info));
+        }
+        if($force_subscribe_info->subscribe_time &&
+            (time()-strtotime($force_subscribe_info->subscribe_time) >=3*86400)
+            && !OrderService::isPaidUserByOpenid($force_subscribe_info->openid) &&
+            !AdvertiseUserQueueService::getUserAdvertise($this->uid) &&
+            in_array($this->distribution_channel_id,explode(',',env('ADS_OPEN_SITE')))
+        ){
+            return 1;
+        }
+        return 0;
+    }
 }

+ 5 - 10
app/Http/Controllers/Wap/Pay/OrdersController.php

@@ -181,13 +181,11 @@ class OrdersController extends Controller
         if ($uid < 32) {
             $price = 1;
         }
-        if (!$send_order_id) {
-            try {
-                $send_order_id = (int)Redis::hget('book_read:' . $uid, 'send_order_id');
-            } catch (\Exception $e) {
 
-            }
-        }
+        try {
+            $send_order_id = (int)Redis::hget('book_read:' . $uid, 'send_order_id');
+        } catch (\Exception $e) {}
+
         $this->updateUserSendOrderId($uid,$send_order_id);
         if (in_array($uid, explode(',', env('TEST_UID')))) {
             $price = 1;
@@ -195,10 +193,7 @@ class OrdersController extends Controller
         if ($bid) {
             try {
                 $bid = Hashids::decode($bid)[0];
-            } catch (\Exception $e) {
-                $bid = 0;
-            }
-
+            } catch (\Exception $e) {$bid = 0;}
         }
 
         try {

+ 80 - 59
app/Http/Controllers/Wap/Subscribe/LinkSubscribeController.php

@@ -2,6 +2,9 @@
 
 namespace App\Http\Controllers\Wap\Subscribe;
 
+use App\Modules\Cpa\Services\AdvertiseUserQueueService;
+use App\Modules\OfficialAccount\Services\ForceSubscribeService;
+use App\Modules\Subscribe\Services\OrderService;
 use Illuminate\Http\Request;
 use App\Http\Controllers\Controller;
 use App\Modules\Channel\Services\ChannelSubscribeSettingService;
@@ -11,22 +14,23 @@ use DB;
 
 class LinkSubscribeController extends Controller
 {
-    public function index(Request $request){
+    public function index(Request $request)
+    {
         $uid = $request->input('uid');
         $channel_id = $request->input('distribution_channel_id');
-        $send_order_id = $request->input('send_order_id',0);
+        $send_order_id = $request->input('send_order_id', 0);
         $appid = $request->input('appid');
-        $bid = $request->input('bid',0);
+        $bid = $request->input('bid', 0);
         $h5_scheme = env('H5_SCHEME', 'https');
-        if(empty($uid) || empty($appid)){
-            $auth_url =  $h5_scheme.'://'._domain();
-        }else{
+        if (empty($uid) || empty($appid)) {
+            $auth_url = $h5_scheme . '://' . _domain();
+        } else {
             $sub_setting = ChannelSubscribeSettingService::getSubscribeTypeByAppId($appid);
-            if($sub_setting  && strpos($sub_setting->force_subscribe_type,'3') !== false && !empty($sub_setting->resource_url)){
-                $url = $h5_scheme.'://'._domain().'/subauthback/?uid='.$uid.'&distribution_channel_id='.$channel_id.'&bid='.$bid.'&send_order_id='.$send_order_id.'&appid='.$appid;
-                $auth_url = env('QRCODE_AUTH_URL').'?gzh_app_id='.$appid.'&redirect_url='.urlencode($url);
-            }else{
-                $auth_url =  $h5_scheme.'://'._domain();
+            if ($sub_setting && strpos($sub_setting->force_subscribe_type, '3') !== false && !empty($sub_setting->resource_url)) {
+                $url = $h5_scheme . '://' . _domain() . '/subauthback/?uid=' . $uid . '&distribution_channel_id=' . $channel_id . '&bid=' . $bid . '&send_order_id=' . $send_order_id . '&appid=' . $appid;
+                $auth_url = env('QRCODE_AUTH_URL') . '?gzh_app_id=' . $appid . '&redirect_url=' . urlencode($url);
+            } else {
+                $auth_url = $h5_scheme . '://' . _domain();
             }
         }
         return redirect()->to($auth_url);
@@ -34,33 +38,35 @@ class LinkSubscribeController extends Controller
     }
 
 
-    public function wxAuthCallBack(Request $request){
+    public function wxAuthCallBack(Request $request)
+    {
         $uid = $request->input('uid');
-        $bid = $request->input('bid',0);
-        $channel_id = $request->input('distribution_channel_id',5);
+        $bid = $request->input('bid', 0);
+        $channel_id = $request->input('distribution_channel_id', 5);
         $openid = $request->input('openid');
         $appid = $request->input('appid');
-        $send_order_id = $request->input('send_order_id',0);
+        $send_order_id = $request->input('send_order_id', 0);
         $sub_setting = ChannelSubscribeSettingService::getSubscribeTypeByAppId($appid);
-        if($sub_setting  && !empty($sub_setting->resource_url)) {
-            Redis::hset('book:linksubscribe:openid:'.$openid.':channelid:'.$channel_id,'uid',$uid);
-            Redis::hset('book:linksubscribe:openid:'.$openid.':channelid:'.$channel_id,'bid',$bid);
-            Redis::hset('book:linksubscribe:openid:'.$openid.':channelid:'.$channel_id,'time',time());
-            Redis::hset('book:linksubscribe:openid:'.$openid.':channelid:'.$channel_id,'send_order_id',$send_order_id);
-            Redis::EXPIRE('book:linksubscribe:openid:'.$openid.':channelid:'.$channel_id,300);
-            Redis::hset('force_subscribe_from_bid',$appid.'_'.$uid,$bid);
-            Redis::hset('force_subscribe_from_send_order_id',$appid.'_'.$uid,$send_order_id);
+        if ($sub_setting && !empty($sub_setting->resource_url)) {
+            Redis::hset('book:linksubscribe:openid:' . $openid . ':channelid:' . $channel_id, 'uid', $uid);
+            Redis::hset('book:linksubscribe:openid:' . $openid . ':channelid:' . $channel_id, 'bid', $bid);
+            Redis::hset('book:linksubscribe:openid:' . $openid . ':channelid:' . $channel_id, 'time', time());
+            Redis::hset('book:linksubscribe:openid:' . $openid . ':channelid:' . $channel_id, 'send_order_id', $send_order_id);
+            Redis::EXPIRE('book:linksubscribe:openid:' . $openid . ':channelid:' . $channel_id, 300);
+            Redis::hset('force_subscribe_from_bid', $appid . '_' . $uid, $bid);
+            Redis::hset('force_subscribe_from_send_order_id', $appid . '_' . $uid, $send_order_id);
             return redirect()->to($sub_setting->resource_url);
-        }else{
+        } else {
             $h5_scheme = env('H5_SCHEME', 'https');
-            $auth_url =  $h5_scheme.'://site'.$channel_id.'.leyuee.com/';
+            $auth_url = $h5_scheme . '://site' . $channel_id . '.leyuee.com/';
             return redirect()->to($auth_url);
         }
     }
 
 
-    public function subscribeView(Request $request){
-        $title = $request->input('title','扫一扫');
+    public function subscribeView(Request $request)
+    {
+        $title = $request->input('title', '扫一扫');
         $img = $request->input('img');
         $head_img_pool = [
             'https://cdn-novel.iycdm.com/h5/subscribe/headimg/1.png',
@@ -69,57 +75,72 @@ class LinkSubscribeController extends Controller
         ];
         //$head_img = $request->input('head_img','');
         $num = Cookie::get('sub_random_num');
-        if(!$num){
-            $num = random_int(10,20);
+        if (!$num) {
+            $num = random_int(10, 20);
             Cookie::queue('sub_random_num', $num);
         }
         $uid = $request->get('uid');
         $head_img = array_random($head_img_pool);
         $domain = _domain();
-        $distribution_channel_id = str_replace('site','',explode('.',$domain)[0]);
-        if(!is_numeric($distribution_channel_id)){
+        $distribution_channel_id = str_replace('site', '', explode('.', $domain)[0]);
+        if (!is_numeric($distribution_channel_id)) {
             $distribution_channel_id = decodeDistributionChannelId($distribution_channel_id);
         }
-        $new_sub_page = env('NEW_SUB_PAGE',-1);
+        $new_sub_page = env('NEW_SUB_PAGE', -1);
         $template = 2;
-        if(in_array($distribution_channel_id,[123,211,2,14])){
-            if($uid %2 == 0){
+        if (in_array($distribution_channel_id, [123, 211, 2, 14])) {
+            if ($uid % 2 == 0) {
                 $template = 3;
             }
-            $this->userForceSubscribeTemplate($uid,$distribution_channel_id,$template);
-
+            //$this->userForceSubscribeTemplate($uid, $distribution_channel_id, $template);
         }
-        /*if($uid && in_array($distribution_channel_id,[123,211])){
-            if($uid%2 == 0){
-                //偶数 模板 2
-                $this->userForceSubscribeTemplate($uid,$distribution_channel_id,2);
-                return view('wap.subscribeV2',compact('title','img','head_img','num'));
+
+        if($this->appad($uid,$distribution_channel_id)){
+            if($uid % 2 == 0){
+                $this->userForceSubscribeTemplate($uid,$distribution_channel_id,4);
+                return view('wap.subscribeV3', compact('title', 'img', 'head_img', 'num', 'template'));
             }else{
-                //奇数 模板 1
-                $this->userForceSubscribeTemplate($uid,$distribution_channel_id,1);
-                return view('wap.subscribe',compact('title','img','head_img','num'));
+                $this->userForceSubscribeTemplate($uid,$distribution_channel_id,3);
+                return view('wap.subscribeV2', compact('title', 'img', 'head_img', 'num', 'template'));
             }
-        }
-        if(in_array($distribution_channel_id,explode(',',$new_sub_page))){
-            return view('wap.subscribeV2',compact('title','img','head_img','num'));
         }else{
-            return view('wap.subscribe',compact('title','img','head_img','num'));
-        }*/
-        return view('wap.subscribeV2',compact('title','img','head_img','num','template'));
-        //return view('wap.subscribe',compact('title','img','head_img','num'));
+            return view('wap.subscribeV2', compact('title', 'img', 'head_img', 'num', 'template'));
+        }
     }
 
-    private function userForceSubscribeTemplate($uid,$distribution_channel_id,$template_type){
-        try{
+    private function userForceSubscribeTemplate($uid, $distribution_channel_id, $template_type)
+    {
+        try {
             DB::table('user_force_subscribe_template')->insert([
-                'uid'=>$uid,
-                'distribution_channel_id'=>$distribution_channel_id,
-                'template_type'=>$template_type,
-                'created_at'=>date('Y-m-d H:i:s'),
-                'updated_at'=>date('Y-m-d H:i:s'),
+                'uid' => $uid,
+                'distribution_channel_id' => $distribution_channel_id,
+                'template_type' => $template_type,
+                'created_at' => date('Y-m-d H:i:s'),
+                'updated_at' => date('Y-m-d H:i:s'),
             ]);
-        }catch (\Exception $e){
+        } catch (\Exception $e) {
+
+        }
+    }
+
+    private function appad($uid, $distribution_channel_id)
+    {
+        if (!in_array($distribution_channel_id, explode(',', env('ADS_OPEN_SITE')))) {
+            return false;
+        }
+        $force_subscribe_info = ForceSubscribeService::forceSubscribeUsersByUid(['uid' => $uid]);
+
+        if (!$force_subscribe_info) {
+            return false;
+        }
 
+        if ($force_subscribe_info->subscribe_time &&
+            (time() - strtotime($force_subscribe_info->subscribe_time) >= 3 * 86400)
+            && !OrderService::isPaidUser($uid) &&
+            !AdvertiseUserQueueService::getUserAdvertise($uid)
+        ) {
+            return true;
         }
+        return false;
     }
 }

+ 9 - 0
app/Http/Controllers/Wap/User/ReadRecordController.php

@@ -2,6 +2,7 @@
 
 namespace App\Http\Controllers\Wap\User;
 
+use App\Modules\Cpa\Services\AdvertiseUserQueueService;
 use Illuminate\Http\Request;
 use App\Http\Controllers\Wap\BaseController;
 use App\Modules\Book\Services\BookConfigService;
@@ -104,6 +105,14 @@ class ReadRecordController extends BaseController
         });
         $res = json_encode($res);
         $res = json_decode($res);
+        foreach ($res as $key=>&$each){
+            $rec = AdvertiseUserQueueService::getUserAdvertiseSubscribe($this->uid,$each->bid);
+            if($rec) {
+                $each->is_advertise_sub=1;
+            }else {
+                $each->is_advertise_sub=0;
+            }
+        }
         return response()->collection(new ReadRecordTransformer(),$res);
     }
 

+ 2 - 1
app/Http/Controllers/Wap/User/Transformers/ReadRecordTransformer.php

@@ -14,7 +14,8 @@ class ReadRecordTransformer
             'time' => $res->time,
             'cover' => $res->cover,
             'last_chapter' => $res->last_chapter,
-            'is_on_user_shelf'=>$res->is_on_user_shelf
+            'is_on_user_shelf'=>$res->is_on_user_shelf,
+            'is_advertise_sub'=>isset($res->is_advertise_sub)?$res->is_advertise_sub:0
         ];
     }
 }

+ 57 - 3
app/Http/Controllers/Wap/Web/RedirectController.php

@@ -3,7 +3,9 @@
 namespace App\Http\Controllers\Wap\Web;
 
 use App\Modules\Subscribe\Services\OrderService;
+use App\Modules\User\Services\ReadRecordService;
 use Illuminate\Routing\Controller;
+use App\Http\Controllers\Wap\BaseController;
 use Illuminate\Http\Request;
 use Cookie;
 use DB;
@@ -11,8 +13,10 @@ use Redis;
 use App\Modules\SendOrder\Services\SendOrderService;
 use App\Modules\OfficialAccount\Services\ForceSubscribeService;
 use App\Modules\Statistic\Services\WapVisitStatService;
+use Hashids;
+use Log;
 
-class RedirectController extends Controller
+class RedirectController extends BaseController
 {
     private $alluv;
     /**
@@ -23,6 +27,7 @@ class RedirectController extends Controller
      */
     public function index(Request $request, $t, $domain, $param)
     {
+        $this->send_order_id = $param;
         $h5_scheme = 'https';
         //判断派单链接有没有进黑名单
         $black_send_order_ids = explode(',', env('BLACK_SEND_ORDER_IDS'));
@@ -46,7 +51,7 @@ class RedirectController extends Controller
             return response()->error('UNKNOWN_ERROR');
         }
         $uid = Cookie::get(env('COOKIE_AUTH_WEB_WECHAT'));
-        if($uid){
+        if($this->uid){
             try{
                 Redis::hset('book_read:' . $uid, 'send_order_id', $param);
             }catch (\Exception $e){}
@@ -130,13 +135,62 @@ class RedirectController extends Controller
                $url = secure_url('/') .$redirect_path;
                return redirect()->to($url);
            }else{
-               return redirect()->to($url);
+               if (($recent_url = $this->JumpTorecentRead($link->redirect_url, $this->uid, $param))) {
+                   return redirect()->to($recent_url);
+               } else {
+                   return redirect()->to($url);
+               }
+               //return redirect()->to($url);
            }
         }
         return redirect()->to(parse_url(url()->current())['scheme'] . '://' . _domain() . '/?' . $query);
     }
 
 
+    private function JumpTorecentRead($url, $uid, $send_order_id)
+    {
+        //Log::info('JumpTorecentRead($url, $uid, $send_order_id)'.$url.'--'.$uid.'----'.$send_order_id);
+        if (!$uid) return '';
+        $url_info = parse_url($url);
+        //Log::info($url_info);
+        if (!isset($url_info['path']) || !isset($url_info['query']) || $url_info['path'] != '/reader') return '';
+
+        parse_str($url_info['query'], $query_param);
+        //Log::info('$query_param');
+        //Log::info($query_param);
+        if (!$query_param || !isset($query_param['bid']) || !isset($query_param['cid'])) return '';
+        $bid = 0;
+        $bid_str = $query_param['bid'];
+        $cid = $query_param['cid'];
+        try {
+            $bid_arr = Hashids::decode($bid_str);
+            if (isset($bid_arr[0])) $bid = $bid_arr[0];
+        } catch (\Exception $e) {
+        }
+        //Log::info('$bid is: .'.$bid);
+        if (!$bid) return '';
+        $record_info = '';
+        try {
+            $record_info = ReadRecordService::getRecordByUidBid($uid, $bid);
+        } catch (\Exception $e) {
+            \Log::info($e);
+        }
+
+        if (!$record_info) return '';
+        $record_info_arr = explode('_', $record_info);
+        if (!isset($record_info_arr[0])) return '';
+
+        $param['cid'] = $record_info_arr[0];
+        $param['bid'] = $bid_str;
+        $param['soid'] = $send_order_id;
+        if ($cid && $cid != $record_info_arr[0]) {
+            $url = env('H5_SCHEME', 'https') . '://' . _domain() . '/reader?' . http_build_query($param);
+            return $url;
+        }
+        return '';
+    }
+
+
     public function testLogin(Request $request)
     {
         $siteid = $request->input('siteid');

+ 75 - 4
app/Http/Controllers/Wap/Web/WelcomeController.php

@@ -7,9 +7,12 @@ use App\Jobs\SendTexts;
 use App\Modules\Activity\Services\ActivitySwitchService;
 use App\Modules\Channel\Services\ChannelActivitiesService;
 use App\Modules\Channel\Services\ChannelService;
+use App\Modules\Cpa\Services\AdvertiseUserQueueService;
+use App\Modules\Cpa\Services\AdvertiseUsersService;
 use App\Modules\OfficialAccount\Services\ForceSubscribeService;
 use App\Modules\Statistic\Services\DataAnalysisSelectUserService;
 use App\Modules\Subscribe\Services\OrderService;
+use App\Modules\User\Services\ForceSubscribeUserIService;
 use App\Modules\User\Services\UserService;
 use Illuminate\Http\Request;
 use App\Http\Controllers\Wap\BaseController;
@@ -29,6 +32,7 @@ use App\Http\Controllers\Wap\Book\Transformers\BookTransformer;
 class WelcomeController extends BaseController
 {
 
+    private $force_subscribe_info = null;
     /**
      * 首页
      */
@@ -51,7 +55,7 @@ class WelcomeController extends BaseController
         $activity_img = $activity_options['activity_img'];
         $user = $activity_options['user'];
         $hidden_reader_menus = false;
-        $send_order_id = Cookie::get('send_order_id');
+        $send_order_id = $this->send_order_id;
         //隐藏阅读页面菜单
         if ($send_order_id && in_array($send_order_id, explode(',', env('HIDDEN_READER_MENUS')))) {
             $hidden_reader_menus = true;
@@ -112,8 +116,38 @@ class WelcomeController extends BaseController
         $hide_book_name = 0;
         if(!empty($self_config)){
         	$hide_book_name = 1;
-        }
-
+        }
+        //原创pv uv
+        $yctj = false;
+        $yctj_url = '';
+        if(in_array($this->distribution_channel_id,[2,5,8,146,155,255,691,722,4053,4174,4364,4426])){
+            $yctj = true;
+            $yctj_url = 'https://m.ycsd.cn/continue';
+        }
+        //app广告
+        $add_ad_status=[
+            'appad'=>false,
+            'appad_banner'=>'',
+            'appad_url'=>''
+        ];
+        if(in_array($this->distribution_channel_id,explode(',',env('ADS_OPEN_SITE'))))  {
+              $add_ad_status = $this->appad();
+              $my_bid = $request->input('bid','');
+              $ua = $_SERVER['HTTP_USER_AGENT'];
+              if($add_ad_status['appad'] == true && $my_bid && preg_match('/Android/',$ua)) {
+                  try{
+                      AdvertiseUsersService::addAdAccessRec(['uid'=>$this->uid,
+                          'bid'=>Hashids::decode($my_bid)[0],
+                          'position'=>'READER',
+                          'created_at'=>date('Y-m-d H:i:s'),
+                          'updated_at'=>date('Y-m-d H:i:s'),
+                          'remark'=>$request->url()
+                      ]);
+                  }catch(\Exception $e){
+                      \Log::error('insert into advertise_access_rec failded:'.$e->getMessage());
+                  }
+              }
+        }
         $options = json_encode([
             'distribution_channel_id' => (int)$this->distribution_channel_id,
             'send_order_id' => $send_order_id,
@@ -144,7 +178,12 @@ class WelcomeController extends BaseController
             'is_show_ad_frame' => $is_show_ad_frame,
             'show_title_in_reader' => $show_title_in_reader,
             'is_hide_chapter_consume' => $is_hide_chapter_consume,
-        	'hide_book_name' => $hide_book_name
+        	'hide_book_name' => $hide_book_name,
+            'yctj'=>$yctj,
+            'yctj_url'=>$yctj_url,
+            'appad'=>$add_ad_status['appad'],
+            'appad_banner'=>$add_ad_status['appad_banner'],
+            'appad_url'=>$add_ad_status['appad_url']
         ]);
         if ($this->uid == env('SPECIAL_USER_LOG', 2)) {
             myLog('special')->info('welcome --------------------------');
@@ -401,6 +440,7 @@ class WelcomeController extends BaseController
         if ($subscribe) return $subscribe;
         //强关公众号名称
         $force_subscribe = ForceSubscribeService::forceSubscribeUsersByUid(['uid' => $this->uid]);
+        $this->force_subscribe_info = $force_subscribe;
         if ($force_subscribe) {
             $force_subscribe_official = DB::table('official_accounts')->where('appid',$force_subscribe->appid)->select('nickname')->first();
             if ($force_subscribe_official) {
@@ -420,6 +460,37 @@ class WelcomeController extends BaseController
         return $title;
     }
 
+
+    private function appad(){
+        if($this->force_subscribe_info){
+            $force_subscribe_info = $this->force_subscribe_info;
+        }else{
+            $force_subscribe_info = $this->force_subscribe_info = ForceSubscribeService::forceSubscribeUsersByUid(['uid' => $this->uid]);
+            //\Log::info(':'.($this->uid).'force_subs1:'.json_encode($force_subscribe_info));
+        }
+        if(!$force_subscribe_info){
+            return ['appad'=>false,'appad_banner'=>'','appad_url'=>''];
+        }
+        $force_sub_user_by_openid = ForceSubscribeUserIService::getForceSubscribeByUidOpenid($this->uid);
+        if($force_sub_user_by_openid){
+            $force_subscribe_info = $force_sub_user_by_openid;
+            //\Log::info('force_subs:'.json_encode($force_subscribe_info));
+        }
+        if($force_subscribe_info->subscribe_time &&
+            (time()-strtotime($force_subscribe_info->subscribe_time) >=3*86400)
+            && !OrderService::isPaidUserByOpenid($force_subscribe_info->openid) &&
+            !AdvertiseUserQueueService::getUserAdvertise($this->uid) &&
+            in_array($this->distribution_channel_id,explode(',',env('ADS_OPEN_SITE')))
+        ){
+            return [
+                'appad'=>true,
+                'appad_banner'=>'https://cdn-novel.iycdm.com/h5/app-ad-banner.jpg',
+                'appad_url'=>'/advertise/show?uid='.Hashids::encode($this->uid)
+            ];
+        }
+        return ['appad'=>false,'appad_banner'=>'','appad_url'=>''];
+    }
+
     /**
      * 获取客服图片
      */

+ 10 - 8
app/Http/Middleware/ReadOauth.php

@@ -8,6 +8,7 @@ use App\Modules\Channel\Services\ChannelService;
 use App\Modules\OfficialAccount\Services\ForceSubscribeService;
 use App\Modules\SendOrder\Services\SendOrderService;
 use App\Modules\Statistic\Services\WapVisitStatService;
+use App\Modules\Subscribe\Services\OrderService;
 use App\Modules\User\Models\YqMove;
 use App\Modules\User\Services\ReadRecordService;
 use App\Modules\User\Services\UserService;
@@ -60,14 +61,7 @@ class ReadOauth
         if (!$distribution_channel_id) {
             return response()->error('WAP_SYS_ERROR');
         }
-        //禁止访问的site
-        $not_allow_access_site = env('NOT_ALLOW_ACCESS_SITE', '');
-        if ($not_allow_access_site) {
-            $not_allow_access_site_arr = explode(',', $not_allow_access_site);
-            if (in_array($distribution_channel_id, $not_allow_access_site_arr)) {
-                return response($this->notAccessPage())->header('Content-Type', 'text/html');
-            }
-        }
+
         $uri_send_order_id = 0;
         $uri = $request->input('_url');
         if (strpos($uri, '/yun/') !== false) {
@@ -101,6 +95,14 @@ class ReadOauth
             }
         }
 
+        //禁止访问的site
+        $not_allow_access_site = env('NOT_ALLOW_ACCESS_SITE', '');
+        if ($not_allow_access_site) {
+            $not_allow_access_site_arr = explode(',', $not_allow_access_site);
+            if (in_array($distribution_channel_id, $not_allow_access_site_arr) && !OrderService::isPaidUser($uid_cookie)) {
+                return response($this->notAccessPage())->header('Content-Type', 'text/html');
+            }
+        }
         //个性化推送
         $this->stylePush($request, $uid_cookie, $distribution_channel_id);
 

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

@@ -50,6 +50,10 @@ Route::group(['domain'=>env('WAP_DOMAIN'),'namespace'=>'App\Http\Controllers\Wap
     Route::any('api/userBehavior','User\UserbehaviorController@collectionBehavior');
     Route::any('subscribe/qrcode','Subscribe\LinkSubscribeController@subscribeView');
 
+    Route::get('advertise/show','Advertises\AdvertiseController@jump');
+    Route::get('advertise/jump','Advertises\AdvertiseController@jumpToSource');
+    Route::any('advertise/recieveUserBehavior','Advertises\AdvertiseController@recieveUserBehavior');
+
 //web 接口
     Route::group(['prefix'=>'api'],function () {
 

+ 2 - 1
app/Libs/Helpers.php

@@ -538,6 +538,7 @@ function specialChannelAuthInfoV2(){
         '4980'=>'wx002be80fb65d808e',
         '5148'=>'wx8e9ff7a97fa67675',
         '5189'=>'wx475125bc6dd942f9',
-        '4941'=>'wxe7f83fba4596cb03'
+        '4941'=>'wxe7f83fba4596cb03',
+        '5319'=>'wxa697fd62760dfc53'
     ];
 }

+ 23 - 0
app/Modules/Cpa/Models/Advertise.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace App\Modules\Cpa\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class Advertise extends Model
+{
+    protected $table = 'advertise_products';
+    protected $fillable = ['id', 'name', 'name_desc', 'img', 'source_url', 'status'];
+
+    static function getAds($limit=''){
+        $obj = self::where('status',1);
+        if($limit){
+            $obj->limit($limit);
+        }
+        return $obj->get();
+    }
+
+    static function getOne($id){
+        return self::where('id',$id)->first();
+    }
+}

+ 29 - 0
app/Modules/Cpa/Models/AdvertiseUserQueque.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace App\Modules\Cpa\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class AdvertiseUserQueque extends Model
+{
+    protected $table = 'advertise_user_queue';
+    protected $fillable = ['id', 'ad_user_id', 'uid', 'bid', 'advertise_id', 'add_time','status'];
+
+    public static function addToQueue($params){
+        $res = self::where('uid',$params['uid'])
+            //->where('status',1)
+            ->first();
+        if(!$res) {
+            return self::updateOrCreate($params);
+        }
+        return false;
+    }
+
+    public static function getUserAdvertiseSubscribe($uid,$bid){
+        return self::where('uid',$uid)->where('bid',$bid)->where('status',1)->first();
+    }
+
+    public static function getUserAdvertise($uid) {
+        return self::where('uid',$uid)->where('status',1)->first();
+    }
+}

+ 39 - 0
app/Modules/Cpa/Models/AdvertiseUsers.php

@@ -0,0 +1,39 @@
+<?php
+
+namespace App\Modules\Cpa\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class AdvertiseUsers extends Model
+{
+    protected $table = 'advertise_users';
+    protected $fillable = ['id', 'uid', 'bid', 'advertise_id'];
+
+    static function addAdUsers($params){
+        return self::create($params);
+    }
+
+    static function addOrUpdateAdUsers($insert,$update=''){
+        if($update){
+            return self::updateOrCreate($insert,$update);
+        }
+        \Log::info('insert2:'.json_encode($insert));
+        return self::updateOrCreate($insert);
+    }
+
+    static function getOne($params){
+        $obj = self::orderBy('id');
+        if(isset($params['uid'])&&$params['uid']) {
+            $obj->where('uid',$params['uid']);
+        }
+
+        if(isset($params['bid'])&&$params['bid']){
+            $obj->where('bid',$params['bid']);
+        }
+
+        if(isset($params['advertise_id'])&&$params['advertise_id']) {
+            $obj->where('advertise_id',$params['advertise_id']);
+        }
+        return $obj->first();
+    }
+}

+ 22 - 0
app/Modules/Cpa/Services/AdvertiseService.php

@@ -0,0 +1,22 @@
+<?php
+
+namespace App\Modules\Cpa\Services;
+
+use App\Modules\Activity\Models\Activity;
+use App\Modules\Cpa\Models\Advertise;
+use App\Modules\Statistic\Services\WapVisitStatService;
+use App\Modules\Subscribe\Models\Order;
+use App\Modules\Trade\Services\OrderService;
+use DB;
+use Redis;
+
+class AdvertiseService
+{
+    public static function getAds($limit=''){
+        return Advertise::getAds($limit);
+    }
+
+    public static function getOneById($id){
+        return Advertise::getOne($id);
+    }
+}

+ 27 - 0
app/Modules/Cpa/Services/AdvertiseUserQueueService.php

@@ -0,0 +1,27 @@
+<?php
+
+namespace App\Modules\Cpa\Services;
+
+use App\Modules\Activity\Models\Activity;
+use App\Modules\Cpa\Models\Advertise;
+use App\Modules\Cpa\Models\AdvertiseUserQueque;
+use App\Modules\Statistic\Services\WapVisitStatService;
+use App\Modules\Subscribe\Models\Order;
+use App\Modules\Trade\Services\OrderService;
+use DB;
+use Redis;
+
+class AdvertiseUserQueueService
+{
+    public static function addToQueue($params){
+        return AdvertiseUserQueque::addToQueue($params);
+    }
+
+    public static function getUserAdvertiseSubscribe($uid,$bid) {
+        return AdvertiseUserQueque::getUserAdvertiseSubscribe($uid,$bid);
+    }
+
+    public static function getUserAdvertise($uid){
+        return AdvertiseUserQueque::getUserAdvertise($uid);
+    }
+}

+ 30 - 0
app/Modules/Cpa/Services/AdvertiseUsersService.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace App\Modules\Cpa\Services;
+
+use App\Modules\Activity\Models\Activity;
+use App\Modules\Activity\Models\ActivitySwitch;
+use App\Modules\Cpa\Models\AdvertiseUsers;
+use App\Modules\Statistic\Services\WapVisitStatService;
+use App\Modules\Subscribe\Models\Order;
+use App\Modules\Trade\Services\OrderService;
+use DB;
+use Redis;
+
+class AdvertiseUsersService
+{
+    public static function addAdUsers($params){
+        return AdvertiseUsers::addAdUsers($params);
+    }
+    static function addOrUpdateAdUsers($insert,$update=''){
+        \Log::info('insert'.json_encode($insert));
+        return AdvertiseUsers::addOrUpdateAdUsers($insert,$update);
+    }
+    static function getOne($params){
+        return AdvertiseUsers::getOne($params);
+    }
+
+    static function  addAdAccessRec($params) {
+        return DB::table('advertise_access_rec')->insert($params);
+    }
+}

+ 20 - 0
app/Modules/Subscribe/Services/OrderService.php

@@ -196,4 +196,24 @@ WHERE  send_order_id = %s and order_type= 'RECHARGE' ";
         }
         return false;
     }
+    /**
+     * 是否是付费用户
+     * @param $openid
+     * @return bool
+     */
+    public static function isPaidUserByOpenid($openid){
+        if(empty($openid)){
+            return false;
+        }
+        $result = Order::join('users','users.id','=','orders.uid')
+            ->select('orders.id')
+            ->where('users.openid',$openid)
+            ->where('orders.status','PAID')
+            ->first();
+        if($result && $result->id){
+            return true;
+        }
+        return false;
+    }
+
 }

+ 101 - 0
app/Modules/User/Services/ForceSubscribeUserIService.php

@@ -0,0 +1,101 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: z-yang
+ * Date: 2019/3/26
+ * Time: 15:09
+ */
+
+namespace App\Modules\User\Services;
+
+use App\Modules\OfficialAccount\Models\ForceSubscribeUsers;
+use App\Modules\OfficialAccount\Models\OfficialAccount;
+use Redis;
+
+class ForceSubscribeUserIService
+{
+    private static $official_name = [];
+
+    public static function subscribes($uid, $distribution_channel_id, $send_order_id)
+    {
+        $subscribe_info = self::getUserSubscribes($uid);
+        //没关注
+        if ($subscribe_info->isNotEmpty() &&
+            $subscribe_info->search(
+                function ($item, $k) use ($send_order_id) {
+                    return $item->send_order_id == $send_order_id;
+                }
+            ) !== false
+        ) {
+            return ['is_subscribed' => true, 'appid' => '','name'=>''];
+        }
+        $subscribe_appdis = $subscribe_info->pluck('appid')->all();
+
+        $useable_appdis = self::getOfficialAccount($distribution_channel_id);
+
+        //没有可用的公众号
+        if (empty($useable_appdis)) return ['is_subscribed' => true, 'appid' => '','name'=>''];
+        $appids = collect($useable_appdis)->diff($subscribe_appdis)->toArray();
+        if ($appids) {
+            return ['is_subscribed' => false, 'appid' => $appids[0],'name'=>self::$official_name[$appids[0]]];
+        }
+        return ['is_subscribed' => true, 'appid' => '','name'=>''];
+    }
+
+    //用户强关公众号
+    public static function getUserSubscribes($uid)
+    {
+        return ForceSubscribeUsers::where('uid', $uid)->where('is_subscribed', 1)->select('appid', 'send_order_id')->get();
+    }
+
+    //可用公众号
+    public static function getOfficialAccount($distribution_channel_id)
+    {
+        $result = OfficialAccount::where('distribution_channel_id', $distribution_channel_id)
+            ->where('is_auth', 1)
+            ->where('is_enabled', 1)
+            ->where('subscribe_top_num', '>', 0)
+            ->where('subscribe_day_maximum', '>', 0)
+            ->orderBy('sort_no', 'desc')
+            ->select('appid', 'subscribe_top_num', 'subscribe_day_maximum','nickname')
+            ->get();
+        if ($result->isEmpty()) return [];
+        $data = [];
+        foreach ($result as $value) {
+            self::$official_name[$value->appid] = $value->nickname;
+            $fans_stats = self::getOfficialAccountFanStats($value->appid);
+            {
+                $fans_stats['day_fans'] < $value->subscribe_day_maximum
+                && $fans_stats['all_fans'] < $value->subscribe_top_num && array_push($data, $value->appid);
+            }
+        }
+        return $data;
+    }
+
+    //粉丝数
+    public static function getOfficialAccountFanStats($appid)
+    {
+        $total_fans_cancel_nums = (int)Redis::hget('day_appid_fans_nums_appid:cancel:' . $appid, 'total');
+
+        $total_fan_info = Redis::hmget('day_appid_fans_nums_appid:add:' . $appid, ['total', date('Y-m-d')]);
+        $total_fans_add_nums = $total_fan_info[0] ? $total_fan_info[0] : 0;
+        $day_fans = $total_fan_info[1] ? $total_fan_info[1] : 0;
+        $all_fans = $total_fans_add_nums - $total_fans_cancel_nums;
+        return compact('day_fans', 'all_fans');
+    }
+
+    public static function getForceSubscribeByUidOpenid($uid) {
+        $user_info = UserService::getById($uid);
+        if($user_info) {
+           $force_subs_info = ForceSubscribeUsers::join('users','users.id','=','force_subscribe_users.uid')
+               ->select(['force_subscribe_users.uid','force_subscribe_users.subscribe_time',
+                   'force_subscribe_users.created_at','users.openid','force_subscribe_users.is_subscribed'])
+               ->where('users.openid',$user_info->openid)
+               ->where('force_subscribe_users.is_subscribed',1)
+               ->orderBy('force_subscribe_users.id','asc')
+               ->first();
+           return $force_subs_info;
+        }
+        return false;
+    }
+}

+ 5 - 1
app/Modules/User/Services/UserSignService.php

@@ -349,11 +349,15 @@ class UserSignService
     }
 
     public static function signCallBackPushActivityInfo($uid,$distribution_channel_id){
+
         $activity_setting = ActivityService::getActivitySetting();
         if(!$activity_setting)
             return false;
         $acyivity_id = isset($activity_setting['activity_id'])?$activity_setting['activity_id']:0;
-
+        $other = env('OTHER_ACTIVITY_ID',0);
+        if($acyivity_id == $other && !in_array($distribution_channel_id,explode(',', env('OTHER_ACTIVITY_CHANNEL', '1')))){
+            return false;
+        }
         if(!$acyivity_id)
             return false;
         $activity_title = isset($activity_setting['sign_call_back_text'])?$activity_setting['sign_call_back_text']:'';;

File diff ditekan karena terlalu besar
+ 0 - 6527971
nohup.out


TEMPAT SAMPAH
public/static/img/banner.jpg


TEMPAT SAMPAH
public/static/img/mask.png


+ 200 - 0
resources/views/wap/advertise.blade.php

@@ -0,0 +1,200 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="UTF-8" />
+  <meta
+          name="viewport"
+          content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no0"
+  />
+  <meta http-equiv="X-UA-Compatible" content="ie=edge" />
+  <title>全本免费看</title>
+  <style>
+    html,
+    body {
+      margin: 0 auto;
+      padding: 0;
+      /* max-width: 450px; */
+      font-size: 100px;
+    }
+
+    p {
+      margin: 0;
+      padding: 0;
+    }
+
+    main {
+      font-size: 0;
+      position: relative;
+    }
+
+    main img {
+      width: 100%;
+    }
+
+    .section-box {
+      width: 95%;
+      margin: 0 auto;
+    }
+
+    .welfare-box {
+      font-size: 0.14rem;
+      margin-bottom: 0.14rem;
+      color: #282828;
+    }
+
+    .welfare-box span {
+      display: inline-block;
+    }
+
+    .welfare-box .label {
+      background: #ff4223;
+      color: #fff;
+      padding: 0.05rem 0.1rem;
+      font-weight: bold;
+      border-radius: 2px;
+    }
+
+    .welfare-box .strong {
+      color: #5235ff;
+      font-size: 0.18rem;
+      font-weight: bold;
+    }
+
+    .down-for-free {
+      background: linear-gradient(
+              0deg,
+              rgba(243, 57, 31, 1),
+              rgba(255, 122, 100, 1)
+      );
+      box-shadow: 0px 5px 9px 0px rgba(255, 85, 62, 0.3);
+      border-radius: 23px;
+      font-size: 0.16rem;
+      font-weight: bold;
+      color: #fff;
+      text-align: center;
+      padding: 0.14rem 0;
+      width: 80%;
+      margin: 0.24rem auto;
+      cursor: pointer;
+    }
+
+    .disable-status {
+      background: #ccc;
+      box-shadow: none;
+    }
+
+    .rules-box {
+      background: #f7f7f7;
+      padding: 0.1rem 0.16rem;
+      font-size: 0.13rem;
+      color: #666;
+      line-height: 0.2rem;
+    }
+
+    .rules-box .rule-title {
+      font-weight: bold;
+      color: #333;
+    }
+
+    .mask {
+      position: fixed;
+      top: 0;
+      left: 0;
+      bottom: 0;
+      right: 0;
+      background: rgba(0, 0, 0, 0.8);
+    }
+
+    .mask img {
+      width: 100%;
+    }
+
+    @media screen and (max-width: 360px) {
+      .welfare-box {
+        font-size: 0.12rem;
+      }
+
+      .welfare-box .strong {
+        font-size: 0.16rem;
+      }
+
+      .down-for-free {
+        padding: 0.1rem 0;
+      }
+
+      .rules-box {
+        font-size: 0.12rem;
+      }
+    }
+  </style>
+</head>
+<body>
+<main>
+  <img src="/static/img/banner.jpg" alt="米读App" />
+  <div class="section-box">
+    <p class="welfare-box">
+      <span class="label">微信内福利</span>
+      <span class="text">《{{$params['book_name']}}》</span>
+      <span class="strong">全本免费看</span>
+    </p>
+    <p class="welfare-box">
+      <span class="label">米读内福利</span>
+      <span class="text">免费抽取iPhone XS</span>
+    </p>
+    <!-- 按钮变灰使用class disable-status -->
+    <div class="down-for-free">立即下载</div>
+
+    <div class="rules-box">
+      <p class="rule-title">规则</p>
+      <p class="rule-item">1. App下载注册成功后福利兑现</p>
+      <p class="rule-item">2. 微信内福利在当前服务号兑现</p>
+      <p class="rule-item">3. 米读内福利下载成功后兑现</p>
+    </div>
+  </div>
+</main>
+<div class="mask" style="display: none">
+  <img src="/static/img/mask.png" alt="" />
+</div>
+</body>
+<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
+<script>
+    var u = navigator.userAgent.toLowerCase();
+    var uid="{{$params['uid']}}";
+    var bid="{{$params['bid']}}";
+    var ad_id="{{$ads['id']}}";
+    var sign="{{$params['my_sign']}}";
+    var timestamp="{{$params['timestamp']}}";
+    var isWechat = u.match(/MicroMessenger/i) == "micromessenger";
+    // 按钮状态 1-可以点击下载 0-无法点击下载
+    var btn_status = 1;
+    var btn = document.querySelector(".down-for-free");
+    var mask = document.querySelector(".mask");
+    btn.addEventListener(
+        "click",
+        function() {
+
+            // 判断是否在微信内
+            // 判断是否在微信内
+            if (isWechat) {
+                mask.style.display = "block";
+                $.ajax({
+                    url:'/advertise/recieveUserBehavior',
+                    type:'post',
+                    data:{
+                        'uid':uid,
+                        'bid':bid,
+                        'position':'DOWNLOAD_BTN'
+                    }
+                })
+                return;
+            }
+            // 执行下载操作
+            location.href='/advertise/jump?uid='+uid+'&bid='+bid+'&ad='+ ad_id +'&sign=' +sign+ '&timestamp=' + timestamp;
+        },
+        false
+    );
+    mask.addEventListener("click", function() {
+        mask.style.display = "none";
+    }, false)
+</script>
+</html>

+ 4 - 4
resources/views/wap/index.blade.php

@@ -9,7 +9,7 @@
     <script>window.VueRouter || document.write('<script src="https://cdn-novel.iycdm.com/static/vue-router.min.js"><\/script>')</script>
     <script>(window.Vue && window.VueLazyload) || document.write('<script src="https://cdn-novel.iycdm.com/static/vue-lazyload.js"><\/script>')</script>
     <title>{{$title}}</title>
-    <link href=https://cdn-novel.iycdm.com/static2019-3-21/css/app.8250f18bafb5078b9494a403b90bffa2.css rel=stylesheet>
+    <link href=https://cdn-novel.iycdm.com/static2019-3-26/css/app.0b9e8cd3ffa9e3bce71ec9a23c4fe830.css rel=stylesheet>
 </head>
 <body>
 <div id=app></div>
@@ -32,8 +32,8 @@
     })();</script>
 <script id=options>window.options = {!! $options!!};</script>
 <script type=text/javascript
-        src=https://cdn-novel.iycdm.com/static2019-3-21/js/manifest.b98306c96c72f278e590.js></script>
-<script type=text/javascript src=https://cdn-novel.iycdm.com/static2019-3-21/js/vendor.ffff3089fc2f18220e2f.js></script>
-<script type=text/javascript src=https://cdn-novel.iycdm.com/static2019-3-21/js/app.d053fac5c9a0ed181754.js></script>
+        src=https://cdn-novel.iycdm.com/static2019-3-26/js/manifest.eab4045afbca18aae068.js></script>
+<script type=text/javascript src=https://cdn-novel.iycdm.com/static2019-3-26/js/vendor.ffff3089fc2f18220e2f.js></script>
+<script type=text/javascript src=https://cdn-novel.iycdm.com/static2019-3-26/js/app.8947b7a2af3613459c62.js></script>
 </body>
 </html>

File diff ditekan karena terlalu besar
+ 23 - 23
resources/views/wap/subscribeV2.blade.php


File diff ditekan karena terlalu besar
+ 546 - 0
resources/views/wap/subscribeV3.blade.php