AdReplaceBookController.php 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  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;
  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. }else{
  60. $doShied = [];
  61. }
  62. // } catch (\Exception $exception) {
  63. // $doShied = [];
  64. // }
  65. return response()->success($doShied);
  66. }
  67. /***
  68. * 派单统计
  69. * name: sendOrderStatistic
  70. * @param $send_order
  71. * date 2023/02/15 11:13
  72. */
  73. private function sendOrderStatistic($send_order)
  74. {
  75. $key = date('Y-m-d');
  76. $send_order_flag = Cookie::get('send_order_flag');
  77. $send_orders = explode(',', trim($send_order_flag, ','));
  78. //uv
  79. if (!Cookie::get('send_order_flag_' . $this->send_order_id) && !in_array($this->send_order_id, $send_orders)) {
  80. Redis::hincrby('send_order_uv_' . $this->send_order_id, $key, 1);
  81. Redis::hincrby('send_order_uv_' . $this->send_order_id, 'total', 1);
  82. array_push($send_orders, $this->send_order_id);
  83. $str = implode(',', $send_orders);
  84. Cookie::queue('send_order_flag', $str, env('U_COOKIE_EXPIRE'), null, null, false, false);
  85. }
  86. if (Cookie::get('send_order_flag_' . $this->send_order_id)) {
  87. array_push($send_orders, $this->send_order_id);
  88. $str = implode(',', $send_orders);
  89. Cookie::queue('send_order_flag', $str, env('U_COOKIE_EXPIRE'), null, null, false, false);
  90. Cookie::queue('send_order_flag_' . $this->send_order_id, null, -1);
  91. }
  92. //pv
  93. Redis::hincrby('send_order_pv_' . $this->send_order_id, $key, 1); //每天
  94. Redis::hincrby('send_order_pv_' . $this->send_order_id, 'total', 1); //汇总
  95. Redis::sadd('send_order' . $key, $this->send_order_id);
  96. if (isset($send_order->send_time) && $send_order->send_time) {
  97. } else {
  98. $uv = Redis::hget('send_order_uv_' . $this->send_order_id, $key);
  99. if ($uv && $uv > 20) {
  100. SendOrderService::updateSendOrderTime($this->send_order_id);
  101. }
  102. }
  103. }
  104. /***
  105. * 获取替换书籍 优级为 系统屏蔽展示书籍-> 腾讯adq非广告用户展示书籍 ->展现备用书籍q
  106. * name: getRealBookInfo
  107. * @param mixed $checkout_tx 是否是腾讯adq非广告用户
  108. * @param mixed $platform 投放平台
  109. * date 2023/02/15 11:13
  110. */
  111. private function getRealBookInfo($checkout_tx = '', $platform = "")
  112. {
  113. // 系统ip和城市屏蔽
  114. $info = QappSendOrderContentShieldConfigService::doShied($this->send_order_id, _getIp()); // 系统书籍屏蔽
  115. if ($info) {
  116. return $this->checkoutBookInfo($info);
  117. }
  118. // 腾讯非广告用户替换检测
  119. if ($checkout_tx) {
  120. $tx_info = $this->getNoAdvBookInfo();
  121. if ($tx_info) {
  122. return $this->checkoutBookInfo($tx_info);
  123. }
  124. }
  125. if (!in_array($platform, ['tx_adq', 'tx_adq_new'])) {
  126. // 派单书籍替换针对非腾讯投放平台
  127. $send_order_replace_info = $this->sendOrderBookReplace($this->send_order_id); // 派单替换书籍
  128. if ($send_order_replace_info) {
  129. return $this->checkoutBookInfo($send_order_replace_info);
  130. }
  131. }
  132. return [];
  133. }
  134. /**
  135. * 腾讯广告新版,非点击广告访问链接的用户将看到配置的非广告书籍
  136. * - 如果是通过腾讯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
  137. * - 否则,形如:hap://app/com.beidao.kuaiying.zsy/views/Reader?send_order_id=3521701&bid=PGZq37EQ1brwdgpeyaR8Voa42OXNk6Ap&chapter_id=23655059&platform=huawei_fyp
  138. */
  139. private function getNoAdvBookInfo(): array
  140. {
  141. $extraConfig = QappSendOrder::where('send_order_id', $this->send_order_id)
  142. ->where('platform', 'tx_adq_new')
  143. ->value('extra_config');
  144. if ($extraConfig) {
  145. $extraConfigDecode = json_decode($extraConfig, true);
  146. $bid = str_decode($extraConfigDecode['txAdqNoAdvBid'] ?? '');
  147. $cid = $extraConfigDecode['txAdqNoAdvCid'] ?? 0;
  148. if ($bid) {
  149. return ['bid' => $bid, 'cid' => $cid];
  150. }
  151. }
  152. return [];
  153. }
  154. /**
  155. * 派单书籍替换
  156. * name: sendOrderBookReplace
  157. * @param mixed $send_order_id
  158. * @return array
  159. * date 2023/02/15 11:08
  160. */
  161. private function sendOrderBookReplace($send_order_id = 0): array
  162. {
  163. $book = [];
  164. if ($send_order_id > 0) {
  165. $extra_config = QappSendOrder::where(['send_order_id' => $send_order_id])->value('extra_config');
  166. $extra_config = empty($extra_config) ? [] : json_decode($extra_config, true);
  167. $status = $extra_config['replace_book_status'] ?? 0;
  168. $bid = $extra_config['replace_book_bid'] ?? "";
  169. $cid = $extra_config['replace_chapter_cid'] ?? 0;
  170. if ($status == 1) {
  171. if (!empty($bid) && !empty($cid)) {
  172. $book = ['bid' => str_decode($bid), 'cid' => $cid];
  173. } else {
  174. myLog("SendOrderReplaceBookError")->info(['send_order_id' => $send_order_id, 'extra_config' => $extra_config]);
  175. }
  176. }
  177. }
  178. return $book;
  179. }
  180. private function checkoutBookInfo($info)
  181. {
  182. $bid = $info['bid'] ?? 0;
  183. // 检查书籍是否可用
  184. if (!BookConfigService::getAvailableBIdsbyBids([$bid], $this->distribution_channel_id)) {
  185. $info = $this->getAvailableBookInfoByBid($bid); // 获取可用书籍
  186. }
  187. return $info;
  188. }
  189. /**
  190. * 获取同频道其他可用书籍,默认女频书(外部上架)
  191. * name: getAvailableBookInfoByBid
  192. * @param $bid
  193. * @return array
  194. * date 2023/02/15 14:22
  195. */
  196. private function getAvailableBookInfoByBid($bid)
  197. {
  198. $channel = DB::table('book_categories')->join('books', 'books.category_id', '=', 'book_categories.id')->where('books.id', $bid)->value('book_categories.pid');
  199. $channel = $channel ?: 2;
  200. $bids = BookConfigService::getRecommendBids($this->package, $channel, [], 1);
  201. if ($bids) {
  202. $bid = $bids[0];
  203. }
  204. $cid = Chapter::where('bid', $bid)->orderBy('sequence', 'asc')->value('id');
  205. return compact('bid', 'cid');
  206. }
  207. }