Açıklama Yok

AdPlacementService.php 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. <?php
  2. namespace App\Services;
  3. use App\Models\JxAdPlacementLog;
  4. use App\Models\JxTransformRecord;
  5. use App\Models\Sys\SysCustomerAdver;
  6. use App\Support\EmailQueue;
  7. use App\Support\Log;
  8. use App\Support\TaoBaoAd;
  9. use Illuminate\Http\Request;
  10. class AdPlacementService
  11. {
  12. /**
  13. * 处理快手广告位下单数据
  14. * @param $data
  15. * @param $logId
  16. * @return array
  17. */
  18. public static function handleAdPlacementLogData($data, $logId) {
  19. $requestId = 'kuxuan-'.time().rand(1000, 9999);
  20. //每新建一个广告位,监测链接中都携带广告位ID,
  21. $advertiserSpaceId = !empty($data['advertiser_space_id']) ? $data['advertiser_space_id'] : '1939686';//todo 后续要将默认值取消,并判断字段不存在或者为空时要报警
  22. // $testAccount = '54284957';
  23. $requestParams = [
  24. 'taskId' => '570901022',
  25. 'app' => 1,
  26. 'channel' => '2200803434552',
  27. 'advertisingSpaceId' => $advertiserSpaceId,
  28. 'requestId' => $requestId,
  29. 'callbackUrl' => 'https://zhitou.wenxingshuju.com/order/callback?log_id='.$logId,
  30. 'transformType' => 64
  31. ];
  32. if(!empty($data['imei_md5']) && $data['imei_md5'] != '__IMEI2__') {
  33. $requestParams['imeiMd5'] = $data['imei_md5'];
  34. }
  35. if(!empty($data['oaid']) && !in_array($data['oaid'], [
  36. '00000000-0000-0000-0000-000000000000', '__OAID__'])) {
  37. $requestParams['oaid'] = $data['oaid'];
  38. }
  39. if(!empty($data['oaid_md5']) && !in_array($data['oaid_md5'], [
  40. '9f89c84a559f573636a47ff8daed0d33', '__OAID2__'])) {
  41. $requestParams['oaidMd5'] = $data['oaid_md5'];
  42. }
  43. if(!empty($data['idfa_withdash_md5']) && $data['idfa_withdash_md5'] != '__IDFA2__') {
  44. $requestParams['idfaMd5'] = $data['idfa_withdash_md5'];
  45. }
  46. if(!empty($data['imei']) && $data['imei'] != '__IMEI__') {
  47. $requestParams['imei'] = $data['imei'];
  48. }
  49. if(!empty($data['idfa']) && $data['idfa'] != '__IDFA__') {
  50. $requestParams['idfa'] = $data['idfa'];
  51. }
  52. if(!empty($data['kenyid_caa']) && $data['kenyid_caa'] != '__KENYID_CAA__') {
  53. $kenyidCaa = json_decode(urldecode($data['kenyid_caa']), true);
  54. foreach($kenyidCaa as $kenyid) {
  55. if($kenyid['version'] == '20220111') {
  56. $requestParams['caid'] = $kenyid['kenyId'];
  57. $requestParams['caidMd5'] = $kenyid['kenyId_MD5'];
  58. $requestParams['caidVersion'] = $kenyid['version'];
  59. }elseif($kenyid['version'] == '20211207') {
  60. $requestParams['caid2'] = $kenyid['kenyId'];
  61. $requestParams['caid2Md5'] = $kenyid['kenyId_MD5'];
  62. $requestParams['caid2Version'] = $kenyid['version'];
  63. }
  64. }
  65. }
  66. if(!empty($data['ip']) && $data['ip'] != '__IP__') {
  67. $requestParams['ip'] = $data['ip'];
  68. }
  69. if(!empty($data['androidid_md5']) && $data['androidid_md5'] != '__ANDROIDID2__') {
  70. $requestParams['androidId'] = $data['androidid_md5'];
  71. }
  72. if(!empty($data['ua']) && $data['ua'] != '__UA__') {
  73. $requestParams['ua'] = $data['ua'];
  74. }
  75. $taobaoAd = new TaoBaoAd();
  76. if(1 == $data['action_type']) {
  77. $result = $taobaoAd->exposureReport($requestParams);
  78. } else if(2 == $data['action_type']) {
  79. $result = $taobaoAd->clickReportAndCallback($requestParams);
  80. }
  81. return $result;
  82. }
  83. /**
  84. * 处理请求数据
  85. * @param Request $request
  86. * @return array
  87. */
  88. public static function processRequestData(Request $request)
  89. {
  90. return [
  91. 'promotion_channel_id' => $request->input('promotion_channel_id'),
  92. 'action_type' => $request->input('action_type') == 'impression' ? 1 : ($request->input('action_type') == 'click' ? 2 : 0),
  93. 'tracking_id' => $request->input('tracking_id'),
  94. 'account_id' => $request->input('account_id'),
  95. 'campaign_id' => $request->input('campaign_id'),
  96. 'campaign_name' => $request->input('campaign_name'),
  97. 'ad_id' => $request->input('ad_id'),
  98. 'creative_id' => $request->input('creative_id'),
  99. 'idfa_withdash_md5' => $request->input('idfa_withdash_md5'),
  100. 'mac_upper_withcolon' => $request->input('mac_upper_withcolon'),
  101. 'mac_upper_withcolon_md5' => $request->input('mac_upper_withcolon_md5'),
  102. 'mac_upper_nocolon_md5' => $request->input('mac_upper_nocolon_md5'),
  103. 'timestamp_ms' => $request->input('timestamp_ms'),
  104. 'ip' => $request->input('ip'),
  105. 'callback_url' => $request->input('callback_url'),
  106. 'csite' => $request->input('csite'),
  107. 'idfa_sha1' => $request->input('idfa_sha1'),
  108. 'imei_md5' => $request->input('imei_md5'),
  109. 'androidid_md5' => $request->input('androidid_md5'),
  110. 'oaid' => $request->input('oaid'),
  111. 'oaid_md5' => $request->input('oaid_md5'),
  112. 'imei_sha1' => $request->input('imei_sha1'),
  113. 'androidid_sha1' => $request->input('androidid_sha1'),
  114. 'ua' => $request->input('ua'),
  115. 'brand' => AdPlacementService::detectMobileBrand($request->input('ua')),
  116. 'os_code' => $request->input('os_code') != '__OS__' ? $request->input('os_code') : 3,
  117. 'kuaishou_photo_id' => $request->input('kuaishou_photo_id'),
  118. 'imei' => $request->input('imei'),
  119. 'idfa' => $request->input('idfa'),
  120. 'kenyid_caa' => $request->input('kenyid_caa'),
  121. 'adsocial_aid' => $request->input('adsocial_aid'),
  122. 'adsocial_uid' => $request->input('adsocial_uid'),
  123. 'advertiser_space_id' => $request->input('space_id'),
  124. 'mission_id' => $request->input('mission_id'),
  125. 'order_id' => $request->input('order_id'),
  126. ];
  127. }
  128. /**
  129. * 检测手机品牌
  130. * @param string|null $ua
  131. * @return string|null
  132. */
  133. public static function detectMobileBrand($ua)
  134. {
  135. if (empty($ua)) {
  136. return null;
  137. }
  138. $ua = strtolower($ua);
  139. $brands = [
  140. 'iphone' => 'Apple',
  141. 'huawei' => 'Huawei',
  142. 'xiaomi' => 'Xiaomi',
  143. 'oppo' => 'OPPO',
  144. 'vivo' => 'Vivo',
  145. 'samsung' => 'Samsung',
  146. 'honor' => 'Honor'
  147. ];
  148. foreach ($brands as $key => $brand) {
  149. if (strpos($ua, $key) !== false) {
  150. return $brand;
  151. }
  152. }
  153. return null;
  154. }
  155. public static function handleTransformData($logId, $transformType) {
  156. # 根据记录查询广告ID
  157. $logInfo = JxAdPlacementLog::getInfoById($logId);
  158. # 根据记录以及行为类型查询是否已经记录
  159. $recordInfo = JxTransformRecord::getInfo($logId, $transformType);
  160. if(!empty($recordInfo)) {
  161. Log::info('记录已经存在,无需重复处理', ['log_id' => $logId, 'transform_type' => $transformType], 'ActionReport');
  162. return ;
  163. }
  164. # 数据回传 start
  165. $adReportActionType = 0;
  166. $adReportOrderStatus = 0;
  167. if(!empty($logInfo->adsocial_aid) && $logInfo->adsocial_aid != '__ADSOCIAL_AID__') {
  168. # 获取漏单配置
  169. $missConfig = UserActionsReportService::accountReportRule($logInfo->adsocial_aid, $transformType, $logInfo->advertiser_space_id);
  170. if(isset($missConfig['enable']) && 1 == $missConfig['enable']) {
  171. # 判断是否需要漏单
  172. $missRes = UserActionsReportService::accountMissValue($logInfo->adsocial_aid, $logInfo->advertiser_space_id, $missConfig);
  173. if($missRes) {
  174. # 需要漏单
  175. Log::info('漏单', [
  176. 'log_id' => $logId,
  177. 'account_id' => $logInfo->adsocial_aid,
  178. 'transform_type' => $transformType,
  179. 'advertiser_space_id' => $logInfo->advertiser_space_id,
  180. 'callback_url' => $logInfo->callback_url], 'ActionReport');
  181. $adReportOrderStatus = 3;
  182. } else {
  183. $missionId = $logInfo->mission_id;
  184. $eventType = 1;// 激活
  185. if(in_array($missionId, [1054157749954837, 1054157535090288, 1054157125538975])) {
  186. $eventType = 84;// 唤起应用
  187. }
  188. # 数据回传
  189. $rst = HttpService::httpGet($logInfo->callback_url . '&event_type='.$eventType.'&event_time=' . time() . rand(100, 999) );
  190. $response = json_decode($rst, 1);
  191. Log::info('数据回传', [
  192. 'log_id' => $logId,
  193. 'account_id' => $logInfo->adsocial_aid,
  194. 'transform_type' => $transformType,
  195. 'mission_id' => $missionId,
  196. 'advertiser_space_id' => $logInfo->advertiser_space_id,
  197. 'event_type' => $eventType,
  198. 'callback_url' => $logInfo->callback_url,
  199. 'response' => $response], 'ActionReport');
  200. // EmailQueue::rPush('数据回传结果记录', json_encode(['log_id' => $logId, 'callback_url' => $logInfo->callback_url, 'response' => $response]), ['song.shen@kuxuan-inc.com'], '聚星系统');
  201. $adReportActionType = 1;
  202. if(isset($response['result']) && 1 == $response['result']) {
  203. $adReportOrderStatus = 1;
  204. } else {
  205. $adReportOrderStatus = 2;
  206. }
  207. }
  208. }
  209. } else {
  210. EmailQueue::rPush('快手订单回传异常 - 广告ID或账户ID获取失败', json_encode([
  211. 'log_id' => $logId, 'transformType' => $transformType, 'ad_id' => $logInfo->ad_id, 'account_id' => $logInfo->adsocial_aid], 256),
  212. ['song.shen@kuxuan-inc.com'], '聚星系统');
  213. $adReportOrderStatus = -2;
  214. }
  215. # 数据回传 end
  216. # 保存订单数据入库 start
  217. $orderData['platform'] = 1;
  218. $orderData['ad_placement_log_id'] = $logId;
  219. $orderData['transform_type'] = $transformType;
  220. $orderData['callback_url'] = $logInfo->callback_url;
  221. $orderData['advertiser_id'] = $logInfo->adsocial_aid ?? 54284957;//todo 后续监测此项数据是否异常,异常时要报警出来,包括下面查询客户ID的逻辑也是一样
  222. $orderData['report_action_type'] = $adReportActionType;
  223. $orderData['report_order_status'] = $adReportOrderStatus;
  224. $orderData['task_id'] = $logInfo->mission_id;
  225. # 根据账户ID查询客户ID
  226. $orderData['customer_id'] = 192;
  227. if(!empty($logInfo->adsocial_aid)) {
  228. $customerInfo = SysCustomerAdver::getInfoByAdvertiserId($logInfo->adsocial_aid);
  229. $orderData['customer_id'] = $customerInfo->customer_id ?? 192;
  230. }
  231. if(!empty($orderData['customer_id'])) {
  232. JxTransformRecord::saveData($orderData);
  233. } else {
  234. Log::error('查询投放账户对应客户ID失败', ['account_id' => $logInfo->adsocial_aid], 'transformRecordSave');
  235. EmailQueue::rPush('查询投放账户对应客户ID失败', json_encode(['account_id' => $logInfo->adsocial_aid]), ['song.shen@kuxuan-inc.com'], '聚星系统');
  236. }
  237. # 保存订单数据入库 end
  238. }
  239. }