Задача такая: на форме 5 скрытых полей, и одно поле ввода. Необходимо: 1.Пользователь ввел данные в форму (сделано) 2. скрипт собрал все 6 значений в одну строку (сделано) 3. зашифровал строку sha512 (сделано). Причем ключ шифрования не должен показываться на стороне клиента, значит, как я понял JS-скрипт отпадает, только ПХП 4. отправить POST на другой ресурс (доступа к нему нет) - вот тут затык... т.е. после нажатия submit я получаю данные в массиве POST, выковыриваю и делаю шифрованную строку. А дальше как ? кто может пояснить, как сделать ?.
4 - а другой ресурс ожидает, что ты на него с бэка будешь отправлять? Если это не открытое апи, то у нас запрещено такое обсуждать Захешировал. Какой там ключ? Наверное, подпись имеется в виду, а не шифрование.
другой ресурс ожидает. это открытое апи, тут проблем нет ну да, захешировал ) сделал подпись. $r="01234567890123456789012"; $Vs = $_POST["order"].";".$_POST["amount"].";".$_POST['currency'].";".$_POST['merchant'].";".$_POST['terminal'].";"; $vSign = hash('sha512', $r.$Vs); вот теперь мне надо отправить в post значения $Vs и $vSign. как их отправить ? из этой же веб-страницы делается или надо отдельную формировать? и как отправлять - есть разница отправлять переменную $Vs или все-таки отправлять полную строку $_POST["order"].";".$_POST["amount"].";".$_POST['currency'].";".$_POST['merchant'].";".$_POST['terminal'].";"; ??
Требование по инструкции к апи: На шаге 2 запрос коммерсанта должен быть в отправлен в ecom методом POST на адрес https://jpay.jysanbank.kz/ecom/api параметры запроса: (все вот эти поля плюс подпись) или я где-то недопонимаю и как следствие сам себе усложняю все ?
$Vs = $_POST["order"].";".$_POST["amount"].";".$_POST['currency'].";".$_POST['merchant'].";".$_POST['terminal'].";"; $vSign = hash('sha512', $r.$Vs); $post_data = array ( 'vS' => $Vs, 'vSign' => $vSign ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $output = curl_exec($ch); curl_close($ch); вот такой код. Где ошибка ?
так и хочется сказать - в ДНК... посмотрите ответ - вам сервер должен сказать что не так.... Вангую что неверно строку собираете в API должно четко говорится - какие данные и в каком формате оно ждет
За что люблю старожилов - за точные и конкретные ответы )))) а если точнее, то в описании апи говорится: На шаге 2 запрос коммерсанта должен быть в отправлен в ecom методом POST на адрес https://jpay.jysanbank.kz/ecom/api параметры запроса: (все вот эти поля плюс подпись) от сервера пока ответа нет, либо я не понимаю где смотреть если не сложно, можно пальцем ткнуть, куда посмотреть ?
блин... новый Мессинг... да откуда знаем что там в АПИ говорится, вы его нам походу своими словами пересказываете... обычно это просто каждое поле передается как есть .. а подпись - вычисляется то есть PHP: [ 'order' => $_POST['order'], 'amount' => $_POST['amount'], 'sign' => $vSign ] итд ... очень чето сомневаюсь что у вас поля должны называться vS, vSign ... и сформированы именно таким образом
не, это цитата из их методички, только вместо моих слов - (все вот эти поля плюс подпись) там идет таблица перечисляющая все поля, поэтому заменил как форму сделать и из нее получить запрос - это понятно. У меня заморочка вот в чем: Посетитель сайта вводит сумму на форме, идентификаторы мерча и остальные данные - скрытые поля на этой же форме. Я беру эти значения, формирую подпись: $vSign = hash('sha512', $r.$Vs); не понимаю, как эту подпись добавить в рост-запрос... Запрос формируется при нажатии кнопки отправить, после того как посетитель ввел данные. Но он же сразу же формируется и тут же отправляется. В какой момент успеть из этих данных сделать подпись и прицепить ее к запросу ? т.е. посетитель ввел данные в поле. Но пока он не нажал сабмит, эти данные еще не поступили в бэк, т.е. я не могу сформировать подпись. А после того как он нажал сабмит, запрос уже отправился в апи. Вот этот момент не понимаю
Ну а зачем формировать подпись до того, как данные поступили на бэк? Секретный ключ для подписи вообще на фронте мелькать не должен, иначе он уже не секретный. А у тебя чтой-то вроде банка, я так понимаю. Секретный ключ хранится где-то на сервере, в БД, например, или можно в переменную окружения засунуть, в код, в конфиг файл. Смотря по задаче.
Смотри, по ходу ты не понимаешь, как это работает, и зачем всё это нужно. Когда дело идёт о деньгах, важна дополнительная защита данных. sha512, как и все другие методы шифрования - необратимая процедура, т.е. после того, как что-то захешировали, уже "расхешировать" невозможно. Поэтому принцип подобных подписей работает так (я участвовал в разработке нескольких подобных, так что знаю, про что говорю): Секретный ключ хранится у платёжной системы и на бэке у мерчанта. Когда мерчант присылает подписанные данные, платёжная система достаёт из своей базы этот ключ, и подписывает данные ещё раз. После этого проверяет, совпала ли пересчитанная подпись с той, которую прислал мерчант. Это ещё более важно при обратных запросах, от платёжной системы к бэку мерчанта Если ты засветишь секретный ключ на фронте, придёт злой-злой хакер, и будет от твоего имени слать платёжной системе запросы, и она их будет пропускать, и наоборот. Дальше надо смотреть какое конкретный апи. Иногда нужно не просто сделать пост запрос, а чтоб он произошёл именно в браузере. В таком случае можно передать на фронт собственно подпись, это безопасно, без секретного ключа она не представляет никакой ценности. Дальше уже можно смотреть по задачам, к примеру можно кинуть на бэк данные аяксом и получить назад подпись. Покажи нам цитату непосредственно, как написано в документации твоего банка, потому что так нифига не понятно.
Ну так у тебя просят одно отправить, а ты отправляешь совсем другое. Мой совет - нанять кого-нибудь (себя не предлагаю), а то ты так долго будешь возиться
Но вообще, надо ещё смотреть по апихе, потому что обычно такие запросы не делаются курлом. Обычно формируется форма на сервере, в которой заполнены все нужные поля (с подписью включительно), отправляется на фронт и там уже в браузере субмитится, либо традиционным способом (т.е. показывается кнопка "оплатить", и юзверь её кликает), либо автоматически через жабаскрипт. Ну и параметр Language говорит, что тут та же история
В принципе, я сделал. не знаю, насколько профессионально))) Я сделал так: сделал форму - поля для посетителя плюс скрытые поля с моими данными.Посетитель заполняет форму своими данными, отправляет post на другую страницу. На второй странице из post вытаскиваю все, что мне нужно, делаю подпись и запихиваю все это в форму со скрытыми полями. На второй странице (со скрытой формой) есть одна единственная кнопка для юзера - Оплатить "сумма". (типа подтвердите). Юзер подтверждает, нужный мне post уходит уже на api банка. Может, кому такой костыль пригодится ))
Ну вообще не костыль, а именно так и делается. Вместо кнопки оплатить можно скриптик поставить, который будет метод submit у формы вызывать HTML: <form id='f1' method='post' action=...>....</form> <script>f1.submit(); </script>