Задать вопрос
@reinmaker1990

Как верно трактовать логику данного скрипта?

ДД, дали скрип представлен тестовый для вакансии не связанной с разработкой, просят максимально похоже перевести логику скрипта в обывательский язык, т.е какой функционал хотел видеть человек дающей такое задание на разработку?
из скрипта у меня сложилось следующее, что мы получаем данные, проверяем ,код страны, проходим условия по ценам, в зависимости от цены берем или одну или другую транспортную компанию, далее формируем массивы продукта, адреса, и закидываем их в результирующий массив, который потом в json и отправляется далее по api, в самом низу оправляются письма из блоков try/catch.
Если не затруднит подскажите более развернутую логики, мб моя глобально -+ верно описывает ее работу, код:
<?php

ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);

// fix json_encode bug
// https://stackoverflow.com/questions/42981409/php7-1-json-encode-float-issue/43056278
if (version_compare(phpversion(), '7.1', '>=')) {
    ini_set( 'precision', 17 );
    ini_set( 'serialize_precision', -1 );
}

use PHPMailer\PHPMailer\PHPMailer;

require __DIR__ . '/PHPMailer/PHPMailer.php';
require __DIR__ . '/PHPMailer/SMTP.php';
require __DIR__ . '/PHPMailer/Exception.php';

header('Content-Type: text/html; charset=utf-8');

$webhookResponse = json_decode(file_get_contents('php://input'), true);

$log = date('Y-m-d H:i:s') . ' ' . print_r($webhookResponse, true);
file_put_contents(__DIR__ . '/webhookResponse.log', $log . PHP_EOL, FILE_APPEND);

//$countries = ['DZ', 'EG', 'JO', 'IQ', 'YE', 'LB', 'LY', 'MR', 'MA', 'SA', 'SY', 'SD', 'TN', 'QA', 'KW', 'AE', 'IL', 'BH'];
$countries = ['AL', 'AD', 'AT', 'BE', 'BA', 'BG', 'HR', 'CZ', 'DK', 'EE', 'FI', 'FR', 'DE', 'GR', 'VA', 'HU', 'IE', 'IT', 'LV', 'LT', 'LU', 'MK', 'MT', 'MD', 'MC', 'ME', 'NL', 'PL', 'PT', 'RO', 'SM', 'RS', 'SK', 'SL', 'ES', 'SE', 'US', 'CA', 'GB', 'SI', 'CY'];
$countries_post = ['IL', 'SA', 'AE', 'QA', 'BH', 'LB'];
$country_code = $webhookResponse['shipping_address']['country_code'];
$country = $webhookResponse['shipping_address']['country'];

