我一直在尝试将php脚本转换为python3
脚本,并且在通过问题进行故障排除后一直未能通过成功的签名发送。
下面的PHP
示例代码成功通过,所以我复制了发送的时间戳和签名,试图在我的python3代码中复制它。
<?
$nonce = "2015-10-26 04:53:49 EDT";
$secret = "mkdaklmdflfkdsmaflkdmsfdkasmfdsmflks";
$req = array();
$req['t'] = $nonce;
$req['secret'] = $secret;
$post_data = json_encode($req);
$post_data = bin2hex($post_data);
$sign = hash_hmac("sha256", $post_data, $secret);
print($sign);
?>
Python 3 Code
import json
import hmac
import binascii
import hashlib
nonce = "2015-10-26 04:53:49 EDT"
secret = "mkdaklmdflfkdsmaflkdmsfdkasmfdsmflks"
payload = {}
payload["t"] = nonce
payload["secret"] = secret
payload_json = json.dumps(payload)
post_data = binascii.b2a_hex(payload_json.encode('utf-8'))
sign = hmac.new(bytes(secret, "utf-8"), post_data, hashlib.sha256).hexdigest()
print(sign)
基于使用PHP的成功请求,我的签名应该是:
'c30ddc5878ff7b1a9b1c9078ccbdc38afef25ed510681a3d3bfc56f6c9e2f26a'
我得到的是:
'f9fc8749389137252e7f207468d88a5c871110403ec533496720efd715541ec2'
任何帮助排除这个问题,我将非常感激,因为我是新的Python
。
你的问题是默认情况下,Python在JSON字符串中插入空格。PHP json_encode($req)的输出:
{"t":"2015-10-26 04:53:49 EDT","secret":"mkdaklmdflfkdsmaflkdmsfdkasmfdsmflks"}
Python json.dumps(payload)输出:
{"t": "2015-10-26 04:53:49 EDT", "secret": "mkdaklmdflfkdsmaflkdmsfdkasmfdsmflks"}
你可以通过指定分隔符来修复这个问题,例如:
json.dumps(payload, separators=(',', ':'))
另外,您可以通过使用OrderedDict而不是普通字典来控制元素的顺序:
from collections import OrderedDict
payload = OrderedDict()