Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Другие темы раздела
PHP Вывод в select https://www.cyberforum.ru/ php-beginners/ thread2770531.html
Добрый день, вылезла проблемка при выводе в select, Проблема заключаться что оно то выводит но не в 1 select а под каждую строчку с таблицы БД, Задал условие WHERE id=1 Выводит только понятно что то...
Запрос в цикле PHP
Добрый день уважаемые программисты PHP. Мне нужно проверить поставил ли гость ранее лайк на видео или нет. У меня получается это узнать только сделав запрос внутри цикла, есть ли какой нибудь...
Ошибка Maximum execution time of 180 PHP
Ошибка указывает на строчку инкуд include $rootdir.'principal/errors/nodatabase.php'; exit(); вот сам файл nodatabase.php <html> <head>
PHP Поиск по несколькими полями Добрый день! Столкнулся с такой проблемой, нужно реализовать поиск по несколькими полями, написал функцию ну почему то она не срабатывает и не вы дает каких либо ошибок. помогите найти проблему. PHP... https://www.cyberforum.ru/ php-beginners/ thread2770137.html
PHP XML vs JSON vs SQL performance https://www.cyberforum.ru/ php-beginners/ thread2770105.html
Добрый день. Имеется XML файл подобной структуры: http://topnlab.ru/xml-format.html На 1000+ объектов, с обширным количеством полей (по ссылке) Эти объекты будут синхронизироваться ежедневно,...
Неограниченное добавление полей по нажатию кнопки без сохранения при обновлении PHP
Доброго времени суток. Казалось бы простая задача, и вроде бы когда-то делал, но не могу найти у себя (может ошибаюсь что делал) и по поиску тоже подходящего не нашел. Необходимо только на php...
PHP POST запрос к input
Здравствуйте! Помогите разобраться с POST запросами к input. Задача такая: Есть форма (index.php) в которую нужно ввести кол-во треугольников(случайное событие), после этого форма обрабатывается...
PHP Определение группы добрый день всем. можете помочь как определить у пользователя какая у него группа через php чтобы автоматически показывал <select><option</select> и после выборки группы автоматически... https://www.cyberforum.ru/ php-beginners/ thread2769969.html
PHP класс MyPoint2D MyLine https://www.cyberforum.ru/ php-beginners/ thread2769911.html
Доброго времени суток форумы,прошу у вас помощи в задачке,не могу понять как сделать В библиотеки должны присутствовать следующие классы: MyPoint2D MyLine MyFigure MySque
PHP Проверить соседние значения многомерного массива на соответствие условию Доброго времени суток. Проверить чему равно одно значение массива просто. Понимаю как проверить соседние справа и слева значения. Но как проверить сверху и снизу? Попробую пояснить задачу на... https://www.cyberforum.ru/ php-beginners/ thread2769853.html
PHP Каталог товаров https://www.cyberforum.ru/ php-beginners/ thread2769812.html
Здравствуйте. Пытаюсь сделать каталог товаров с категориями и прочим, не могу понять - как при нажатии на определенную категорию открывалась страница с товарами этой самой категории. Запуталась в...
PHP Sublime text 3. Проблемы с обновлением плагинов Доброго всем времени суток. Обнаружил у себя вот такую проблему. ST3 перестал воспринимать синтаксис sass. Путем бубнов выяснил, что плагин sass не обновляется (или еще что-то с ним случилось). В... https://www.cyberforum.ru/ php-beginners/ thread2769761.html
1 / 1 / 0
Регистрация: 08.12.2009
Сообщений: 30
0

Проверить sha256 в ответе платежной системы UnitPay

17.01.2021, 20:14. Просмотров 466. Ответов 1
Метки (Все метки)


Здравствуйте, ребята. Мучаюсь уже два дня. Никак не могу правильно сформировать sha256

Цифровая подпись. Образуется как sha256(method + "{up}" + params + "{up}" + secretKey), где sha256 - метод шифрования; "{up}" - разделитель параметров в хеш-функции; method - тип вызова (check, pay, error); params - значения параметров из массива params, объединенные разделителем "{up}". Все параметры должны быть предварительно отсортированы по ключу, в склейке не участвуют параметры sign и signature; secretKey - секретный ключ проекта (доступен в личном кабинете); Пример расчета подписи для запроса http://partnerUrl?method=check & params=bob & params[c]=sam & params[a]=todи секретного ключа "a1b1c1d1" sha256("check{up}tod{up}bob{up}sam{up}a1b1c1d1")

