AdReplaceBookController.php 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. <?php
  2. /**
  3. * 广告修改书籍获取接口
  4. * @file:AdReplaceBookController.php
  5. * @Created by gnitif
  6. * @Date: 2022/9/27
  7. * @Time: 10:44
  8. */
  9. namespace App\Http\Controllers\QuickApp\SendOrder;
  10. use App\Http\Controllers\QuickApp\BaseController;
  11. use App\Modules\Book\Models\Chapter;
  12. use App\Modules\Book\Services\BookConfigService;
  13. use App\Modules\Channel\Services\QappSendOrderContentShieldConfigService;git
  14. use App\Modules\SendOrder\Models\QappSendOrder;
  15. use App\Modules\SendOrder\Services\SendOrderService;
  16. use Illuminate\Http\Request;
  17. use Cookie;
  18. use Illuminate\Support\Facades\DB;
  19. use Redis;
  20. class AdReplaceBookController extends BaseController
  21. {
  22. private $send_order_id;
  23. private $package;
  24. public function getAdvReplaceBookInfo(Request $request)
  25. {
  26. $book = [];
  27. try {
  28. $package = $request->header('x-package', '');
  29. // 暂时关闭浩瀚书籍替换
  30. if (!in_array($package, [ "com.beidao.kuaiying.haohannew" , "com.beidao.kuaiying.haohan"])) {
  31. $send_order_id = $request->input('send_order_id', 0);
  32. $book = $this->sendOrderBookReplace($send_order_id);
  33. if ($book) $book['bid'] = str_encode($book['bid']);
  34. }
  35. } catch (\Exception $exception) {
  36. $book = [];
  37. }
  38. return response()->success($book);
  39. }
  40. /**
  41. * ip屏蔽书籍替换
  42. * name: advShield
  43. * @param Request $request
  44. * @return mixed
  45. * date 2023/02/15 14:52
  46. */
  47. public function advShield(Request $request)
  48. {
  49. try {
  50. $this->send_order_id = $request->input('send_order_id', 0);
  51. $this->package = $request->input('package');
  52. $checkout_tx = strtolower($request->input('checkout_tx', '')); // 腾讯非广告
  53. $platform = strtolower($request->input('platform', '')); // 投放平台小写
  54. $send_order = SendOrderService::getSendOrderStatic($this->send_order_id);
  55. $this->sendOrderStatistic($send_order); // 统计
  56. $doShied = $this->getRealBookInfo($checkout_tx, $platform);
  57. if ($doShied) {
  58. $doShied['bid'] = str_encode($doShied['bid']);
  59. }
  60. } catch (\Exception $exception) {
  61. $doShied = [];
  62. }
  63. return response()->success($doShied);
  64. }
  65. /***
  66. * 派单统计
  67. * name: sendOrderStatistic
  68. * @param $send_order
  69. * date 2023/02/15 11:13
  70. */
  71. private function sendOrderStatistic($send_order)
  72. {
  73. $key = date('Y-m-d');
  74. $send_order_flag = Cookie::get('send_order_flag');
  75. $send_orders = explode(',', trim($send_order_flag, ','));
  76. //uv
  77. if (!Cookie::get('send_order_flag_' . $this->send_order_id) && !in_array($this->send_order_id, $send_orders)) {
  78. Redis::hincrby('send_order_uv_' . $this->send_order_id, $key, 1);
  79. Redis::hincrby('send_order_uv_' . $this->send_order_id, 'total', 1);
  80. array_push($send_orders, $this->send_order_id);
  81. $str = implode(',', $send_orders);
  82. Cookie::queue('send_order_flag', $str, env('U_COOKIE_EXPIRE'), null, null, false, false);
  83. }
  84. if (Cookie::get('send_order_flag_' . $this->send_order_id)) {
  85. array_push($send_orders, $this->send_order_id);
  86. $str = implode(',', $send_orders);
  87. Cookie::queue('send_order_flag', $str, env('U_COOKIE_EXPIRE'), null, null, false, false);
  88. Cookie::queue('send_order_flag_' . $this->send_order_id, null, -1);
  89. }
  90. //pv
  91. Redis::hincrby('send_order_pv_' . $this->send_order_id, $key, 1); //每天
  92. Redis::hincrby('send_order_pv_' . $this->send_order_id, 'total', 1); //汇总
  93. Redis::sadd('send_order' . $key, $this->send_order_id);
  94. if (isset($send_order->send_time) && $send_order->send_time) {
  95. } else {
  96. $uv = Redis::hget('send_order_uv_' . $this->send_order_id, $key);
  97. if ($uv && $uv > 20) {
  98. SendOrderService::updateSendOrderTime($this->send_order_id);
  99. }
  100. }
  101. }
  102. /***
  103. * 获取替换书籍 优级为 系统屏蔽展示书籍-> 腾讯adq非广告用户展示书籍 ->展现备用书籍q
  104. * name: getRealBookInfo
  105. * @param mixed $checkout_tx 是否是腾讯adq非广告用户
  106. * @param mixed $platform 投放平台
  107. * date 2023/02/15 11:13
  108. */
  109. private function getRealBookInfo($checkout_tx = '', $platform = "")
  110. {
  111. // 系统ip和城市屏蔽
  112. $info = QappSendOrderContentShieldConfigService::doShied($this->send_order_id, _getIp()); // 系统书籍屏蔽
  113. if ($info) {
  114. return $this->checkoutBookInfo($info);
  115. }
  116. // 腾讯非广告用户替换检测
  117. if ($checkout_tx) {
  118. $tx_info = $this->getNoAdvBookInfo();
  119. if ($tx_info) {
  120. return $this->checkoutBookInfo($tx_info);
  121. }
  122. }
  123. if (!in_array($platform, ['tx_adq', 'tx_adq_new'])) {
  124. // 派单书籍替换针对非腾讯投放平台
  125. $send_order_replace_info = $this->sendOrderBookReplace($this->send_order_id); // 派单替换书籍
  126. if ($send_order_replace_info) {
  127. return $this->checkoutBookInfo($send_order_replace_info);
  128. }
  129. }
  130. return [];
  131. }
  132. /**
  133. * 腾讯广告新版,非点击广告访问链接的用户将看到配置的非广告书籍
  134. * - 如果是通过腾讯adq广告投放的hap链接中,会有腾讯广告那边添加的参数,形如:hap://app/com.beidao.kuaiying.zsy/views/Reader?send_order_id=3402324&bid=5pNo6A7wqQmB1WgQygDjkOM9VZn2vXeY&chapter_id=1252&platform=tx_adq_new&back_name=%E5%BE%AE%E8%A7%86&back_pkg=com.tencent.weishi&back_url=weishi%3A%2F%2F
  135. * - 否则,形如:hap://app/com.beidao.kuaiying.zsy/views/Reader?send_order_id=3521701&bid=PGZq37EQ1brwdgpeyaR8Voa42OXNk6Ap&chapter_id=23655059&platform=huawei_fyp
  136. */
  137. private function getNoAdvBookInfo(): array
  138. {
  139. $extraConfig = QappSendOrder::where('send_order_id', $this->send_order_id)
  140. ->where('platform', 'tx_adq_new')
  141. ->value('extra_config');
  142. if ($extraConfig) {
  143. $extraConfigDecode = json_decode($extraConfig, true);
  144. $bid = str_decode($extraConfigDecode['txAdqNoAdvBid'] ?? '');
  145. $cid = $extraConfigDecode['txAdqNoAdvCid'] ?? 0;
  146. if ($bid) {
  147. return ['bid' => $bid, 'cid' => $cid];
  148. }
  149. }
  150. return [];
  151. }
  152. /**
  153. * 派单书籍替换
  154. * name: sendOrderBookReplace
  155. * @param mixed $send_order_id
  156. * @return array
  157. * date 2023/02/15 11:08
  158. */
  159. private function sendOrderBookReplace($send_order_id = 0): array
  160. {
  161. $book = [];
  162. if ($send_order_id > 0) {
  163. $extra_config = QappSendOrder::where(['send_order_id' => $send_order_id])->value('extra_config');
  164. $extra_config = empty($extra_config) ? [] : json_decode($extra_config, true);
  165. $status = $extra_config['replace_book_status'] ?? 0;
  166. $bid = $extra_config['replace_book_bid'] ?? "";
  167. $cid = $extra_config['replace_chapter_cid'] ?? 0;
  168. if ($status == 1) {
  169. if (!empty($bid) && !empty($cid)) {
  170. $book = ['bid' => str_decode($bid), 'cid' => $cid];
  171. } else {
  172. myLog("SendOrderReplaceBookError")->info(['send_order_id' => $send_order_id, 'extra_config' => $extra_config]);
  173. }
  174. }
  175. }
  176. return $book;
  177. }
  178. private function checkoutBookInfo($info)
  179. {
  180. $bid = $info['bid'] ?? 0;
  181. // 检查书籍是否可用
  182. if (!BookConfigService::getAvailableBIdsbyBids([$bid], $this->distribution_channel_id)) {
  183. $info = $this->getAvailableBookInfoByBid($bid); // 获取可用书籍
  184. }
  185. return $info;
  186. }
  187. /**
  188. * 获取同频道其他可用书籍,默认女频书(外部上架)
  189. * name: getAvailableBookInfoByBid
  190. * @param $bid
  191. * @return array
  192. * date 2023/02/15 14:22
  193. */
  194. private function getAvailableBookInfoByBid($bid)
  195. {
  196. $channel = DB::table('book_categories')->join('books', 'books.category_id', '=', 'book_categories.id')->where('books.id', $bid)->value('book_categories.pid');
  197. $channel = $channel ?: 2;
  198. $bids = BookConfigService::getRecommendBids($this->package, $channel, [], 1);
  199. if ($bids) {
  200. $bid = $bids[0];
  201. }
  202. $cid = Chapter::where('bid', $bid)->orderBy('sequence', 'asc')->value('id');
  203. return compact('bid', 'cid');
  204. }
  205. }