소스 검색

Merge branch 'stabble' of iqiyoo:zhuishuyun_wap into stabble

zz 6 년 전
부모
커밋
8c785cc720

+ 167 - 0
app/Http/Controllers/Wap/Advertises/ShareController.php

@@ -0,0 +1,167 @@
+<?php
+
+namespace App\Http\Controllers\Wap\Advertises;
+
+use App\Http\Controllers\Wap\BaseController;
+
+use App\Modules\Book\Services\ChapterService;
+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\ShareFree\Services\ShareBringUsersService;
+use App\Modules\ShareFree\Services\ShareUsersService;
+use App\Modules\User\Services\ReadRecordService;
+use Illuminate\Http\Request;
+use Redis;
+use Hashids;
+use DB;
+use EasyWeChat\Foundation\Application;
+
+
+class ShareController extends BaseController
+{
+    public function share(Request $request){
+        $distribution_channel_id = $request->input('distribution_channel_id',0);
+        $uid = $request->input('uid','');
+        $cid = $request->input('cid','');
+        $bid_encode = $request->input('bid','');
+        if(empty($distribution_channel_id)||empty($uid)||empty($bid_encode)) {
+            return response()->error('PARAM_EMPTY');
+        }
+        //$distribution_channel_id = decodeDistributionChannelId($distribution_channel_id);
+        $bid =Hashids::decode($bid_encode)[0];
+        $book_info = BookConfigService::getBookById($bid);
+        if(!$book_info){
+            return response()->error('PARAM_ERROR');
+        }
+        $chapter_info = ChapterService::getChapterById($book_info->first_cid);
+
+        $book_name = $book_info->name;
+
+        //加入用户分享记录
+        $share_user_info = ShareUsersService::addShareUsers(compact('bid','uid','cid','distribution_channel_id','book_name'));
+        $js_config = $this->getJSConfig();
+        $bid = $bid_encode;
+        $title = $book_info->book_name;
+        mb_internal_encoding("UTF-8");
+        $desc = mb_substr(str_replace(["\n","\r\n","\t"],'\\',trim($chapter_info->content)),0,40).'...';
+        //$link = env('PROTOCOL').'://site'.Hashids::encode($distribution_channel_id)._domain().'/reader?bid='.$bid;
+        $params =[
+            'uid'=>$uid,'bid'=>$bid,'distribution_channel_id'=>$distribution_channel_id,
+            'share_user_id'=>$share_user_info->id,'timestamp'=>time(),'cid'=>$cid]
+        ;
+        $url_param_str = arr_to_url($params);
+        $sign = md5($url_param_str);
+
+        $share_bring_users = ShareBringUsersService::getShareSuccessUsers($share_user_info->id);
+        $share_bring_users = json_decode(json_encode($share_bring_users),true);
+        $url_format = '%s://site%s.%s.com/';
+        /*$link =  sprintf(
+            $url_format,
+            env('PROTOCOL'),
+            encodeDistributionChannelId($distribution_channel_id),
+            env('CUSTOM_HOST')
+        );
+        $link .= 'share/outjump?'.$url_param_str.'&sign='.$sign;*/
+        $link = env('PROTOCOL').'://'.env('share_domain').'/share/outjump?'.$url_param_str.'&sign='.$sign;
+        \Log::info('link:'.$link);
+        $imgUrl=$book_info->cover;
+
+        return view('wap.share',['params'=>compact('bid','book_name','uid','timestamp','my_sign'),'share_bring_users'=>$share_bring_users,'js_config'=>$js_config,'share_config'=>compact('title','desc','link','url','imgUrl')]);
+    }
+
+    private function getJSConfig(){
+        $options = [
+            'debug'  => true,
+            'app_id' => env('JS_AppId'),
+            'secret' => env('JS_AppSecret'),
+            'token'  => 'easywechat',
+
+            'log' => [
+                'level' => 'debug',
+                'file'  => storage_path('logs/easyWecaht.log'), // XXX: 绝对路径!!!!
+            ],
+
+            //...
+        ];
+
+        $app = new Application($options);
+        $js = $app->js->config(array('onMenuShareQQ', 'onMenuShareWeibo','onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQZone'), $debug = false, $beta = false, $json = false);
+
+        return $js;
+    }
+
+    public function jump(Request $request){
+        $distribution_channel_id = $request->input('distribution_channel_id',0);
+        $uid = $request->input('uid','');
+        $cid = $request->input('cid','');
+        $bid_encode = $request->input('bid','');
+        $share_user_id = $request->input('share_user_id','');
+        $timestamp = $request->input('timestamp','');
+        $sign = $request->input('sign','');
+        if(empty($distribution_channel_id)||empty($uid)||empty($cid)||empty($bid_encode)||empty($share_user_id)||empty($sign)) {
+            return response()->error('PARAM_EMPTY');
+        }
+        $bid=$bid_encode;
+        $sign_str = arr_to_url(compact('distribution_channel_id','uid','cid','bid','share_user_id','timestamp'));
+        $my_sign = md5($sign_str);
+        if($sign != $my_sign) {
+            return response()->error('WAP_SIGN_ERROR');
+        }
+        $bid = Hashids::decode($bid_encode)[0];
+        $buid = $this->uid;
+        $data = compact('uid','bid','cid','share_user_id','buid');
+        \Log::info(json_encode($data));
+        if($uid != $buid){
+            ShareBringUsersService::addShareUsers($data);
+        }
+        $book_configs = BookConfigService::getBookById($bid);
+        $readRecord = ReadRecordService::getRecordByUidBid($buid,$bid);
+
+        if($readRecord) {
+            $cid = explode('_',$readRecord)[0];
+        }else {
+            $cid = $book_configs->first_cid;
+        }
+        $url_format = '%s://site%s.%s.com/';
+        $jump_link =  sprintf(
+            $url_format,
+            env('PROTOCOL'),
+            encodeDistributionChannelId($distribution_channel_id),
+            env('CUSTOM_HOST')
+        );
+        //\Log::info('jump_link:'.$jump_link.'reader?bid='.$bid_encode.'&cid='.$cid);
+        header('location:'.$jump_link.'reader?bid='.$bid_encode.'&cid='.$cid);
+    }
+
+    public function ShareJump(Request $request) {
+        $arg = $request->all();
+        $distribution_channel_id = $arg['distribution_channel_id'];
+        $data = array(
+            'distribution_channel_id'=>$arg['distribution_channel_id'],
+            'uid'=>$arg['uid'],
+            'cid'=>$arg['cid'],
+            'bid'=>$arg['bid'],
+            'share_user_id'=>$arg['share_user_id'],
+            'timestamp'=>$arg['timestamp']
+        );
+        $sign_str = arr_to_url($data);
+        $sign = $arg['sign'];
+        $my_sign = md5($sign_str);
+        if($sign != $my_sign) {
+            return response()->error('WAP_SIGN_ERROR');
+        }
+        //$link = env('PROTOCOL').'://'.env('share_domain').'/share/jump?'.$sign_str.'&sign='.$sign;
+        $url_format = '%s://site%s.%s.com/';
+        $link =  sprintf(
+            $url_format,
+            env('PROTOCOL'),
+            //TODO 上线时改成加密
+            $distribution_channel_id,//encodeDistributionChannelId($distribution_channel_id),
+            env('CUSTOM_HOST')
+        );
+        $link .= 'share/jump?'.$sign_str.'&sign='.$sign;
+        header('location:'.$link);
+    }
+}

