Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.10.2018, 11:36   #1
cherepushka
Пользователь
 
Регистрация: 25.02.2012
Сообщений: 81
По умолчанию Отправка всех товаров в json-формате через PHP

Добрый день всем!
Прошу помочь с решением одной задачи, уже второй день не знаю, что делать.
Есть строка вида
Код:
http://test3.ru/novonovo.php?InvoiceId=105050&Amount=7450&invoice=Tovar1:2:100:200//Tovar2:4:40:160//Tovar3:5:103:515
Вытаскиваю из нее все данные. Разбил как мне нужно. Больше всего интересуют Tovar1, Tovar2, Tovar3.
Необходимо запросом в json формате отправить эти данные. Получается отправить только один товар, а не все три.

Код:
<?php
$InvoiceId = (int)$_GET['InvoiceId'];
$amount=(float)$_GET['Amount'];
$invoice=(string)$_GET['invoice'];




$_GET['invoice'] = strip_tags( urldecode($_GET['invoice']) );
    if(empty($_GET['invoice']))
        return;

$_GET['invoice'] = explode('//',$_GET['invoice']);
foreach($_GET['invoice'] as $key => $val){

        //отделяем товар от количества
        $valArr = explode(':',$val);

        $purchases[$key][0] = $valArr[0];
        $purchases[$key][1] = $valArr[1];
        $purchases[$key][2] = $valArr[2];
		$purchases[$key][3] = $valArr[3];
		
		
		echo $valArr[0];
		echo " ";
		echo " ";
		echo $valArr[1];
		echo " ";
		echo " ";
		echo $valArr[2];
		echo " ";
		echo " ";
		echo $valArr[3];
		echo " ";
		echo " ";
		echo "<hr>";
	
		
		
		
    }
	
	



$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "ссылку убрал, чтобы не отправлялись запросы просто так",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_SSL_VERIFYPEER => false,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{\r\n\"amount\": \"".$amount."\",\r\n\"InvoiceId\": \"".$InvoiceId."\",\r\n\"Currency\": \"RUB\",\r\n\"SendEmail\": true,\r\n\"Description\": \"Оплата на сайте\",\r\n\"JsonData\": \"{\\\"Payments\\\":\r\n{\\\"customerReceipt\\\":\r\n{\\\"Items\\\":\r\n[\r\n{\\\"label\\\":\\\"".$valArr[0]."\\\",\r\n\\\"price\\\":".$valArr[2].",\r\n\\\"quantity\\\":".$valArr[1].",\r\n\\\"amount\\\":".$valArr[3].",\r\n\\\"vat\\\":18,\r\n\\\"method\\\":0,\r\n\\\"object\\\":0,\r\n\\\"measurementUnit\\\":\\\"\\u0448\\u0442\\\"}],\r\n\\\"taxationSystem\\\":0,\r\n\\\"email\\\":\\\"cherepushka@mail.ru\\\",\r\n\\\"phone\\\":\\\"\\\",\r\n\\\"amounts\\\":{\\\"electronic\\\":".$amount."}}}}\"\r\n}",
  CURLOPT_HTTPHEADER => array(
    
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}

?>
Пример запроса из документации
Код:
			"Items": [//товарные позициии
				{
					"label": "Наименование товара 1", //наименование товара
					"price": 100.00, //цена
					"quantity": 1.00, //количество
					"amount": 100.00, //сумма
					"vat": 18, //ставка НДС
                    
				}, {
					"label": "Наименование товара 2", //наименование товара
					"price": 200.00, //цена
					"quantity": 2.00, //количество
					"amount": 300.00, //сумма
					"vat": 18, //ставка НДС
                    
				}, {
					"label": "Наименование товара 3", //наименование товара
					"price": 300.00, //цена
					"quantity": 3.00, //количество
					"amount": 900.00, //сумма
					"vat": 18, //ставка НДС
                    
				}
			],
            "taxationSystem": 0, //
			"email": "user@example.com", //
			"phone": "", //
		    "amounts":
	        {
		        "electronic": 9.00, // 
		        "advancePayment": 0.00, // 
		        "credit": 0.00, // 
		        "provision": 0.00 // 
	        }
		}
Спасибо.

Последний раз редактировалось cherepushka; 06.10.2018 в 12:11.
cherepushka вне форума Ответить с цитированием
Старый 09.10.2018, 12:07   #2
username2
 
Регистрация: 09.10.2018
Сообщений: 6
По умолчанию

откуда отправляете, куда и зачем?
username2 вне форума Ответить с цитированием
Старый 09.10.2018, 13:13   #3
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,150
По умолчанию

а может сформировать массив как в примере и сгененрирвать json через нужную функцию а не вручную?
https://php.ru/manual/function.json-encode.html
ADSoft вне форума Ответить с цитированием
Старый 09.10.2018, 16:40   #4
cherepushka
Пользователь
 
Регистрация: 25.02.2012
Сообщений: 81
По умолчанию

В примере 2? Так то оно правильно и я так пробовал. Но запрос получилось сделать только с добавлением еще символов экранирования. Простой функцией выдавал false.
Я вот думаю уже подсчитывать количество товара, но это тоже не вариант.
cherepushka вне форума Ответить с цитированием
Старый 09.10.2018, 21:07   #5
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Готовим данные:
PHP код:
<?php

// URL:
// http://sandbox.loc/invoice.php?InvoiceId=105050&Amount=7450&invoice=Tovar1:2:100:200//Tovar2:4:40:160//Tovar3:5:103:515

