4.3.6 - перестала отображаться стоимость доставки почтой

Посоветуйте куда копнуть. Вдруг перестала отображаться стоимость доставки почтой, в админке ничего не менялось. Почта России - Калькулятор Почты России russianpostcalc.ru

Переустановил на VPS ОС с Centos 7 -> Debian 11 но даже откатывал до снапшота со старой ОС - не отображает.

Логи апача чистые.
В логах CS-Cart есть http запрос, если тупо его в браузере повторить - то есть ответ

{"calc":[{"type":"rp_1class","cost":559.94,"days":6},{"type":"rp_main","cost":401,"days":13}],"info":{"weight":"0.7","ob_cennost_rub":"4725.47","from_index":"115372","from_city":"\u041c\u043e\u0441\u043a\u0432\u0430","from_state":"\u041c\u043e\u0441\u043a\u0432\u0430","to_index":"630000","to_city":"\u041d\u043e\u0432\u043e\u0441\u0438\u0431\u0438\u0440\u0441\u043a","to_state":"\u041d\u043e\u0432\u043e\u0441\u0438\u0431\u0438\u0440\u0441\u043a\u0430\u044f \u041e\u0431\u043b\u0430\u0441\u0442\u044c"},"msg":{"type":"done","text":"\u0423\u0441\u043f\u0435\u0448\u043d\u043e"}}

А ни в корзине, ни в калькуляторе ( ТУТ ) стоимости доставки нет!

Сейчас текущая версия 4.15.2 очень надеюсь, что кто-то вам подскажет, но вероятность ооочень сильно маленькая. Тем более, что разница в более чем 10 поколения. Какая любовь творится в одном из первом модуле почты…

В том-то и дело, что 7 лет все работало - и вдруг перестало. И главное что заврос-то уходит, и ответ приходит. Но не выводится!

Перейти на 4.15 не вариант - я только что (почему вся пляска и была с Debian) перевел свой второй магазин 4.3.4 -> 4.15.2 и замумукался, товары не перекинуть просто дампом, тема не подходит - все вручную.

А тут у меня 3000 товаров блин, плюс уникальный модуль заказной… Не сдюжу.

Немного проясняется…
В логах админки:

Запросы (http/https запрос)
URL: http://russianpostcalc.ru/api_v1.php
Запрос: 'apikey=ххх&method=calc&from_index=115372&to_index=123103&weight=0.7&ob_cennost_rub=4725.47&hash=ххх'

Есть запрос - но нет ответа. А если вручную слепить УРЛ с запросом - ответ есть…

Может на стороне почты ваш IP забанили?

Ну, во-первых, это не почта. А russianpostcalc.ru , а во-вторых, если тупо повторить этот запрос в браузере, то ответ-то приходит. Так что IP здесь точно не при чем…

А… Блин… А это не подумал. Запрос-то от CMS уходит с IP VPS, а он у меня кстати буржайский… Попробую проверить!

Во я тупой…

Не, дело не в этом. Похоже я пал жертвой стечения обстоятельств - похоже рашнпосткальк жестко перевел все на https как раз в дни моих экспериментов, запрос по http отвечал 301. Поэтому в админке в логе ответа-то и не было, ибо это не ответ json!
Короче поменял в файле модуля на https в админке стал приходит ответ с ценами! Но блин при тестовом расчете пишет “произошла ошибка” то есть где-то блин не может декодировать пришедший верный ответ с ценами. Где не нашел пока…

1 лайк

Может и формат ответа поменялся?

Скорее всего да. Я не сохранил старых ответов, но в новом как мне кажется буковок больше. Однако, судя по всему, структура json ответа та же, сравниваю названия-значения, они похо же те же.

Где-то выстреливает error_occurred - но я нашел это только а одном файле

/app/addons/rus_russianpost/Tygh/Shippings/Services/RussianPostCalc.php

Но там он срабатывать должен если

if ($calc['cost'] != 0) {
} else {
$this->_internalError(__('error_occurred'));
}

Но блин в ответе

{"calc":[{"type":"rp_1class","cost":651.06,"days":3},{"type":"rp_main","cost":348,"days":5}],

И поскольку проверка на цену !=0 идет внутри

if ($calc['type'] == $shipping_type) {

Я делаю вывод что до массива $calc скрипт добирается нормально.

Идея только одна - где-то эта error_occurred еще есть, но пока не нашел. Я же тупо каждый файл открываю файлзиллой…

Не, прошелся через шелл grep - больше нет нигде.

Все, готов сдаться.

Кроме json в ответе еще есть что-нибудь? Типа кусков заголовков

Да (кстати - раньше не было), но там все ОК типа 200 итп… Типичный заголовок ответа HTTPS страницы. А потом идет массив json.

Ответ: HTTP/2 200 server: nginx/1.16.1 date: Mon, 12 Dec 2022 09:21:19 GMT content-type: text/html; charset=cp1251 content-length: 462 vary: Accept-Encoding x-powered-by: PHP/5.3.29 vary: Accept-Encoding strict-transport-security: max-age=31536000; includeSubDomains; preload {"calc":[{"type":"rp_1class","cost":386.74,"days":3},{"type":"rp_main","cost":330,"days":5}],"info":{"weight":"0.2","ob_cennost_rub":"4500.45","from_index":"115372","from_city":"\u041c\u043e\u0441\u043a\u0432\u0430","from_state":"\u041c\u043e\u0441\u043a\u0432\u0430","to_index":"115404","to_city":"\u041c\u043e\u0441\u043a\u0432\u0430","to_state":"\u041c\u043e\u0441\u043a\u0432\u0430"},"msg":{"type":"done","text":"\u0423\u0441\u043f\u0435\u0448\u043d\u043e"}}

Йес. Спасибо за наводку. Решил вопрос путем:

	$posi = strpos($response, "{");
	$response = substr($response, $posi);

В функции public function getSimpleRates()

Вот официальный фикс, чтобы везде работало