+ 13 - 10
app/Http/Controllers/Wap/Web/WelcomeController.php

@@ -131,6 +131,9 @@ class WelcomeController extends BaseController
             'appad_banner'=>'',
             'appad_url'=>''
         ];
+        //无充值用户分享
+        $share_switch = 0;
+        $share_switch = ($this->appad())?1:0;
         //突出包年的充值页面
         $outstanding_year_order = $this->outstandingYearOrder();
 
@@ -170,7 +173,9 @@ class WelcomeController extends BaseController
             'appad'=>$add_ad_status['appad'],
             'appad_banner'=>$add_ad_status['appad_banner'],
             'appad_url'=>$add_ad_status['appad_url'],
-            'outstanding_year_order'=>$outstanding_year_order
+            'outstanding_year_order'=>$outstanding_year_order,
+            'share_domain'=>env('share_domain_url'),
+            'share_switch'=>$share_switch
         ]);
         if ($this->uid == env('SPECIAL_USER_LOG', 2)) {
             myLog('special')->info('welcome --------------------------');
@@ -483,26 +488,24 @@ class WelcomeController extends BaseController
             //\Log::info(':'.($this->uid).'force_subs1:'.json_encode($force_subscribe_info));
         }
         if(!$force_subscribe_info){
-            return ['appad'=>false,'appad_banner'=>'','appad_url'=>''];
+            return false;
         }
         $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));
         }
