===== PART 3/12 ===== rst(); if (!$existing) { $tracking = $this->TrafficTracking->newEntity([ 'campaign_id' => $paidAds->ci, 'fingerprint' => $fingerprint, 'ip_address' => $userIp, 'user_agent' => substr($userAgent, 0, 255), 'created_at' => date('Y-m-d H:i:s'), 'expires_at' => date('Y-m-d H:i:s', time() + 60) // 1 minutes ]); $saved = $this->TrafficTracking->save($tracking); error_log("TrafficTracking saved: " . ($saved ? 'SUCCESS' : 'FAILED')); } else { error_log("TrafficTracking already exists"); } } catch (\Exception $e) { error_log("TrafficTracking error: " . $e->getMessage()); // Continue even if tracking fails } // Generate verification token $verificationToken = bin2hex(random_bytes(16)); $this->set('verificationToken', $verificationToken); $this->set('campaignId', $paidAds->ci); } if ($plan_disable_ads) { $banner_728x90 = ''; $banner_468x60 = ''; $banner_336x280 = ''; } $this->set('banner_728x90', $banner_728x90); $this->set('banner_468x60', $banner_468x60); $this->set('banner_336x280', $banner_336x280); $this->viewBuilder()->setLayout('go_traffic'); $this->render('view_traffic'); } } } public function popad() { $this->autoRender = false; if ($this->getRequest()->is('post')) { $pop_ad_data = data_decrypt($this->getRequest()->getData('pop_ad')); $this->calcEarnings($pop_ad_data, $pop_ad_data['link'], 3); return $this->redirect($pop_ad_data['website_url'], 301); } } public function go() { $this->autoRender = false; $this->setResponse($this->getResponse()->withType('json')); $ad_form_data = data_decrypt($this->getRequest()->getData('ad_form_data')); $t = (int)$ad_form_data['t']; $diff_seconds = (int)(time() - $t); $counter_value = (int)$ad_form_data['timer']; $ad_type = isset($ad_form_data['ad_type']) ? (int)$ad_form_data['ad_type'] : 0; // Skip timer check for traffic ads (ad_type = 4) as they don't have countdown if ($ad_type !== 4 && $diff_seconds < $counter_value) { $content = [ 'status' => 'error', 'message' => 'Bad Request.', 'url' => '', ]; $this->setResponse($this->getResponse()->withStringBody(json_encode($content))); return $this->getResponse(); } if (!$this->getRequest()->is('ajax')) { $content = [ 'status' => 'error', 'message' => 'Bad Request.', 'url' => '', ]; $this->setResponse($this->getResponse()->withStringBody(json_encode($content))); return $this->getResponse(); } /** * @var \App\Model\Entity\Link $link */ $link = $this->Links->find() //->contain(['Users']) ->contain([ 'Users' => [ 'fields' => ['id', 'username', 'status', 'disable_earnings'], ], ]) ->where([ 'Links.alias' => $ad_form_data['alias'], 'Links.status <>' => 3, ]) ->first(); if (!$link) { $content = [ 'status' => 'error', 'message' => '404 Not Found.', 'url' => '', ]; $this->setResponse($this->getResponse()->withStringBody(json_encode($content))); return $this->getResponse(); } $content = $this->calcEarnings($ad_form_data, $link, $ad_form_data['ad_type']); // Delete traffic tracking after successful link retrieval (ad_type = 4) if ($ad_type === 4 && isset($ad_form_data['campaign_id'])) { try { $userIp = $this->request->clientIp(); $userAgent = $this->request->getHeaderLine('User-Agent'); $fingerprint = md5($userIp . '_' . $userAgent); $this->loadModel('TrafficTracking'); $deleted = $this->TrafficTracking->deleteAll([ 'fingerprint' => $fingerprint, 'campaign_id' => $ad_form_data['campaign_id'] ]); error_log("TrafficTracking deleted after get link: " . ($deleted ? 'SUCCESS' : 'NONE')); } catch (\Exception $e) { error_log("TrafficTracking delete error: " . $e->getMessage()); } } //$content['url'] = $content['url']; $this->setResponse($this->getResponse()->withStringBody(json_encode($content))); return $this->getResponse(); } protected function setRefererCookie($alias) { if (isset($_COOKIE['ref' . $alias])) { return; } $referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; \setcookie('ref' . $alias, \data_encrypt($referer), \time() + 5 * 60, '/', '', false, true); } protected function getRefererCookie($alias) { $referer_url = ''; if (isset($_COOKIE['ref' . $alias])) { $referer_url = \data_decrypt($_COOKIE['ref' . $alias]);