Ответ UnitPay
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
array (
)
array (
  'action' => 'unitpay',
  'method' => 'pay',
  'params' =>
  array (
    'account' => 'test',
    'date' => '2021-01-17 17:50:12',
    'ip' => '93.80.3.62',
    'isPreauth' => '0',
    'operator' => 'mts',
    'orderCurrency' => 'RUB',
    'orderSum' => '10.00',
    'payerCurrency' => 'RUB',
    'payerSum' => '10.00',
    'paymentType' => 'mc',
    'phone' => '0',
    'profit' => '8',
    'projectId' => '123456',
    'signature' => '65f56854115sadfdfa103798a8c34b6cd0ad55ccf9caf91f70e7745ad8bd1e76f93a54aad',
    'sum' => '10',
    'test' => '1',
    'unitpayId' => '175',
  ),
)
Вот таким образом у меня правильно формируется подпись, но только для одного метода платежа. Если метод платежа меняется, то параметры могут немного меняться, поэтому подпись уже неверна.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
        $canal = 'unitpay';
        $amount_value = $_GET['params']['payerSum']; //сумма платежа
        $payment_id_unitpay = $_GET['params']['account']; // № транзакции
        $CURRENCY = Config_Payment::UNITPAY_CURRENCY; // валюта. Для проверки платежа
        $UNITPAY_PROJECTID = Config_Payment::UNITPAY_PROJECTID; // номер магазина. Для проверки платежа
        $secret_key = Config_Payment::UNITPAY_SECRETKEY; // секретный ключ
        if (stripos($payment_id_unitpay, ':')) { // передавали uid и транзакцию в одном параметре. Теперь разбираем из ответа
            $payment_id_unitpay_2 = explode(":", $payment_id_unitpay);
            $account = (int) $payment_id_unitpay_2[0]; // id
            $billId = (int) $payment_id_unitpay_2[1]; // транзакция
        }
    
 
 
    
        // sha256. Старт. Написано для теста. При типе платежа "Мобильная коммерция" ключ совпадает. При других типах массив имеет другие параметры.
 
 
 
 
        $method = $_GET['method'];
        $date = $_GET['params']['date'];
        $ip = $_GET['params']['ip'];
        $isPreauth = $_GET['params']['isPreauth'];
        $operator = $_GET['params']['operator'];
        $orderCurrency = $_GET['params']['orderCurrency'];
        $orderSum = $_GET['params']['orderSum'];
        $payerCurrency = $_GET['params']['payerCurrency'];
        $payerSum = $_GET['params']['payerSum'];
        $paymentType = $_GET['params']['paymentType'];
        $phone = $_GET['params']['phone'];
        $profit = $_GET['params']['profit'];
        $projectId = $_GET['params']['projectId'];
        $sum = $_GET['params']['sum'];
        $test = $_GET['params']['test'];
        $unitpayId = $_GET['params']['unitpayId'];
    
        $sha256_hash_header = $_GET['params']['signature'];
        function getFormSignature($method, $payment_id_unitpay, $date, $ip, $isPreauth, $operator, $orderCurrency, $orderSum, $payerCurrency, $payerSum, $paymentType, $phone, $profit, $projectId, $sum, $test, $unitpayId, $secret_key) {
                $hashStr = $method.'{up}'.$payment_id_unitpay.'{up}'.$date.'{up}'.$ip.'{up}'.$isPreauth.'{up}'.$operator.'{up}'.$orderCurrency.'{up}'.$orderSum.'{up}'.$payerCurrency.'{up}'.$payerSum.'{up}'.$paymentType.'{up}'.$phone.'{up}'.$profit.'{up}'.$projectId.'{up}'.$sum.'{up}'.$test.'{up}'.$unitpayId.'{up}'.$secret_key;
                return hash('sha256', $hashStr);
        }
        $sha256_hash = getFormSignature($method, $payment_id_unitpay, $date, $ip, $isPreauth, $operator, $orderCurrency, $orderSum, $payerCurrency, $payerSum, $paymentType, $phone, $profit, $projectId, $sum, $test, $unitpayId, $secret_key);
    
 
 
 
// sha256. Финиш
    
 
 
 
        if ($sha256_hash_header == $sha256_hash && !empty($sha256_hash_header)) { // Сравнение sha256
            $userID = (int) $account;
            $defint = (int) $billId;
            $amount = $amount_value;
        } else {
            die(json_encode(array("error" => array("message" => "Invalid data"))));
        }
    
        //if($_GET['params']['sum'] != (float) $_GET['params']['orderSum']) {
        //    die(json_encode(array("error" => array("message" => "Invalid amount transferred "))));
        //}
    
        if($_GET['params']['orderCurrency'] != $CURRENCY) {
            die(json_encode(array("error" => array("message" => "Invalid transferred currency"))));
        }
 
        if($_GET['params']['projectId'] != $UNITPAY_PROJECTID) {
            die(json_encode(array("error" => array("message" => "Invalid project id"))));
        }
    
        if($_GET['method'] == 'check'){
            die(json_encode(array("result" => array("message" => "Successful check"))));
        }
    
        if($_GET['method'] == 'preauth'){
            die(json_encode(array("result" => array("message" => "Pre-authorization. Waiting for payment"))));
        }
    
        if($_GET['method'] == 'error'){
            die(json_encode(array("result" => array("message" => "Payment error. Expectation"))));
        }
    
        if($_GET['method'] == 'pay'){
            $this->addBalance($canal, $userID, $amount, $defint); // Начисляем баланс
            die(json_encode(array("result" => array("message" => "Success"))));
        }

Вот кусок кода из sdk unitpay, но у себя подобное я сделать не смог:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
private $params = array();
function getSignature(array $params, $method = null)
    {
        ksort($params);
        unset($params['sign']);
        unset($params['signature']);
        array_push($params, $this->secretKey);
 
        if ($method) {
            array_unshift($params, $method);
        }
 
        return hash('sha256', join('{up}', $params));
    }
 
list($method, $params) = array($_GET['method'], $_GET['params']);
 
        if (!in_array($method, $this->supportedPartnerMethods)) {
            throw new UnexpectedValueException('Method is not supported');
        }
 
        if (!isset($params['signature']) || $params['signature'] != $this->getSignature($params, $method)) {
            throw new InvalidArgumentException('Wrong signature');
        }
https://help.unitpay.ru/payments/payment-handler

Вернуться к обсуждению:
Проверить sha256 в ответе платежной системы UnitPay
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.01.2021, 20:14
Готовые ответы и решения:

Unitpay sha256
Здравствуйте ! Помогите решить вопрос перехода с md5 на sha256. вот как было function...

Продам премиум домен CloudRemittance.com для банка, системы денежных переводов, платежной системы
Продаю (дорого) премиум домен CloudRemittance в зоне com для банка, платежной системы, системы...

Реализация платежной системы
Доброго времени суток. Идея такова, чтобы на сайте была внутренняя своя валюта которая...

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

1
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.