/* Определяем массив с параметрами для расчета.
В этот массив должны войти все параметры, отправляемые в вашей форме (за исключением самого поля signature, значение которого вычисляем).
Получив вашу форму, система ИЭ аналогичным образом вычислит из ее параметров signature и сравнит значение с вычисленным на стороне вашего магазина. */
$items = array(
'testing' => '1',
'salt' => 'dPUTLtbMfcTGzkaBnGtseKlcQymCLrYI',
'order_id' => '14425840',
'amount' => '973',
'merchant' => 'ad25ef06-1824-413f-8ef1-c08115b9b979',
'description' => 'Заказ №14425840',
'client_phone' => '+7 912 9876543',
'client_email' => 'test@test.ru',
'success_url' => 'http://myawesomesite.com/payment_success',
'receipt_contact' => 'test@mail.com',
'receipt_items' => '[{"discount_sum": 40, "name": "Товар 1", "payment_method": "full_prepayment", "payment_object": "commodity", "price": 48, "quantity": 10, "sno": "osn", "vat": "vat10"}, {"name": "Товар 2", "payment_method": "full_prepayment", "payment_object": "commodity", "price": 533, "quantity": 1, "sno": "osn", "vat": "vat10"}]',
'unix_timestamp' => '1573451160'
);
echo 'Signature: '. get_signature($items);
/* Двойное шифрование sha1 на основе секретного ключа
подставьте ваш секретный ключ вместо 00112233445566778899aabbccddeeff */
function double_sha1($data) {
for ($i = 0; $i < 2; $i++) {
$data = sha1('00112233445566778899aabbccddeeff' . $data);
}
return $data;
}
/* Вычисляем подпись (signature). Подпись считается на основе склеенной строки из отсортированного массива параметров, исключая из расчета пустые поля и элемент "signature" */
function get_signature(array $params, $key = 'signature') {
$keys = array_keys($params);
sort($keys);
$chunks = array();
foreach ($keys as $k) {
$v = (string) $params[$k];
if (($v !== '') && ($k != 'signature')) {
$chunks[] = $k . '=' . base64_encode($v);
}
}
$data = implode('&', $chunks);
echo 'data: '.$data."\n";
$sig = double_sha1($data);
return $sig;
} const Base64 = require('js-base64').Base64;
const SHA1 = require('crypto-js/sha1');
/* Определяем массив с параметрами для расчета.
В этот массив должны войти все параметры, отправляемые в вашей форме (за исключением самого поля signature, значение которого вычисляем).
Получив вашу форму, система ИЭ аналогичным образом вычислит из ее параметров signature и сравнит значение с вычисленным на стороне вашего магазина. */
const data = {
'testing': '1',
'salt': 'dPUTLtbMfcTGzkaBnGtseKlcQymCLrYI',
'order_id': '14425840',
'amount': '973',
'merchant': 'ad25ef06-1824-413f-8ef1-c08115b9b979',
'description': 'Заказ №14425840',
'client_phone': '+7 912 9876543',
'client_email': 'test@test.ru',
'success_url': 'http://myawesomesite.com/payment_success',
'receipt_contact': 'test@mail.com',
'receipt_items': '[{"discount_sum": 40, "name": "Товар 1", "payment_method": "full_prepayment", "payment_object": "commodity", "price": 48, "quantity": 10, "sno": "osn", "vat": "vat10"}, {"name": "Товар 2", "payment_method": "full_prepayment", "payment_object": "commodity", "price": 533, "quantity": 1, "sno": "osn", "vat": "vat10"}]',
'unix_timestamp': '1573451160'
};
/* подставьте ваш секретный ключ вместо 00112233445566778899aabbccddeeff */
const key = '00112233445566778899aabbccddeeff';
console.log('Signature: ', GetSignature(key, data));
/* Вычисляем подпись (signature). Подпись считается на основе склеенной строки из отсортированного массива параметров, исключая из расчета пустые поля и элемент "signature" */
function GetSignature(secretKey, formData) {
const values = Object.keys(formData)
.filter(key => key !== 'signature')
.filter(key => formData[key] != '')
.sort()
.map(key => `${key}=${Base64.encode(formData[key])}`)
.join('&')
;
console.log('data: ', values)
/* Двойное шифрование sha1 на основе секретного ключа */
const signature = SHA1(secretKey + SHA1(secretKey + values));
return signature.toString();
} {
"name": "runner",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"crypto-js": {
"version": "3.1.9-1",
"resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.9-1.tgz",
"integrity": "sha1-/aGedh/Ad+Af+/3G6f38WeiAbNg="
},
"js-base64": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz",
"integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw=="
}
}
}
{
"name": "runner",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"crypto-js": "^3.1.9-1",
"js-base64": "^2.5.1"
}
} import base64
import hashlib
def get_raw_signature(params):
chunks = []
for key in sorted(params.keys()):
if key == 'signature':
continue
value = params[key]
if isinstance(value, str):
value = value.encode('utf8')
else:
value = str(value).encode('utf-8')
if not value:
continue
value_encoded = base64.b64encode(value)
chunks.append('%s=%s' % (key, value_encoded.decode()))
raw_signature = '&'.join(chunks)
return raw_signature
'''Двойное шифрование sha1 на основе секретного ключа'''
def double_sha1(secret_key, data):
sha1_hex = lambda s: hashlib.sha1(s.encode('utf-8')).hexdigest()
digest = sha1_hex(secret_key + sha1_hex(secret_key + data))
return digest
'''Вычисляем подпись (signature). Подпись считается на основе склеенной строки из отсортированного массива параметров, исключая из расчета пустые поля и элемент "signature" '''
def get_signature(secret_key: str, params: dict) -> str:
return double_sha1(secret_key, get_raw_signature(params))
'''Определяем словарь с параметрами для расчета.
В этот массив должны войти все параметры, отправляемые в вашей форме (за исключением самого поля signature, значение которого вычисляем).
Получив вашу форму, система ИЭ аналогичным образом вычислит из ее параметров signature и сравнит значение с вычисленным на стороне вашего магазина.
подставьте ваш секретный ключ вместо 00112233445566778899aabbccddeeff
'''
if __name__ == '__main__':
items = {
"testing": '1',
"salt": 'dPUTLtbMfcTGzkaBnGtseKlcQymCLrYI',
"order_id": '14425840',
"amount": '973',
"merchant": 'ad25ef06-1824-413f-8ef1-c08115b9b979',
"description": 'Заказ №14425840',
"client_phone": '+7 912 9876543',
"client_email": 'test@test.ru',
"success_url": 'http://myawesomesite.com/payment_success',
"receipt_contact": 'test@mail.com',
"receipt_items": '[{"discount_sum": 40, "name": "Товар 1", "payment_method": "full_prepayment", "payment_object": "commodity", "price": 48, "quantity": 10, "sno": "osn", "vat": "vat10"}, {"name": "Товар 2", "payment_method": "full_prepayment", "payment_object": "commodity", "price": 533, "quantity": 1, "sno": "osn", "vat": "vat10"}]',
"unix_timestamp": '1573451160'
}
print(get_signature('00112233445566778899aabbccddeeff', items)) using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
class MainClass {
public static void Main (string[] args) {
var data = new Dictionary<string, string>()
{
{"testing", "1"},
{"salt", "dPUTLtbMfcTGzkaBnGtseKlcQymCLrYI"},
{"order_id", "14425840"},
{"amount", "973"},
{"merchant", "ad25ef06-1824-413f-8ef1-c08115b9b979"},
{"description", "Заказ №14425840"},
{"client_phone", "+7 912 9876543"},
{"client_email", "test@test.ru"},
{"success_url", "http://myawesomesite.com/payment_success"},
{"receipt_contact", "test@mail.com"},
{"receipt_items", "[{\"discount_sum\": 40, \"name\": \"Товар 1\", \"payment_method\": \"full_prepayment\", \"payment_object\": \"commodity\", \"price\": 48, \"quantity\": 10, \"sno\": \"osn\", \"vat\": \"vat10\"}, {\"name\": \"Товар 2\", \"payment_method\": \"full_prepayment\", \"payment_object\": \"commodity\", \"price\": 533, \"quantity\": 1, \"sno\": \"osn\", \"vat\": \"vat10\"}]"},
{"unix_timestamp", "1573451160"}
};
Console.WriteLine(SignatureCalculator.GetSignature("00112233445566778899aabbccddeeff", data));
}
}
public static class SignatureCalculator
{
public static string GetSignature(string secretKey, IDictionary<string, string> formData)
{
var keys = formData
.Where(x=>x.Value != "")
.Where(x=> x.Key != "signature")
.Select(x => new { x.Key, Value = $"{x.Key}={GetBase64Val(x.Value)}" })
.OrderBy(x => x.Key)
.ToArray();
var values = string.Join("&", keys.Select(x => x.Value));
Console.WriteLine(values);
var signature = SHA1(secretKey + SHA1(secretKey + values));
return signature;
}
private static string GetBase64Val(object plainText)
{
var value = plainText == null ? string.Empty : plainText.ToString();
var plainTextBytes = Encoding.UTF8.GetBytes(value);
return Convert.ToBase64String(plainTextBytes);
}
// ReSharper disable once InconsistentNaming
private static string SHA1(string input)
{
using (var sha1 = new SHA1Managed())
{
var hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(input));
var sb = new StringBuilder(hash.Length * 2);
foreach (var b in hash)
{
// can be "x2" if you want lowercase
sb.Append(b.ToString("x2"));
}
return sb.ToString();
}
}
}