+        //\Log::info('force_subscribe_:'.json_encode($force_subscribe_info));
+        //\Log::info('distribution_channel_id:'.$this->distribution_channel_id);
         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')))
+            //!AdvertiseUserQueueService::getUserAdvertise($this->uid) &&
+            in_array($this->distribution_channel_id,explode(',',env('SHARE_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 true;
         }
-        return ['appad'=>false,'appad_banner'=>'','appad_url'=>''];
+        return false;
     }
 
     //CPC广告的优化逻辑

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

@@ -31,6 +31,13 @@ Route::group(['domain'=>env('HELP_DOMAIN'),'namespace'=>'App\Http\Controllers\Wa
     Route::get('/{id}','HelpController@helpDetail');
     Route::get('/help/getLinkByAppid','HelpController@getLinkByAppid');
 });
+//分享中间页
+Route::group(['domain'=>env('share_domain'),'namespace'=>'App\Http\Controllers\Wap'],function(){//,'middleware'=>'ReadOauth'
+    Route::get('share/show','Advertises\ShareController@share');
+    Route::any('share/outjump','Advertises\ShareController@ShareJump');
+});
+
+
 
 Route::group(['domain'=>env('FRIEND_LINK_DOMAIN'),'namespace'=>'App\Http\Controllers\Wap'],function(){
     Route::get('friendlink','User\CoflController@index');
@@ -61,6 +68,7 @@ Route::group(['domain'=>env('WAP_DOMAIN'),'namespace'=>'App\Http\Controllers\Wap
     Route::get('advertise/jump','Advertises\AdvertiseController@jumpToSource');
     Route::any('advertise/recieveUserBehavior','Advertises\AdvertiseController@recieveUserBehavior');
 
+
 //web 接口
     Route::group(['prefix'=>'api'],function () {
 
@@ -218,7 +226,8 @@ Route::group(['domain'=>env('WAP_DOMAIN'),'namespace'=>'App\Http\Controllers\Wap
         Route::get('sale/customvip','Web\WelcomeController@channelYearActivity');
         //继续阅读
         Route::get('continue','User\ReadRecordController@latestRead');
-
+        //分享站内跳转
+        Route::any('share/jump','Advertises\ShareController@jump');
         //用户强关信息页
         Route::any('subscribe/getFromUser','Subscribe\SubscribeController@getFromUser');
 

+ 23 - 0
app/Modules/ShareFree/Models/ShareBringUsers.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace App\Modules\ShareFree\Models;
+
+use App\Modules\Book\Services\BookConfigService;
+use Illuminate\Database\Eloquent\Model;
+
+class ShareBringUsers extends Model
+{
+    protected $table = 'share_bring_users';
+    protected $fillable = ['id', 'uid', 'bid', 'cid','buid','is_subscribe', 'share_user_id'];
+
+    public static function addShareUsers($data) {
+        if(isset($data['uid'])&&isset($data['bid'])&&isset($data['share_user_id'])) {
+            return self::updateOrCreate(['uid'=>$data['uid'],'bid'=>$data['bid'],'share_user_id'=>$data['share_user_id'],'buid'=>$data['buid']]);
+        }
+        return self::create($data);
+    }
+
+    public static function getShareSuccessUsers($share_user_id){
+        return self::join('users','users.id','=','share_bring_users.buid')->select('users.id','users.head_img','nickname')->where('share_user_id',$share_user_id)->where('share_bring_users.is_subscribe',1)->limit(3)->get();
+    }
+}

+ 25 - 0
app/Modules/ShareFree/Models/ShareUsers.php

@@ -0,0 +1,25 @@
+<?php
+
+namespace App\Modules\ShareFree\Models;
+
+use App\Modules\Book\Services\BookConfigService;
+use Illuminate\Database\Eloquent\Model;
+
+class ShareUsers extends Model
+{
+    protected $table = 'share_users';
+    protected $fillable = ['id', 'uid', 'bid', 'distribution_channel_id', 'cid','book_name', 'status'];
+
+    public static function addShareUsers($data)
+    {
+        if(!isset($data['uid'])||!isset($data['bid'])) {
+            return false;
+        }
+        $rec = self::where('uid',$data['uid'])->where('bid',$data['bid'])->first();
+
+        if(!$rec) {
+            return self::create($data);
+        }
+        return $rec;
+    }
+}

+ 22 - 0
app/Modules/ShareFree/Services/ShareBringUsersService.php

@@ -0,0 +1,22 @@
+<?php
+
+namespace App\Modules\ShareFree\Services;
+
+use App\Modules\Cpa\Models\Advertise;
+use App\Modules\ShareFree\Models\ShareBringUsers;
+use App\Modules\ShareFree\Models\ShareUsers;
+use App\Modules\Subscribe\Models\Order;
+use App\Modules\Trade\Services\OrderService;
+use DB;
+use Redis;
+
+class ShareBringUsersService
+{
+    public static function addShareUsers($data) {
+        return ShareBringUsers::addShareUsers($data);
+    }
+
+    public static function getShareSuccessUsers($share_user_id){
+        return ShareBringUsers::getShareSuccessUsers($share_user_id);
+    }
+}

+ 17 - 0
app/Modules/ShareFree/Services/ShareUsersService.php

@@ -0,0 +1,17 @@
+<?php
+
+namespace App\Modules\ShareFree\Services;
+
+use App\Modules\Cpa\Models\Advertise;
+use App\Modules\ShareFree\Models\ShareUsers;
+use App\Modules\Subscribe\Models\Order;
+use App\Modules\Trade\Services\OrderService;
+use DB;
+use Redis;
+
+class ShareUsersService
+{
+    public static function addShareUsers($data) {
+        return ShareUsers::addShareUsers($data);
+    }
+}

BIN
public/static/img/bg.png


BIN
public/static/img/bg_wrap.png


BIN
public/static/img/defalut.png


+ 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-4-12/css/app.2838abd9b86882be8040562f73c1ae2e.css rel=stylesheet>
+    <link href=https://cdn-novel.iycdm.com/static2019-4-15/css/app.7b19e66c934ca6cbd2f85b6732d588ba.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-4-12/js/manifest.ddb6c9a95797c9b85e87.js></script>
-<script type=text/javascript src=https://cdn-novel.iycdm.com/static2019-4-12/js/vendor.ffff3089fc2f18220e2f.js></script>
-<script type=text/javascript src=https://cdn-novel.iycdm.com/static2019-4-12/js/app.1bc10ad5dfb8cf07208d.js></script>
+        src=https://cdn-novel.iycdm.com/static2019-4-15/js/manifest.4c20d6254d3db4b6049a.js></script>
+<script type=text/javascript src=https://cdn-novel.iycdm.com/static2019-4-15/js/vendor.ffff3089fc2f18220e2f.js></script>
+<script type=text/javascript src=https://cdn-novel.iycdm.com/static2019-4-15/js/app.00627a040c0e8eafaee4.js></script>
 </body>
 </html>

+ 151 - 0
resources/views/wap/share.blade.php

@@ -0,0 +1,151 @@
+<!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=no"
+  />
+  <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;
+    }
+
+    .main_box {
+      font-size: 0;
+      position: relative;
+    }
+
+    .main_box img {
+      width: 100%;
+    }
+
+    .bg_wrap {
+      position: fixed;
+      top: 0;
+      bottom: 0;
+      left: 0;
+      right: 0;
+      background: url(/static/img/bg_wrap.png) no-repeat left top / cover;
+    }
+
+    .rel_wrap {
+      position: relative;
+    }
+
+    .abs_wrap {
+      position: absolute;
+      top: 42%;
+      left: 50%;
+      transform: translateX(-50%);
+      width: 88%;
+    }
+
+    .book_name {
+      font-size: 0.18rem;
+      color: #fff;
+      width: 100%;
+      text-align: center;
+      margin-bottom: 18%;
+    }
+
+    .user_list {
+      font-size: 0;
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+    }
+
+    .user_list img {
+      width: 0.65rem;
+      height: 0.65rem;
+      border-radius: 50%;
+    }
+
+    .d_none {
+      display: none;
+    }
+  </style>
+</head>
+
+<body>
+<main class="main_box">
+  <div class="bg_wrap">
+    <div class="rel_wrap">
+      <img src="/static/img/bg.png" alt="" />
+      <div class="abs_wrap">
+        <p class="book_name">{{$params['book_name']}}</p>
+        <div class="user_list">
+          @if(isset($share_bring_users[0]['head_img']))
+            <img src="{{$share_bring_users[0]['head_img']}}" alt="" />
+          @else
+            <img src="/static/img/defalut.png" alt="" />
+          @endif
+          @if(isset($share_bring_users[1]['head_img']))
+              <img src="{{$share_bring_users[1]['head_img']}}" alt="" />
+          @else
+              <img src="/static/img/defalut.png" alt="" />
+          @endif
+          @if(isset($share_bring_users[2]['head_img']))
+            <img src="{{$share_bring_users[2]['head_img']}}" alt="" />
+          @else
+                <img src="/static/img/defalut.png" alt="" />
+          @endif
+        </div>
+      </div>
+    </div>
+  </div>
+</main>
+</body>
+{{--<script src="http://res2.wx.qq.com/open/js/jweixin-1.4.0.js"></script>--}}
+<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
+<script>
+    console.log('222222')
+    var js_config = {
+        debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
+        appId: "{{$js_config['appId']}}", // 必填,公众号的唯一标识
+        timestamp: {{$js_config['timestamp']}}, // 必填,生成签名的时间戳
+        nonceStr: "{{$js_config['nonceStr']}}", // 必填,生成签名的随机串
+        signature: "{{$js_config['signature']}}",// 必填,签名
+        jsApiList: ['onMenuShareQQ', 'onMenuShareWeibo','onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQZone']//['{{implode("','",$js_config['jsApiList'])}}'] // 必填,需要使用的JS接口列表
+    };
+    var config = {
+      //json_encode($share_config)
+        title:"{{$share_config['title']}}",
+        desc: `{{$share_config['desc']}}`, // 分享描述
+        link: "{!! $share_config['link'] !!}",// 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
+        imgUrl: "{{$share_config['imgUrl']}}", // 分享图标
+
+    };
+    wx.config(
+        js_config
+    );
+    wx.ready(function () {   //需在用户可能点击分享按钮前就先调用
+
+        wx.onMenuShareTimeline(
+            config
+        )
+        wx.onMenuShareAppMessage(
+            config
+        )
+        wx.onMenuShareQZone(
+            config
+        )
+        wx.onMenuShareQQ(
+            config
+        )
+
+    });
+
+</script>
+</html>