// обрабатывам данные из $_GET
$invoice = (!empty($_GET['invoice'])) 
            ? 
strip_tags(urldecode($_GET['invoice'])) 
            : 
'';
$invoice_id = (!empty($_GET['InvoiceId'])) 
            ? (int)
$_GET['InvoiceId'
            : 
0;
$amount = (!empty($_GET['Amount'])) 
            ? (float)
$_GET['Amount'
            : 
0.00;

if(!empty(
$invoice) && !empty($invoice_id)) {

    
$invoice_data $json_data = [];

    
// обрабатываем invoice
    
$invoice_ex explode('//'$invoice);
    foreach (
$invoice_ex as $key => $val) {

        
// отделяем товар от количества
        
$val_ex explode(':',$val);

        
// формируем массив товаров
        
if(sizeof($val_ex) == 4){
            
$invoice_data[] = [
                
'label' => $val_ex[0],
                
'quantity' => $val_ex[1],
                
'price' => $val_ex[2],
                
'amount' => $val_ex[3],
                
'vat' => 18,
                
'method' => 0,
                
'object' => 0,
                
'measurementUnit' => 'HB',
            ];
        }

    }

    
// формируем массив под JSON
    
if(!empty($invoice_data)) {

        
$json_data = [
            
'amount' => $amount,
            
'InvoiceId' => $invoice_id,
            
'Currency' => 'RUB',
            
'SendEmail' => true,
            
'Description' => 'Оплата на сайте',
            
'JsonData' => [
                
'Payments' => [
                    
'customerReceipt' => [
                        
'Items' => $invoice_data,
                        
'taxationSystem' => 0,
                        
'email' => 'cherepushka@mail.ru',
                        
'phone' => '',
                        
'amounts' => [
                            
'electronic' => $amount,
                        ],
                    ],
                ],
            ],
        ];

        
// отдаём JSON
        
header("Content-type: application/json; charset=utf-8");
        echo 
json_encode(
            
$json_data
            
JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT
        
);

    }
}
else {
    return 
false;
}

?>
Результат:
Код:
{
    "amount": 7450,
    "InvoiceId": 105050,
    "Currency": "RUB",
    "SendEmail": true,
    "Description": "Оплата на сайте",
    "JsonData": {
        "Payments": {
            "customerReceipt": {
                "Items": [
                    {
                        "label": "Tovar1",
                        "quantity": "2",
                        "price": "100",
                        "amount": "200",
                        "vat": 18,
                        "method": 0,
                        "object": 0,
                        "measurementUnit": "HB"
                    },
                    {
                        "label": "Tovar2",
                        "quantity": "4",
                        "price": "40",
                        "amount": "160",
                        "vat": 18,
                        "method": 0,
                        "object": 0,
                        "measurementUnit": "HB"
                    },
                    {
                        "label": "Tovar3",
                        "quantity": "5",
                        "price": "103",
                        "amount": "515",
                        "vat": 18,
                        "method": 0,
                        "object": 0,
                        "measurementUnit": "HB"
                    }
                ],
                "taxationSystem": 0,
                "email": "cherepushka@mail.ru",
                "phone": "",
                "amounts": {
                    "electronic": 7450
                }
            }
        }
    }
}
Как отправить JSON – детально описано здесь:
How to POST and Receive JSON Data using PHP cURL
Sending JSON Via POST In PHP
Andkorol вне форума Ответить с цитированием
Старый 10.10.2018, 11:51   #6
cherepushka
Пользователь
 
Регистрация: 25.02.2012
Сообщений: 81
По умолчанию

Andkorol, большое спасибо - очень очень помогли.
cherepushka вне форума Ответить с цитированием
Старый 10.10.2018, 15:56   #7
cherepushka
Пользователь
 
Регистрация: 25.02.2012
Сообщений: 81
По умолчанию

Всё заработало на локальном. После переноса на сервер перестал работать. Я так понимаю версия на сервере php. Получается нужно ждать обновления или есть выход?
cherepushka вне форума Ответить с цитированием
Старый 10.10.2018, 18:20   #8
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Нужно выяснить причину
http://phpfaq.ru/debug
Andkorol вне форума Ответить с цитированием
Старый 10.10.2018, 18:31   #9
cherepushka
Пользователь
 
Регистрация: 25.02.2012
Сообщений: 81
По умолчанию

В error_log на сервере такая ошибка
PHP Parse error: syntax error, unexpected '[' in
На строке 19
$invoice_data = $json_data = [];
cherepushka вне форума Ответить с цитированием
Старый 10.10.2018, 18:57   #10
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Значит, на хостинге версия PHP < 5.4
Возможно, там в Панели Управления можно сменить версию PHP на более новую (7.x.x желательно).
Ещё можно заменить везде в коде языковую конструкцию [] на array():
http://php.net/manual/ru/language.types.array.php
Но я бы сменил версию PHP или хостинг.
Andkorol вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Уменьшать стоимость всех товаров на 10% ИвановБ БД в Delphi 34 26.12.2016 12:24
Вывод онлайн JSON списка в php kutt PHP 3 12.02.2015 11:01
Вывод изображения через php qwe88 WordPress и другие CMS 0 21.03.2013 11:32
Вывод изображения через php qwe88 PHP 2 21.03.2013 08:07
Вывод всех картинок через тег. Predator199 PHP 10 22.07.2012 19:57