Интеграция

Примеры расчета сигнатуры на разных языках

Интеграция
Примеры расчета сигнатуры на разных языках
Дата публикации: 17 мая 2022

PHP сигнатура

/* Определяем массив с параметрами для расчета.
В этот массив должны войти все параметры, отправляемые в вашей форме (за исключением самого поля 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;
}

NodeJS сигнатура

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();
}
package-lock.json
{
  "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=="
    }
  }
}
package.json
{
  "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"
  }
}

Python

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();
            }
        }
    }
Читайте также:

Вам помогла эта статья?