if (!in_array($country_code, $countries)) {
	//$apiKey = 'JiV';
	$apiKey = '7gM';
	$project_id = '14K';

	$site = parse_url($webhookResponse['order_status_url'], PHP_URL_HOST);

	if ($site === 'unidragon.eu') {
        $order_source_id = '154';
    } else {
        $order_source_id = '12P';
    }

    $price = $webhookResponse['total_price_set']['shop_money']['amount']*100;
	$currency = $webhookResponse['total_price_set']['shop_money']['currency_code'];
	$reference = (string)$webhookResponse['order_number'];

	if (in_array($country_code, $countries_post) && $price < 20000) {
		$company_id = 'e6Q9';
		$extra = array(
			'carrier' => 'RussianPost',
			'service' => 'SmallPacket',
		);
	} else {
		$company_id = '12t';
		$extra = array(
			'carrier' => 'DHL',
			'service' => 'WorldwideExpress',
		);
	}

	$extra['shopify_order_id'] = (float)$webhookResponse['id'];

	$items = array();
	foreach ($webhookResponse['line_items'] as $item) {
		$items[] = array(
			'product_title'  => $item['name'],
			'product_sku'    => $item['sku'],
			'price'          => round($item['price_set']['shop_money']['amount']*100, 2),
			'product_weight' => $item['grams'],
			'currency'       => $item['price_set']['shop_money']['currency_code'],
			'quantity'       => $item['quantity'],
		);
	}

	$address = array(
		'street'  => $webhookResponse['shipping_address']['address1'],
		'city'    => $webhookResponse['shipping_address']['city'],
		'country' => $webhookResponse['shipping_address']['country_code'],
		'zip'     => $webhookResponse['shipping_address']['zip'],
		'name'    => $webhookResponse['shipping_address']['name'],
		'phone'   => $webhookResponse['shipping_address']['phone'],
		'email'   => $webhookResponse['customer']['email'],
	);

	$data = array(
		'order' => array(
			'company_id' => $company_id,
			'reference'  => $reference,
			//'comment'    => 'Не отправлять, тест',
			'price'      => round($price, 2),
			'currency'   => $currency,
			'extra'      => $extra,
			'to_address' => $address,
			'line_items' => $items,
			'project_id' => $project_id,
			'order_source_id' => $order_source_id,
		),
	);

	if ($country_code == 'CH' || $country_code == 'NO' || $country_code == 'IS') {
		$data['order']['archived'] = true;
	}

	$fields = json_encode($data);

	$log = date('Y-m-d H:i:s') . ' ' . print_r($fields, true);
	file_put_contents(__DIR__ . '/fields.log', $log . PHP_EOL, FILE_APPEND);

	$ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, "https://api.post.ru:5433/v1/orders");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_HEADER, TRUE);
    curl_setopt($ch, CURLOPT_POST, TRUE);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
      "Content-Type: application/json",
      "Authorization: Basic ".$apiKey,));

    $response = curl_exec($ch);
    $info = curl_getinfo($ch);
    curl_close($ch);

    $log = date('Y-m-d H:i:s') . ' id ' . print_r($webhookResponse['id'], true) . PHP_EOL;
    $log .= 'response ' . print_r($response, true) . PHP_EOL;
	$log .= 'info ' . print_r($info, true) . PHP_EOL;
	$log .= 'fields ' . print_r($fields, true) . PHP_EOL;

    if ($info["http_code"] == 201) {
		file_put_contents(__DIR__ . '/success.log', $log . PHP_EOL, FILE_APPEND);
    } else {
		file_put_contents(__DIR__ . '/error.log', $log . PHP_EOL, FILE_APPEND);

        $mail = new PHPMailer(true);
        try {
            $mail->CharSet = $mail::CHARSET_UTF8;
            $mail->isSMTP();
            $mail->SMTPAuth = true;
            $mail->Host = 'ssl://smtp.web.ru';
            $mail->Port = 465;
            $mail->Username = 'email@email.com';
            $mail->Password = '253';
            $mail->setFrom('email@email.com');
            $mail->addAddress('email@email.com');
            $mail->isHTML(true);
            $mail->Subject = 'Ошибка при отправке заказа ' . $reference;
            $mail->Body = '<pre>' . $log . '</pre>';
            $mail->send();
        } catch (\Exception $e) {
            $log = 'Ошибка при отправке письма: ' . $mail->ErrorInfo;
            file_put_contents(__DIR__ . '/error.log', $log . PHP_EOL, FILE_APPEND);
        }
    }

} else {
	$log = date('Y-m-d H:i:s') . ' id ' . print_r($webhookResponse['id'], true) . PHP_EOL;
	$log .= 'country ' . print_r($country, true) . PHP_EOL;
	file_put_contents(__DIR__ . '/not_sent.log', $log . PHP_EOL, FILE_APPEND);
}
  • Вопрос задан
  • 163 просмотра
Подписаться 1 Средний 4 комментария
Пригласить эксперта
Ответы на вопрос 3
@MaLuTkA_UA
Ну на сколько я понял, то скрипт является обработчиком заказа, а именно принимает заказ в формате json, определяет тип доставки по полученной информации, отправляет по api заказ исполнителю, и отправляет письмо с информацией о доставке и товаре покупателю. Как то так)
Ответ написан
Комментировать
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
ты упустил главную деталь, это ответ на запрос, а если точнее обработчик вебхука. т.е. часть некоего api. клиент оформил заказ и при этом передал данные хуком с лева стороннему api которое в свою очередь рассылает письма счастья и логирует событие
Ответ написан
rework
@rework
Помог ответ? В благодарность отметь его решением
Формирует email и делает рассылку
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы