У меня есть эта функция php, что я перед тем, как развить то же самое в python 2.7:
//PHP
$actionSLK = 'https://test.monsite.com/script.cgi';
$storeId = 'test';
$cartId = 'test2';
$totalAmountTx = '100';
$email = '[email protected]';
$SLKSecretKey = 'secret';
$dataMD5=$actionSLK . $storeId . $cartId . $totalAmountTx . $email . $SLKSecretKey
$checksum=MD5(utf8entities(rawurlencode($dataMD5)));
#PYTHON:
from hashlib import md5
import urllib
actionSLK = 'https://test.monsite.com/script.cgi'
storeId = 'test'
cartId = 'test2'
totalAmountTx = '100'
email = '[email protected]'
SLKSecretKey = 'secret'
dataMD5 = actionSLK + storeId + cartId + totalAmountTx + email + SLKSecretKey
checksum = md5(urllib.quote(dataMD5).encode('utf8')).hexdigest()
Проблема, которую я обнаружил, - это вычисленная контрольная сумма, это не тот же MD5
, а затем я проверил кодированный url (сгенерировал один: 'https://test.monsite.com/[email protected]'
), и здесь мы:
//PHP
$checksum=MD5('https%3A%2F%2Ftest.monsite.com%2Fscript.cgitesttest100test%40monsite.comsecret');
#PYTHON
checksum = md5('https%3A//test.monsite.com/script.cgitesttest100test%40monsite.comsecret').hexdigest()
Таким образом, косая черта не кодируется, поэтому при генерации разностной контрольной суммы возникает ошибка.
есть ли другая функция в urllib, которая кодирует URL-адреса, подобные этому?
urllib.quote()
часто используется для кодирования частей URL-адресов, включая путь, и, следовательно, по умолчанию /
считается безопасным символом. Pass safe=''
явно:
>>> dataMD5
'https://test.monsite.com/[email protected]'
>>> import urllib
>>> urllib.quote(dataMD5)
'https%3A//test.monsite.com/script.cgitesttest2100test%40monsite.comsecret'
>>> urllib.quote(dataMD5, safe='')
'https%3A%2F%2Ftest.monsite.com%2Fscript.cgitesttest2100test%40monsite.comsecret'
quote_plus()
обычно используется для создания данных application/x-www-form-urlencoded
и, следовательно, safe=''
по умолчанию.
Чтобы узнать, следует ли использовать quote_plus()
или quote()
, рассмотрите данные с пробелами:
>>> urllib.quote_plus('/ /')
'%2F+%2F'
>>> urllib.quote('/ /', safe='')
'%2F%20%2F'
PHP rawurlencode()
создает последний, и поэтому вы должны использовать quote(safe='')
вместо quote_plus()
.
Вы можете использовать urllib.quote_plus():
>>> encoded = urllib.quote_plus("https://test.monsite.com/[email protected]")
>>> encoded
'https%3A%2F%2Ftest.monsite.com%2Fscript.cgitesttest100test%40monsite.comsecret'
Используя urllib.quote_plus
вы можете это сделать
actionSLK = "https://test.monsite.com/script.cgi"
urllib.quote_plus(actionSLK)
>>https%3A%2F%2Ftest.monsite.com%2Fscript.cgi
rawurlencode()
выдает%20
, а не+
; используйте вместо этогоquote(safe='')