ReadOauth.php 73 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793
  1. <?php
  2. namespace App\Http\Middleware;
  3. use App\Jobs\SendStatisticsList;
  4. use App\Modules\Book\Services\BookConfigService;
  5. use App\Modules\Channel\Models\YqMoveChannel;
  6. use App\Modules\Channel\Services\ChannelService;
  7. use App\Modules\OfficialAccount\Services\ForceSubscribeService;
  8. use App\Modules\SendOrder\Services\SendOrderService;
  9. use App\Modules\Statistic\Services\WapVisitStatService;
  10. use App\Modules\Subscribe\Services\OrderService;
  11. use App\Modules\User\Models\YqMove;
  12. use App\Modules\User\Services\ReadRecordService;
  13. use App\Modules\User\Services\UserService;
  14. use App\Modules\YunQi\Services\BookUserService;
  15. use App\Modules\YunQi\Services\YqUserBidRelationService;
  16. use App\Modules\YunQi\Services\YqZsyTestService;
  17. use Closure;
  18. use Cookie;
  19. use App\Libs\ApiClient;
  20. use EasyWeChat\Core\Exception;
  21. use Illuminate\Http\Request;
  22. use Log;
  23. use Redis;
  24. use App\Modules\OfficialAccount\Services\OfficialAccountService;
  25. use Hashids;
  26. use GuzzleHttp\Client;
  27. use App\Jobs\SendTexts;
  28. use DB;
  29. use EasyWeChat\Foundation\Application;
  30. class ReadOauth
  31. {
  32. /**
  33. * 判断是否登陆.
  34. */
  35. public function handle(Request $request, Closure $next)
  36. {
  37. $this->cookieNoCrypt();
  38. $test = 0;
  39. if ($request->has('test') && $request->input('test') == 'bonan') {
  40. $test = 1;
  41. }
  42. $uid_cookie = Cookie::get(env('COOKIE_AUTH_WEB_WECHAT'));
  43. if (!$uid_cookie) $uid_cookie = $this->authCallBack($request);
  44. $h5_scheme = env('H5_SCHEME', 'https');
  45. $params = $request->except('_url');
  46. $url = str_replace('http://', $h5_scheme . '://', url()->current() . '?' . http_build_query($params));
  47. //Log::info('-----------------uid' . $uid_cookie);
  48. $send_order_id = $request->input('send_order_id');
  49. if ($send_order_id) {
  50. Cookie::queue('send_order_id', $send_order_id, env('U_COOKIE_EXPIRE'), null, null, false, false);
  51. }
  52. $distribution_channel_id = str_replace('site', '', explode('.', _domain())[0]);
  53. $origin_distribution_channel_id = $distribution_channel_id;
  54. if (!is_numeric($distribution_channel_id)) {
  55. $distribution_channel_id = decodeDistributionChannelId($distribution_channel_id);
  56. }
  57. if (!$distribution_channel_id) {
  58. return response()->error('WAP_SYS_ERROR');
  59. }
  60. $uri_send_order_id = 0;
  61. $uri = $request->input('_url');
  62. if (strpos($uri, '/yun/') !== false) {
  63. $uri_send_order_id = (int)str_ireplace('/yun/', '', $uri);
  64. }
  65. $yun = $request->get('yun');
  66. $yun && $uri_send_order_id = $yun;
  67. if (!$uid_cookie && $test == 0) {
  68. if ($uri_send_order_id) {
  69. Cookie::queue('send_order_id', $uri_send_order_id, env('U_COOKIE_EXPIRE'), null, null, false, false);
  70. }
  71. $this->share($request);
  72. $old_auth = false;
  73. if ($old_auth && !in_array($distribution_channel_id, explode(',', env('NEW_AUTH_CHANNEL_ID', 1)))) {
  74. //旧的授权
  75. Cookie::queue('auth_redirect', urlencode($url), env('U_COOKIE_EXPIRE'));
  76. $auth_v2_url = $this->authV2($request, $distribution_channel_id);
  77. if ($auth_v2_url) {
  78. return redirect()->to($auth_v2_url);
  79. }
  80. $redirect_V2 = $this->auth($request, $distribution_channel_id);
  81. if ($redirect_V2) {
  82. return redirect()->to($redirect_V2);
  83. }
  84. } else {
  85. //新的授权
  86. $options = $this->authReduceRedirect($request,$distribution_channel_id,$uri_send_order_id);
  87. $app = new Application($options);
  88. //Log::info($options);
  89. return $app->oauth->redirect();
  90. }
  91. }
  92. //禁止访问的site
  93. $not_allow_access_site = env('NOT_ALLOW_ACCESS_SITE', '');
  94. if ($not_allow_access_site) {
  95. $not_allow_access_site_arr = explode(',', $not_allow_access_site);
  96. if (in_array($distribution_channel_id, $not_allow_access_site_arr) && !OrderService::isPaidUser($uid_cookie)) {
  97. return response($this->notAccessPage())->header('Content-Type', 'text/html');
  98. }
  99. }
  100. //个性化推送
  101. //$this->stylePush($request, $uid_cookie, $distribution_channel_id);
  102. //禁止明文访问
  103. if ($this->isForbidPrimaryNumberChannleID($origin_distribution_channel_id, $uid_cookie)) {
  104. return response('<html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><title>该网站地址暂停访问</title></head><body style="padding:0;margin:0;font-size:0"><div style="width:300px;height:100px;margin: 20px auto"><p style="font-size:20px;color:red;text-align:center">该网站地址暂停访问,请联系客服微信获取新地址:wuxinchao12</p></body></html>');
  105. }
  106. //crm 跳转
  107. if(($crm_link = $this->crmJump($request,$uid_cookie,$origin_distribution_channel_id))){
  108. return redirect()->to($crm_link);
  109. }
  110. if ($request->has('appid') && $request->has('openid')) {
  111. Log::info('param is:');
  112. Log::info($params);
  113. $uri = $request->input('_url');
  114. $openid = $request->get('openid');
  115. $appid = $request->get('appid');
  116. if ($openid && $appid && $distribution_channel_id && $uid_cookie) {
  117. $this->apidAndOpenId($distribution_channel_id, $appid, $openid, $uid_cookie, $uri_send_order_id);
  118. }
  119. }
  120. $this->yun($request, $uid_cookie, $distribution_channel_id);
  121. //只能推送的统计
  122. $this->smartPush($request, $uid_cookie);
  123. //from where的临时统计
  124. $this->tempFromWhere($request, $uid_cookie);
  125. $response = $next($request);
  126. $stats = $request->get('stats', 0);
  127. if ($request->has('fromtype') && $request->input('fromtype')) {
  128. try {
  129. $from = $request->input('fromtype', 'main');
  130. Cookie::queue('from', $from, env('U_COOKIE_EXPIRE'), null, null, false, false);
  131. if (!$stats) {
  132. Redis::sadd('push:distribution_channel_id:' . $distribution_channel_id . 'from:' . $from . ':date:' . date('Y-m-d'), $uid_cookie);
  133. Redis::sadd('push:distribution_channel_id:alluv:from:' . $from, $uid_cookie);
  134. Redis::hincrby('push:distribution_channel_id:allpv', $from, 1);
  135. Redis::hincrby('customer:push:click:distribution_channel_id:' . $distribution_channel_id . 'from:' . $from, date('Y-m-d'), 1);
  136. Redis::sadd('wap_from_stats' . date('Y-m-d'), $distribution_channel_id . '-' . $from);
  137. }
  138. } catch (\Exception $e) {
  139. Log::info($e);
  140. }
  141. }
  142. $from = $request->get('fromtype');
  143. $inner_order_id = $request->get('inner_order_id');
  144. if (!$from) {
  145. $from = Cookie::get('from');
  146. $this->innerSendOrderIdFromFromtype($uid_cookie, 1, $from, $inner_order_id);
  147. } else {
  148. $this->innerSendOrderIdFromFromtype($uid_cookie, $stats, $from, $inner_order_id);
  149. }
  150. //内部派单
  151. if ($inner_order_id) {
  152. $this->innerSendOrderIdStats($uid_cookie, $inner_order_id, $stats);
  153. }
  154. //crm
  155. $this->crmParam($request);
  156. //from_title_image
  157. $this->fromTitleImage($request, $uid_cookie);
  158. $this->InnerOuterWeixinStats($request,$uid_cookie,$distribution_channel_id);
  159. if ($test) {
  160. Cookie::queue(env('COOKIE_AUTH_WEB_WECHAT'), 9, env('U_COOKIE_EXPIRE'), null, null, false, false);
  161. }
  162. return $response;
  163. }
  164. private function share(Request $request)
  165. {
  166. if ($request->has('fromtype') && 'readershare' == $request->get('fromtype')) {
  167. $bid = $request->get('bid');
  168. try {
  169. if ($bid) {
  170. $bid_arr = Hashids::decode($bid);
  171. isset($bid_arr[0]) && $bid = $bid_arr[0];
  172. }
  173. } catch (\Exception $e) {
  174. }
  175. $fromflag = $request->get('fromflag', 0);
  176. $cid = $request->get('fromcid', 0);
  177. Cookie::queue('reader_share_bid', $bid . '-' . $fromflag, 60);
  178. Cookie::queue('reader_share_cid', $cid, 60);
  179. }
  180. }
  181. private function innerSendOrderIdFromFromtype($uid, $stats, $from, $inner_order_id)
  182. {
  183. //$inner_send_order_id = ReadRecordService::getInnerSendOrderId($uid);
  184. $inner_send_order_id = false;
  185. if (!$inner_send_order_id) {
  186. if ($from && (starts_with($from, 'custom') || starts_with($from, 'template')) && count(explode('_', $from)) == 2) {
  187. if (!$inner_order_id) {
  188. $this->innerSendOrderIdStats($uid, $from, $stats);
  189. }
  190. }
  191. }
  192. }
  193. private function innerSendOrderIdStats($uid, $inner_order_id, $stats)
  194. {
  195. try {
  196. ReadRecordService::setInnerSendOrderId($uid, $inner_order_id);
  197. if (!$stats) {
  198. Redis::sadd('push:inner_send_order_id:uv:' . $inner_order_id, $uid);
  199. Redis::hincrby('push:inner_send_order_id:pv', $inner_order_id, 1);
  200. }
  201. } catch (\Exception $e) {
  202. }
  203. }
  204. private function cookieNoCrypt()
  205. {
  206. $cookie_key = ['send_order_id', 'from', 'send_order_continue', 'send_order_flag'];
  207. foreach ($cookie_key as $v) {
  208. $temp = Cookie::get($v);
  209. if ($temp && strlen($temp) > 150) {
  210. try {
  211. $temp = decrypt($temp);
  212. } catch (\Exception $e) {
  213. }
  214. if ($v == 'from') {
  215. Cookie::queue('from', $temp, env('U_COOKIE_EXPIRE'), null, null, false, false);
  216. //Cookie::queue($v, $temp);
  217. } else {
  218. Cookie::queue($v, $temp, env('U_COOKIE_EXPIRE'), null, null, false, false);
  219. }
  220. }
  221. }
  222. }
  223. /**
  224. * 公众号签名@华灯初上
  225. * @param $params
  226. * @return string
  227. */
  228. protected function getSign($params, $key)
  229. {
  230. $url = $this->arr_to_url($params, false);
  231. $url = $url . '&key=' . $key;
  232. $sign = md5($url);
  233. return $sign;
  234. }
  235. /**
  236. * 公众号签名@华灯初上
  237. * @param $array
  238. * @param bool $has_sign
  239. * @return string
  240. */
  241. protected function arr_to_url($array, $has_sign = false)
  242. {
  243. ksort($array);
  244. reset($array);
  245. $arg = "";
  246. while (list ($name, $val) = each($array)) {
  247. if ($name == 'sign' && !$has_sign) continue;
  248. if (strpos($name, "_") === 0)
  249. continue;
  250. if (is_array($val))
  251. $val = join(',', $val);
  252. if ($val === "")
  253. continue;
  254. $arg .= $name . "=" . $val . "&";
  255. }
  256. $arg = substr($arg, 0, count($arg) - 2);
  257. return $arg;
  258. }
  259. private function apidAndOpenId($distribution_channel_id, $appid, $openid, $uid, $send_order_id)
  260. {
  261. $appid_info = OfficialAccountService::officialAccountByAppid(['appid' => $appid]);
  262. if (!$appid_info || !isset($appid_info->distribution_channel_id))
  263. return false;
  264. if ($appid_info->distribution_channel_id != $distribution_channel_id) {
  265. return false;
  266. }
  267. //ForceSubscribeService::
  268. $res = ForceSubscribeService::forceSubscribeUsersByUidAndAppid($appid, $uid);
  269. if ($res) return false;
  270. $forcesubuser = ForceSubscribeService::forceSubscribeUsersByOpenid(['openid' => $openid]);
  271. if ($forcesubuser) {
  272. return false;
  273. }
  274. /*$send_order_id = ReadRecordService::getSendOrderId($uid);
  275. if ($send_order_id) {
  276. try {
  277. Redis::hset('force_subscribe_from_send_order_id', $appid . '_' . $uid, $send_order_id);
  278. } catch (\Exception $e) {
  279. }
  280. }*/
  281. $user_info = ForceSubscribeService::getUserInfoAll($appid, $openid);
  282. $forcesubuserdata = [
  283. 'appid' => $appid,
  284. 'uid' => $uid,
  285. 'distribution_channel_id' => $distribution_channel_id,
  286. 'last_interactive_time' => date('Y-m-d H:i:s'),
  287. 'openid' => $openid,
  288. 'official_account_id' => 1
  289. ];
  290. if ($send_order_id) {
  291. $forcesubuserdata['send_order_id'] = $send_order_id;
  292. }
  293. if ($user_info) {
  294. isset($user_info['province']) && !empty($user_info['province']) && $forcesubuserdata['province'] = $user_info['province'];
  295. isset($user_info['nickname']) && !empty($user_info['nickname']) && $forcesubuserdata['nick_name'] = $user_info['nickname'];
  296. isset($user_info['city']) && !empty($user_info['city']) && $forcesubuserdata['city'] = $user_info['city'];
  297. isset($user_info['country']) && !empty($user_info['country']) && $forcesubuserdata['country'] = $user_info['country'];
  298. isset($user_info['headimgurl']) && !empty($user_info['headimgurl']) && $forcesubuserdata['headimgurl'] = $user_info['headimgurl'];
  299. isset($user_info['sex']) && !empty($user_info['sex']) && $forcesubuserdata['sex'] = $user_info['sex'];
  300. }
  301. ForceSubscribeService::addForceSubscribeUsers($forcesubuserdata);
  302. ForceSubscribeService::tempForceSubscribeUsersLastTimeUpdate([
  303. 'openid' => $openid,
  304. 'appid' => $appid,
  305. 'distribution_channel_id' => $distribution_channel_id,
  306. 'last_interactive_time' => date('Y-m-d H:i:s')
  307. ]);
  308. try {
  309. $send_data = array(
  310. 'type' => 'subscribe',
  311. 'data' => ['openid'=>'','uid'=>$uid]
  312. );
  313. $send = new SendStatisticsList($send_data);
  314. $job = ($send)->onConnection('rabbitmq')->delay(0)->onQueue('send_statistics_list');
  315. dispatch($job);
  316. } catch (\Exception $e) {
  317. Log::info($e);
  318. }
  319. return true;
  320. }
  321. private function smartPush(Request $request, $uid)
  322. {
  323. $bid = $request->get('bid');
  324. $fromsource = $request->get('fromsource');
  325. if (!$fromsource || !$bid) {
  326. return;
  327. }
  328. if ($fromsource != 'smart_push') {
  329. return;
  330. }
  331. $decode_bid_array = Hashids::decode($bid);
  332. if (!$decode_bid_array)
  333. return;
  334. $decode_bid = 0;
  335. if (isset($decode_bid_array[0]) && !empty($decode_bid_array[0])) {
  336. $decode_bid = $decode_bid_array[0];
  337. }
  338. if (!$decode_bid)
  339. return;
  340. //记录pv uv
  341. try {
  342. $uv_key = sprintf('%s_%s_uv', $decode_bid, 'smart_push');
  343. Redis::sadd($uv_key, $uid);
  344. Redis::HINCRBY('smart_push_test_book', $decode_bid, 1);
  345. ReadRecordService::setSmartPush($uid, $decode_bid);
  346. } catch (\Exception $e) {
  347. Log::info($e);
  348. }
  349. }
  350. protected function notAccessPage()
  351. {
  352. return '<html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><title>网站正在维护中</title></head><body style="padding:0;margin:0;font-size:0"><div style="width:300px;height:100px;margin: 20px auto"><p style="font-size:20px;color:red;text-align:center">网站正在维护中,请联系客服</p><img src="data:image/jpeg;base64,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" width=300px ></div></body></html>';
  353. }
  354. private function fromTitleImage(Request $request, $uid)
  355. {
  356. $from_title_image = $request->get('from_title_image');
  357. if ($from_title_image) {
  358. $key = 'smart_push_from_title_image:' . $from_title_image;
  359. try {
  360. Redis::hincrby($key, 'click_num', 1);
  361. Redis::sadd('smart_push_from_title_image_click_uv:' . $from_title_image, $uid);
  362. } catch (\Exception $e) {
  363. }
  364. }
  365. }
  366. /**
  367. * 临时统计
  368. * @param Request $request
  369. * @param $uid
  370. */
  371. private function tempFromWhere(Request $request, $uid)
  372. {
  373. $temp_from_where = env('TEMP_FROM_WHERE');
  374. if (!$temp_from_where) {
  375. return;
  376. }
  377. $from_where = $request->get('fromwhere');
  378. if (!$from_where) {
  379. return;
  380. }
  381. $url = $request->get('_url', '0');
  382. if (stripos($url, 'reader') !== false) {
  383. $temp_from_where_start_end = explode(',', $temp_from_where);
  384. if (count($temp_from_where_start_end) == 2) {
  385. if (time() > $temp_from_where_start_end[0] && time() < $temp_from_where_start_end[1]) {
  386. try {
  387. Redis::sadd('temp_from_where:' . $from_where, $uid);
  388. } catch (\Exception $e) {
  389. }
  390. return;
  391. }
  392. }
  393. }
  394. return;
  395. }
  396. /**
  397. * 禁止site+数字站点的访问 保留已经充值过的用户和4267站点所有用户
  398. * true禁止 false 不禁止
  399. * @param $distribution_channel_id
  400. * @return bool
  401. */
  402. private function isForbidPrimaryNumberChannleID($distribution_channel_id, $uid)
  403. {
  404. $forbid_primary_number_channel_id = env('FORBID_PRIMARY_NUMBER_CHANNEL_ID', '14,2,4267');
  405. if (is_numeric($distribution_channel_id) &&
  406. !in_array($distribution_channel_id, explode(',', $forbid_primary_number_channel_id)) &&
  407. !DB::table('orders')->where('uid', $uid)->where('status', 'PAID')->first()
  408. ) {
  409. return true;
  410. }
  411. return false;
  412. }
  413. /**
  414. * 特殊渠道的授权登陆
  415. * @param Request $request
  416. * @return string
  417. */
  418. private function authV2(Request $request, $channel_id)
  419. {
  420. if (!$request->has('auth')) return '';
  421. $auth = $request->get('auth');
  422. if ($auth != 'v2') {
  423. return '';
  424. }
  425. $h5_scheme = env('PROTOCOL', 'https');
  426. $domain = _domain();
  427. $params['redirect_url'] = urlencode($h5_scheme . '://' . $domain . '/oauthCallBackV2');
  428. $params['timestamp'] = time();
  429. $info = specialChannelAuthInfo();
  430. if (!$info || !isset($info[$channel_id])) {
  431. return '';
  432. }
  433. $appid = $info[$channel_id];
  434. if (!$appid) {
  435. return '';
  436. }
  437. $params['gzh_app_id'] = $appid;
  438. $params['sign'] = $this->getSign($params, env('OAUTH_KEY'));
  439. $redirect = env('AUTH_URL') . '?' . http_build_query($params);
  440. return $redirect;
  441. }
  442. /**
  443. * @param Request $request
  444. * @param $channel_id
  445. * @return string
  446. */
  447. private function auth(Request $request, $channel_id)
  448. {
  449. $appid = env('WECHAT_AUTH_APPID');
  450. $h5_scheme = env('PROTOCOL', 'https');
  451. $domain = _domain();
  452. $params['redirect_url'] = urlencode($h5_scheme . '://' . $domain . '/oauthCallBack');
  453. $params['timestamp'] = time();
  454. $info = specialChannelAuthInfoV2($channel_id);
  455. if ($info && isset($info[$channel_id]) && !empty($info[$channel_id])) {
  456. $appid = $info[$channel_id];
  457. }
  458. $params['gzh_app_id'] = $appid;
  459. $params['sign'] = $this->getSign($params, env('OAUTH_KEY'));
  460. $redirect = env('AUTH_URL') . '?' . http_build_query($params);
  461. return $redirect;
  462. }
  463. //个性化推送
  464. private function stylePush(Request $request, $uid, $distribution_channel_id)
  465. {
  466. $gxhp = $request->get('gxhp');
  467. if (!$gxhp || !$uid || !$distribution_channel_id) return;
  468. $date = date('Y-m-d');
  469. $uv_key = sprintf('push:stylepush:uv:%s:gxhp:%s:date:%s', $distribution_channel_id, $gxhp, $date);
  470. $pv_key = sprintf('push:stylepush:pv:%s:gxhp:%s:date:%s', $distribution_channel_id, $gxhp, $date);
  471. try {
  472. Redis::hset('book_read:' . $uid, 'gxhp', $gxhp);
  473. Redis::sadd($uv_key, $uid);
  474. Redis::incr($pv_key);
  475. Redis::sadd(sprintf('push:stylepush:date:%s', $date), sprintf('%s_%s', $distribution_channel_id, $gxhp));
  476. } catch (\Exception $e) {
  477. }
  478. }
  479. private function isLimit($area)
  480. {
  481. if ($area == 'unknown') {
  482. return 'DISABLED';
  483. }
  484. $limit_area = ['上海', '北京', '杭州', '南京', '广州'];
  485. foreach ($limit_area as $a) {
  486. Log::info('$area: ' . $area . ',$a: ' . $a . PHP_EOL);
  487. if (mb_strpos($area, $a) !== false) {
  488. return 'DISABLED';
  489. }
  490. }
  491. return 'ENABLE';
  492. }
  493. private function getIpArea($ip)
  494. {
  495. $client = new Client(['timeout' => 3.0]);
  496. $url = 'http://apis.juhe.cn/ip/ip2addr?key=5cb679e201b214cf70106e4bf09ab576&ip=' . $ip;
  497. $result = null;
  498. try {
  499. $result = $client->request('get', $url)->getBody()->getContents();
  500. } catch (\Exception $e) {
  501. return '';
  502. }
  503. if (!$result) return '';
  504. $result = json_decode($result, 1);
  505. $area = '';
  506. if (isset($result['result']) && !empty($result['result']) && isset($result['result']['area'])) {
  507. $area = $result['result']['area'];
  508. }
  509. return $area;
  510. }
  511. private function yun(Request $request, $uid, $distribution_channel_id)
  512. {
  513. $uri = $request->input('_url');
  514. if ($uri && strpos($uri, '/yun/') !== false) {
  515. return;
  516. }
  517. $param = $request->get('yun');
  518. //Log::info('$param is : '.$param);
  519. if (!$param) return;
  520. $bid = $request->get('bid');
  521. //Log::info('$bid = $request is : '.$bid);
  522. $send_order_info = SendOrderService::getRedirectUrlById($param);
  523. //Log::info('$send_order_info is : ');
  524. //Log::info($send_order_info);
  525. if ($bid) {
  526. $bid_arr = Hashids::decode($bid);
  527. isset($bid_arr[0]) && $bid = $bid_arr[0];
  528. }
  529. //Log::info('bid is'.$bid);
  530. if (!$send_order_info) return;
  531. if ($send_order_info->book_id && $send_order_info->book_id != $bid) return;
  532. if ($send_order_info->distribution_channel_id != $distribution_channel_id) return;
  533. if($uid){
  534. try{
  535. Redis::hset('book_read:' . $uid, 'send_order_id', $param);
  536. }catch (\Exception $e){}
  537. }
  538. is_numeric($bid) && $this->specialChannelIdStats($param, $distribution_channel_id, $uid, $bid);
  539. $key = date('Y-m-d');
  540. Cookie::queue('send_order_id', $param, env('U_COOKIE_EXPIRE'), null, null, false, false);
  541. $send_order_flag = Cookie::get('send_order_flag');
  542. $send_orders = explode(',', $send_order_flag);
  543. //uv
  544. if (!Cookie::get('send_order_flag_' . $param) && !in_array($param, $send_orders)) {
  545. Redis::hincrby('send_order_uv_' . $param, $key, 1);
  546. Redis::hincrby('send_order_uv_' . $param, 'total', 1);
  547. //Cookie::queue('send_order_flag_'.$param,$param, env('U_COOKIE_EXPIRE'), null, null, false, false);
  548. array_push($send_orders, $param);
  549. $str = implode(',', $send_orders);
  550. Cookie::queue('send_order_flag', $str, env('U_COOKIE_EXPIRE'), null, null, false, false);
  551. }
  552. if (Cookie::get('send_order_flag_' . $param)) {
  553. array_push($send_orders, $param);
  554. $str = implode(',', $send_orders);
  555. Cookie::queue('send_order_flag', $str, env('U_COOKIE_EXPIRE'), null, null, false, false);
  556. Cookie::queue('send_order_flag_' . $param, null, -1);
  557. }
  558. //pv
  559. Redis::hincrby('send_order_pv_' . $param, $key, 1);//每天
  560. Redis::hincrby('send_order_pv_' . $param, 'total', 1);//汇总
  561. Redis::sadd('send_order' . $key, $param);
  562. $uv = Redis::hget('send_order_uv_' . $param, $key);
  563. $uv && $uv >= 20 && SendOrderService::updateSendOrderTime($param);
  564. }
  565. /**
  566. * 用户从A连接推送的书,进入后,被标记bookid+派单id,之后所有的统计计算到该派单下
  567. * @param int $send_order_id
  568. * @param int $distribution_channel_id
  569. * @param int $uid
  570. * @param int $bid
  571. */
  572. private function specialChannelIdStats(
  573. int $send_order_id,
  574. int $distribution_channel_id,
  575. int $uid,
  576. int $bid
  577. ):void
  578. {
  579. if (!$bid || !$distribution_channel_id || !$uid || !$send_order_id)
  580. return;
  581. $specialChannelIdStats = env('SPECIAL_CHANNEL_STATS', 211);
  582. if (!in_array($distribution_channel_id, explode(',', $specialChannelIdStats))) {
  583. return;
  584. }
  585. WapVisitStatService::specialChannelIdStatsMarkUser($uid, $bid, $send_order_id);
  586. return;
  587. }
  588. private function authCallBack(Request $request)
  589. {
  590. $auth_uid = $request->get('auth_uid');
  591. $atime = $request->get('atime');
  592. $sign = $request->get('sign');
  593. if (!$auth_uid || !$atime || !$sign) return 0;
  594. if (!is_numeric($auth_uid) || !is_numeric($atime)) return 0;
  595. if ((time() - $atime) > 5) return 0;
  596. if (get_sign(compact('auth_uid', 'atime')) !== $sign) return 0;
  597. Cookie::queue(env('COOKIE_AUTH_WEB_WECHAT'), $auth_uid, env('U_COOKIE_EXPIRE'), null, null, false, false);
  598. return $auth_uid;
  599. }
  600. private function getAppSecretByAppId($appId)
  601. {
  602. $info = DB::table('official_setting')->where('appid', $appId)->select('secret')->first();
  603. if ($info) {
  604. return $info->secret;
  605. }
  606. return '';
  607. }
  608. private function authReduceRedirect(Request $request,$distribution_channel_id,$send_order_id){
  609. $h5_scheme = env('H5_SCHEME', 'https');
  610. $params = $request->except('_url');
  611. if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR']) {
  612. $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  613. } else {
  614. $ip = get_client_ip();
  615. }
  616. $params['ip'] = $ip;
  617. if(isset($params['auth_uid'])) unset($params['auth_uid']);
  618. if(isset($params['atime'])) unset($params['atime']);
  619. if(isset($params['sign'])) unset($params['sign']);
  620. $url = str_replace('http://', $h5_scheme . '://', url()->current() . '?' . http_build_query($params));
  621. unset($params['ip']);
  622. $params['redirect_url'] = urlencode($url);
  623. $params['timestamp'] = time();
  624. $params['channel_id'] = $distribution_channel_id;
  625. $params['sid'] = $send_order_id;
  626. $params['sign'] = $this->getSign($params, env('OAUTH_KEY'));
  627. //新的授权
  628. $auth_redirect_one_appids = specialChannelAuthInfoV2($distribution_channel_id);
  629. $auth_redirect_two_appids = specialChannelAuthInfo();
  630. if($auth_redirect_one_appids && isset($auth_redirect_one_appids[$distribution_channel_id])){
  631. //授权一次
  632. $callback = env('AUTH_CALLBACK_URL_V2');
  633. $appid = $auth_redirect_one_appids[$distribution_channel_id];
  634. }elseif($auth_redirect_two_appids && isset($auth_redirect_two_appids[$distribution_channel_id]) ){
  635. //授权二次
  636. $callback = env('AUTH_CALLBACK_URL_V2_2');
  637. $appid = env('WECHAT_AUTH_APPID');
  638. }else{
  639. //默认授权
  640. $callback = env('AUTH_CALLBACK_URL_V2');
  641. $appid = env('WECHAT_AUTH_APPID');
  642. }
  643. $params['appid'] = $appid;
  644. $secret = $this->getAppSecretByAppId($appid);
  645. $options = [
  646. 'app_id' => $appid,
  647. 'secret' => $secret,
  648. 'oauth' => [
  649. 'scopes' => ['snsapi_base'],
  650. 'callback' => $callback . '?' . http_build_query($params),
  651. ],
  652. ];
  653. return $options;
  654. }
  655. private function crmParam(Request $request){
  656. $crm_param = $request->get('crm');
  657. if($crm_param){
  658. Cookie::queue('crm', $crm_param);
  659. }
  660. }
  661. //内外部模板客服统计埋点 custom_379989 template_75113
  662. private function InnerOuterWeixinStats(Request $request,$uid,$distribution_channel_id){
  663. if($request->has('jump_from') || !$request->has('fromtype')) return ;
  664. $from = $request->get('fromtype');
  665. if(!str_contains($from,['custom','template'])){
  666. return ;
  667. }
  668. $openChannel = redisEnv('OPEN_INNER_OUTER_WEIXIN_STATS');
  669. if(!$openChannel || !in_array($distribution_channel_id,explode(',',$openChannel))) return ;
  670. ReadRecordService::setByField($uid,'new_total',$from);
  671. $day = date('Y-m-d');
  672. $pv_key = sprintf('InnerOuterWeixinStats:pv:%s:%s',$from,$distribution_channel_id);
  673. $uv_key = sprintf('InnerOuterWeixinStats:uv:%s:%s:%s',$from,$distribution_channel_id,$day);
  674. Redis::hincrby($pv_key,$day,1);
  675. Redis::sadd($uv_key,$uid);
  676. Redis::sadd('InnerOuterWeixinStats:'.$day,$from.':'.$distribution_channel_id);
  677. }
  678. private function crmJump(Request $request,$uid,$en_distribution_channel_id){
  679. $info = DB::table('crm_transfer')->where('from_uid',$uid)->where('is_enable',1)->select('to_uid')->first();
  680. if(!$info)return '';
  681. $uri = $request->input('_url');
  682. if (strpos($uri, '/yun/') !== false) {
  683. return '';
  684. }
  685. $params = [];
  686. $s_param = $request->except('_url');
  687. $filter_key = ['id','bid','cid'];
  688. foreach ($s_param as $k=>$v){
  689. if(in_array($k,$filter_key)){
  690. $params[$k] = $v;
  691. }
  692. }
  693. $nowurl = str_replace('http://', env('PROTOCOL') . '://', url()->current() . '?' . http_build_query($params));
  694. $url_info = parse_url($nowurl);
  695. $domain = str_replace($en_distribution_channel_id,
  696. decodeDistributionChannelId(5204),$url_info['host']);
  697. !isset($url_info['path'])&&$url_info['path'] = '/';
  698. if($params){
  699. $return_url = sprintf('%s://%s%s?%s',
  700. env('PROTOCOL'),
  701. $domain,
  702. $url_info['path'],
  703. http_build_query($params)
  704. );
  705. }else{
  706. $return_url = sprintf('%s://%s%s',
  707. env('PROTOCOL'),
  708. $domain,
  709. $url_info['path']
  710. );
  711. }
  712. return $return_url;
  713. }
  714. }