Отправка php-запроса с POST параметрами на другой сервер через CURL

Довольно часто стоит задача создания запроса с одного сайта на другой для получения определенных данных. У задачи есть большое количество возможных реализаций, я покажу одну из них.

Сама задача была приблизительно следущая: зная артикулы одного сайта (для удобства назовем его "сайт-клиент"), нужно было получить цены и наличие с другого сайта ("сайт-сервер"). Сайты соотвественно находятся на Битриксе, но лицензии у них разные (как и хостинг).

Пример кода на сайте-клиенте:


require_once($_SERVER['DOCUMENT_ROOT'] . "/bitrix/modules/main/include/prolog_before.php");

if(CModule::IncludeModule("iblock") && CModule::IncludeModule("sale") && CModule::IncludeModule("catalog")){
	
	$arArticul = array();
	
	$arSelect = Array("ID",  "IBLOCK_ID", "NAME", "PROPERTY_G_ART");
	$arFilter = Array("IBLOCK_ID"=>array(1, 2), "ACTIVE"=>"Y", "!=PROPERTY_G_ART" => false);
	$res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
	while($ob = $res->Fetch())
	{
		$arArticul[] = $ob["PROPERTY_G_ART_VALUE"];
	}
}

// Отправляем CURL-запрос
$myCurl = curl_init();
curl_setopt_array($myCurl, array(
    CURLOPT_URL => 'http://www.test.ru/test/sync.php', // Адрес куда мы отправляем запрос
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => http_build_query(array("ARTICUL"=>$arArticul)) // POST - параметры передачи
));
$response = curl_exec($myCurl);
curl_close($myCurl);

// Декодируем JSON
$products = json_decode($response, true); // второй параметр переводит данные в массив, а не объект


$arSelect = Array("ID",  "IBLOCK_ID", "NAME", "PROPERTY_G_ART");
$arFilter = Array("IBLOCK_ID"=>array(1, 2), "PROPERTY_G_ART" => $arArticul);
$resProd = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
while($obProd = $resProd->Fetch())
{
	if(!empty($products[$obProd["PROPERTY_G_ART_VALUE"]])) // если в ответе есть нужный артикул
	{
		$artProduct = $obProd["PROPERTY_G_ART_VALUE"];
		$priceProduct = $products[$obProd["PROPERTY_G_ART_VALUE"]]["PRICE"];
		$quantityProduct = $products[$obProd["PROPERTY_G_ART_VALUE"]]["QUANTITY"];
		
		CCatalogProduct::Update($obProd["ID"], array('QUANTITY'=>$quantityProduct)); // Обновим наличие		
		
		// Обновим цену
		$arFieldsPrice = Array(
			"PRODUCT_ID" => $obProd["ID"],
			"CATALOG_GROUP_ID" => 1,
			"PRICE" => $priceProduct,
			"CURRENCY" => "RUB",
		);

		$resPrice = CPrice::GetList(array(), array("PRODUCT_ID" => $obProd["ID"], "CATALOG_GROUP_ID" => 1));

		if ($arrPrice = $resPrice->Fetch()){
			CPrice::Update($arrPrice["ID"], $arFieldsPrice);
		} else {
			CPrice::Add($arFieldsPrice);
		}
	}
}

Пример кода на сайте-сервере:


require_once($_SERVER['DOCUMENT_ROOT'] . "/bitrix/modules/main/include/prolog_before.php");

if(CModule::IncludeModule("iblock") && CModule::IncludeModule("sale") && !empty($_REQUEST["ARTICUL"])){

	$arArticul = $_REQUEST["ARTICUL"];
	$arProd = array();	

	$arSelect = Array("ID",  "IBLOCK_ID", "NAME", "PROPERTY_G_ART", "CATALOG_GROUP_1", "CATALOG_STORE_AMOUNT_1", "CATALOG_STORE_AMOUNT_2");
	$arFilter = Array("IBLOCK_ID"=>array(1, 2), "ACTIVE"=>"Y", "PROPERTY_G_ART" => $arArticul);
	$res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
	while($ob = $res->Fetch())
	{
		$arProd[$ob["PROPERTY_G_ART_VALUE"]] = array(
			"PROPERTY_G_ART" => $ob["PROPERTY_G_ART_VALUE"],
			"PRICE" => $ob["CATALOG_PRICE_1"],
			// мне нужно было наличие вывыести по складам, поэтому такое выражение ниже
			"QUANTITY" => $ob["CATALOG_STORE_AMOUNT_1"] + $ob["CATALOG_STORE_AMOUNT_2"]
		);
	}
	
	echo json_encode($arProd); // кодируем данные для передачи в JSON
}

Возврат к списку