src/Controller/VkApiController.php line 144
<?phpnamespace App\Controller;use App\Entity\AgencyClients;use App\Entity\AgencyClientsHistoryDiposit;use App\Entity\User;use App\Entity\UserPlatform;use App\Entity\UserProject;use App\Entity\VkUser;use App\Form\TransactionFormType;use App\Service\BillingService;use Doctrine\ORM\EntityManagerInterface;use Doctrine\Persistence\ManagerRegistry;use Exception;use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\Response;use Symfony\Component\Routing\Annotation\Route;use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;use Symfony\Contracts\HttpClient\Exception\DecodingExceptionInterface;use Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface;use Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface;use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;use Symfony\Contracts\HttpClient\HttpClientInterface;class VkApiController extends AbstractController{private $client;private $limit;private BillingService $billingService;public function __construct(HttpClientInterface $vkContentClient, private readonly ManagerRegistry $doctrine, BillingService $billingService){$this->client = $vkContentClient;$this->limit = 50;$this->billingService = $billingService;}#[Route(path: '/api/vk/transaction/to/{clientId}/{amount}/{userProject}', name: 'vk_api_transaction')]public function transactionToClient(string $clientId, string $amount, UserProject $userProject): Response{$entityManager = $this->doctrine->getManager();$user = $this->getUser();if (!($user instanceof User)) {return $this->json(['error' => 'Авторизуйтесь для выполнения данной операции.'], 500);}if (!$user->isAdmin()) {$needBalance = intval($amount) * 100;// Add amounttry {// TODO change $user->getMainUserProject() to required projectif ($userProject == null) {$userProject = $user->getMainUserProject();}$this->billingService->updateUserBalance($user, 'vk_transaction_to_client', $needBalance, $userProject, null, null, ['clientId' => $clientId]);} catch (Exception $exception) {//todo log//$exception->getMessage();return $this->json(['error' => $exception->getMessage()], 500);}$entityManager->persist($user);$entityManager->flush();}$response = $this->client->request('POST', "https://ads.vk.com/api/v2/billing/transactions/to/$clientId.json", ['json' => ['amount' => ($amount / 1.2)]]);if ($response->getStatusCode() !== 200) {return $this->json(['error' => 'Ошибка'], $response->getStatusCode());}$response = $response->toArray();$ACHistoryDiposit = new AgencyClientsHistoryDiposit();$ACHistoryDiposit->setAmount($response['amount']);$ACHistoryDiposit->setCreatedAt($response['created_at']);$ACHistoryDiposit->setClientBalance($response['client_balance']);$ACHistoryDiposit->setClientUsername($response['client_username']);$ACHistoryDiposit->setUserEmail($user->getEmail());$entityManager->persist($ACHistoryDiposit);$entityManager->flush();return $this->json(['data' => $response]);}#[Route(path: '/api/vk/getClients', name: 'vk_api_clients')]public function getVkApiClients(Request $request, ManagerRegistry $doctrine): Response{$entityManager = $doctrine->getManager();$response = $this->client->request('GET', "https://ads.vk.com/api/v2/agency/clients.json?limit=$this->limit");$response = $response->toArray();$responseCount = $response['count'];if ($responseCount <= $this->limit) {return $this->json($response);}for ($offset = 0; $offset <= $responseCount; $offset+=$this->limit) {$responseOffset = $this->client->request('GET', "https://ads.vk.com/api/v2/agency/clients.json?limit=$this->limit&offset=$offset");foreach ($responseOffset->toArray()['items'] as $item) {$agencyClient = null;$vkUser = $this->doctrine->getRepository(VkUser::class)->findOneBy(['username' => $item['user']['username']]);if ($vkUser instanceof VkUser) {$agencyClient = $this->doctrine->getRepository(AgencyClients::class)->findOneBy(['vkUser' => $vkUser]);} else {$agencyClient = new AgencyClients();$vkUser = new VkUser();}$this->updateVkClientInfo($item, $vkUser, $agencyClient);}}$clients = $this->doctrine->getRepository(AgencyClients::class)->findAll();return $this->json(["count" => count($clients),"data" => $clients]);}#[Route(path: '/api/vk/getVkUserClients', name: 'vk_api_user_clients')]public function getVkUserClients(Request $request, ManagerRegistry $doctrine): Response{$user = $this->getUser();$userPlatform = $this->doctrine->getRepository(UserPlatform::class)->findOneBy(['user' => $user, 'name' => 'ads.vk']);if (!($userPlatform instanceof UserPlatform)) {return $this->json(['error' => 'Отсутствует токен для VK ADS'], 500);}$token = $userPlatform->getToken();$response = $this->client->request('GET', "https://ads.vk.com/api/v3/manager/clients.json?limit=$this->limit", ['auth_bearer' => $token]);if ($response->getStatusCode() !== 200) {return $this->json(['error' => $response->toArray(false)['error']], $response->getStatusCode());}$response = $response->toArray();$responseCount = $response['count'];for ($offset = 0; $offset <= $responseCount; $offset+=$this->limit) {$responseOffset = $this->client->request('GET', "https://ads.vk.com/api/v3/manager/clients.json?limit=$this->limit&offset=$offset", ['auth_bearer' => $token]);foreach ($responseOffset->toArray()['items'] as $item) {$agencyClient = null;$vkUser = $this->doctrine->getRepository(VkUser::class)->findOneBy(['username' => $item['user']['username']]);if ($vkUser instanceof VkUser) {$agencyClient = $this->doctrine->getRepository(AgencyClients::class)->findOneBy(['vkUser' => $vkUser]);} else {$agencyClient = new AgencyClients();$vkUser = new VkUser();}$agencyClient->setUser($user);$clientId = $item['user']['id'];$response = $this->client->request('GET', "https://ads.vk.com/api/v2/agency/clients.json?_user__id=$clientId");if ($response->toArray()['count'] != 0) {$agencyClient->setIsLake(true);}$this->updateVkClientInfo($item, $vkUser, $agencyClient);}}$clients = $this->doctrine->getRepository(AgencyClients::class)->findBy(['user' => $this->getUser(), 'isLake' => true]);return $this->json(["count" => count($clients),"data" => $clients]);}#[Route(path: '/api/getUserClients/{user}', name: 'api_getUserAgencyClients')]public function getUserAgencyClients(Request $request, ManagerRegistry $doctrine, User $user): Response{$clients = $this->doctrine->getRepository(AgencyClients::class)->findBy(['user' => $user]);return $this->json(["count" => count($clients),"data" => $clients]);}#[Route(path: '/agencyClients/getHistoryDiposits/{agencyClientUsername}', name: 'api_agencyClients_history_diposits')]public function getHistoryDiposits(Request $request, string $agencyClientUsername): Response{$ACHistoryDiposit = $this->doctrine->getRepository(AgencyClientsHistoryDiposit::class)->findBy(['clientUsername' => $agencyClientUsername]);return $this->json(["data" => $ACHistoryDiposit]);}#[Route(path: '/agencyClients/{agencyClientId}', name: 'app_edit_agency_client')]public function editAgencyClient(Request $request, string $agencyClientId): Response{$user = $this->getUser();$isAdmin = false;if ($user instanceof User && $user->isAdmin()) {$isAdmin = true;}$client = $this->doctrine->getRepository(AgencyClients::class)->findOneBy(['id' => $agencyClientId]);if (!($client instanceof AgencyClients)) {return $this->render('error404/index.html.twig');}if ($client->getUser() != $user && !$isAdmin) {return $this->render('error404/index.html.twig');}$clientId = $client->getVkUser()->getId();$response = $this->client->request('GET', "https://ads.vk.com/api/v2/agency/clients.json?_user__id=$clientId");$item = $response->toArray()['items'][0];$vkUser = $this->doctrine->getRepository(VkUser::class)->findOneBy(['username' => $item['user']['username']]);$agencyClient = $this->doctrine->getRepository(AgencyClients::class)->findOneBy(['vkUser' => $vkUser]);$this->updateVkClientInfo($item, $vkUser, $agencyClient);$client = $this->doctrine->getRepository(AgencyClients::class)->findOneBy(['id' => $agencyClientId]);$form = $this->createForm(TransactionFormType::class, null, ['projects' => $user->getUserProjects()]);$form->handleRequest($request);$error = [];if ($form->isSubmitted()) {if ($form->isValid()) {$response = $this->transactionToClient($client->getVkUser()->getId(), $form->getData()['amount'], $form->get('project')->getData());$response = json_decode($response->getContent(), true);if (array_key_exists('error', $response)) {$error[] = $response['error'];} else {return $this->redirectToRoute('app_edit_agency_client', ['agencyClientId' => $agencyClientId]);}} else {$error[] = $form->getErrors();}}return $this->render('agency_clients/index.html.twig', ['client' => $client,'isAdmin' => $isAdmin,'form' => $form,'errors' => $error]);}public function updateVkClientInfo($item, VkUser $vkUser, AgencyClients $agencyClient) {$agencyClient->setStatus($item['status']);$agencyClient->setAccessType($item['access_type']);//account$vkUser->setABalance($item['user']['account']['a_balance']);$vkUser->setBalance($item['user']['account']['balance']);$vkUser->setCurrency($item['user']['account']['currency']);$vkUser->setCurrencyBalanceHold($item['user']['account']['currency_balance_hold']);$vkUser->setFlags($item['user']['account']['flags']);$vkUser->setAccountId($item['user']['account']['id']);$vkUser->setIsNonresident($item['user']['account']['is_nonresident']);$vkUser->setType($item['user']['account']['type']);//additional_emails$vkUser->setAdditionalEmails($item['user']['additional_emails']);//additional_infoif ($item['user']['additional_info'] !== null) {$vkUser->setAddress($item['user']['additional_info']['address']);$vkUser->setClientInfo($item['user']['additional_info']['client_info']);$vkUser->setClientName($item['user']['additional_info']['client_name']);$vkUser->setEmail($item['user']['additional_info']['email']);$vkUser->setName($item['user']['additional_info']['name']);$vkUser->setPhone($item['user']['additional_info']['phone']);}$vkUser->setClientUsername($item['user']['client_username']);$vkUser->setId($item['user']['id']);$vkUser->setStatus($item['user']['status']);$vkUser->setTypes($item['user']['types']);$vkUser->setUsername($item['user']['username']);$this->doctrine->getManager()->persist($vkUser);$agencyClient->setVkUser($vkUser);$this->doctrine->getManager()->persist($agencyClient);$this->doctrine->getManager()->flush();}#[Route(path: '/panel', name: 'vk_api_getUserToken')]public function getVkUserToken(Request $request, EntityManagerInterface $entityManager,): Response{$code = $request->query->get('code');$userId = $request->query->get('user_id');$response = $this->client->request('POST', "https://ads.vk.com/api/v2/oauth2/token.json", ['headers' => ['Content-Type' => 'application/x-www-form-urlencoded',],'body' => ['grant_type' => 'authorization_code','code' => $code,'client_id' => '7XG62PqTbNY8smMK','permanent' => true]]);if ($response->getStatusCode() !== 200) {try {$response = $response->toArray(false);if ($response['error'] == "token_limit_exceeded") {$this->client->request('POST', "https://ads.vk.com/api/v2/oauth2/token/delete.json", ['headers' => ['Content-Type' => 'application/x-www-form-urlencoded',],'body' => ['client_id' => '7XG62PqTbNY8smMK','client_secret' => '0ugLDBgjtj3mLgiOntKrwlcq9nEijUpWFjsiUF3PsWLlKkUUFmRlZvEF4oF68QdFViRZ03eNp4dfhV7UWJUKjmsgdeAbu89W1cHuvtPxXaFAWDbkn5BXMX2Z0S3IFa4msc2ShfocNtr7xUdCMe4lHbD4KI6sk7WiBxqgUyb93YBo5CcWS8GjoC537Tkr16XBp9caIx7Vx0YUF5Wa1FhCr5gHzHvpfFh5','user_id' => $response['user_id']]]);$response = $this->client->request('POST', "https://ads.vk.com/api/v2/oauth2/token.json", ['headers' => ['Content-Type' => 'application/x-www-form-urlencoded',],'body' => ['grant_type' => 'authorization_code','code' => $code,'client_id' => '7XG62PqTbNY8smMK','permanent' => true]]);} else {return $this->json(['error' => $response['error']], 500);}} catch (Exception $e) {return $this->json(['error' => $e->getMessage()], 500);}}$response = $response->toArray(true);$user = $this->getUser();$userPlatforms = $this->doctrine->getRepository(UserPlatform::class)->findOneBy(['user' => $user, 'name' => 'ads.vk']);if (!($userPlatforms instanceof UserPlatform)) {$userPlatforms = new UserPlatform();}$userPlatforms->setUser($user);$userPlatforms->setName('ads.vk');$userPlatforms->setToken($response['access_token']);$entityManager->persist($userPlatforms);$entityManager->flush();return $this->redirectToRoute('app_user_platforms');}}