2015-03-20 2 views

ответ

4

Вы можете использовать функцию hash_hmac в PHP для создания подписи. Instamojo использует алгоритм «sha1», поэтому, ваш hash_hmac вызов будет выглядеть так:

hash_hmac("sha1", $message, $salt) 

Здесь $message собирается быть "|" отделенные значения и $salt будут частные соли из developers page (убедитесь, что вы вошли в систему) ,

Алгоритм генерации $message является:

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

Скажем URL является:

https://www.instamojo.com/demo/demo-offer/?data_name=Aditya+Sengupta&[email protected]&data_phone=9999999999&data_amount=123.45&data_readonly=data_name&data_readonly=data_email&data_readonly=data_phone&data_readonly=data_amount

Для приведенного выше URL вы получите следующий порядок:

  1. data_amount
  2. data_email
  3. data_name
  4. data_phone

Используя приведенный выше порядок ключей мы получим значения в следующем порядке:

  1. 123,45
  2. [email protected]
  3. Адитья Сенгупту

Теперь конкатенации вышеуказанные значения, используя | (труба) оператора, так $message будет выглядеть следующим образом:

123.45|[email protected]|Aditya Sengupta|9999999999 

Если $salt является "ABCDE", то вы получите это как подпись:

$ php -a 
Interactive shell 

php > $message = "123.45|[email protected]|Aditya Sengupta|9999999999"; 
php > $salt = "abcde"; 
php > echo hash_hmac("sha1", $message, $salt) . "\n"; 
676a4b5ba30e464f027249747a63ea587f8c4b9a 

Как это сделать, если у меня был массив значений только для чтения?

Ну, вам нужно сначала отсортировать массив по ключам, это должно быть безопасным для случая. Если вы используете PHP 5.4.0 + вы можете сделать что-то вроде этого:

php > $read_only_fields = ["data_email" => "[email protected]", "data_Phone" => "9999999999", "data_name" => "Aditya Sengupta", "data_Amount" => "123.45"]; 
php > ksort($read_only_fields, SORT_STRING | SORT_FLAG_CASE); 
php > $message = implode('|', $read_only_fields); 
php > echo $message . "\n"; 
123.45|[email protected]|Aditya Sengupta|9999999999 
php > $salt = "abcde"; 
php > echo hash_hmac("sha1", $message, $salt) . "\n"; 
676a4b5ba30e464f027249747a63ea587f8c4b9a 

Для более старых версий PHP (старше 5.4.0) использовать это для сортировки:

uksort($data, 'strcasecmp'); 

Для получения дополнительной информации читать их Integration documentation и How do I ensure that the link is tamper proof?.