Ну тут несложно разобраться. Пишем простую программу:
import binascii
from hashlib import sha256
from pprint import pprint
m_shop = "297863614"
m_orderid = "1"
m_amount = "1.00"
m_curr = "RUB"
description = "Test"
m_desc = binascii.b2a_base64(description.encode('utf8'))[:-1]
m_key = "123"
sign = map(str, [m_shop, m_orderid, m_amount, m_curr, m_desc, m_key])
result_string = ":".join(sign)
sign_hash = sha256(result_string.encode())
print(sign_hash.hexdigest().upper())
pprint(locals())
Запускаем её в Python 2.7 и Python 3.5, сохраняя результаты в отдельные файлы:
$ python2.7 test.py > out27.txt
$ python3.5 test.py > out35.txt
Сравниваем результаты:
$ diff -uNr out27.txt out35.txt
--- out27.txt 2017-02-03 10:47:43.332857592 +0300
+++ out35.txt 2017-02-03 10:47:49.108857700 +0300
@@ -1,19 +1,22 @@
-63AD11CA912BE9E55A7BBBCC4A88BF36E39C6C314929C536C65982AD04F2751D
-{'__builtins__': <module '__builtin__' (built-in)>,
+8C0EA00770F5A68C3436A67E3C6D808AF4FB5EDCCF908E6A4B4EC325FE77DF7F
+{'__builtins__': <module 'builtins' (built-in)>,
+ '__cached__': None,
'__doc__': None,
'__file__': 'test.py',
+ '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7fc51d6149b0>,
'__name__': '__main__',
'__package__': None,
+ '__spec__': None,
'binascii': <module 'binascii' (built-in)>,
'description': 'Test',
'm_amount': '1.00',
'm_curr': 'RUB',
- 'm_desc': 'VGVzdA==',
+ 'm_desc': b'VGVzdA==',
'm_key': '123',
'm_orderid': '1',
'm_shop': '297863614',
- 'pprint': <function pprint at 0x7f0e4bd0a5f0>,
- 'result_string': '297863614:1:1.00:RUB:VGVzdA==:123',
+ 'pprint': <function pprint at 0x7fc51d618d08>,
+ 'result_string': "297863614:1:1.00:RUB:b'VGVzdA==':123",
'sha256': <built-in function openssl_sha256>,
- 'sign': ['297863614', '1', '1.00', 'RUB', 'VGVzdA==', '123'],
- 'sign_hash': <sha256 HASH object @ 0x7f0e4bcf5f80>}
+ 'sign': <map object at 0x7fc51d61b400>,
+ 'sign_hash': <sha256 HASH object @ 0x7fc51f0ee300>}
Видим, что в переменной m_desc
мы налетели на особенность работы со строками в Python3.5.
Соответственно, программу надо немного изменить:
import base64
from hashlib import sha256
m_shop = "297863614"
m_orderid = "1"
m_amount = "1.00"
m_curr = "RUB"
description = "Test"
m_desc = base64.b64encode(description.encode('utf8')).decode('utf-8')
m_key = "123"
result_string = "{}:{}:{}:{}:{}:{}".format(m_shop, m_orderid, m_amount, m_curr, m_desc, m_key)
sign_hash = sha256(result_string.encode())
print(sign_hash.hexdigest().upper())
Получаем такой результат:
$ python2.7 test.py
63AD11CA912BE9E55A7BBBCC4A88BF36E39C6C314929C536C65982AD04F2751D
$ python3.5 test.py
63AD11CA912BE9E55A7BBBCC4A88BF36E39C6C314929C536C65982AD04F2751D