我需要将一些现有的 PHP 代码转换为 Python。此作业连接到重力表并查询某些数据。为了进行查询,必须计算签名以验证连接。
Gravity Forms web api 提供了很好的 PHP 指导 here .
PHP方法如下:
function calculate_signature( $string, $private_key ) {
$hash = hash_hmac( 'sha1', $string, $private_key, true );
$sig = rawurlencode( base64_encode( $hash ) );
return $sig;
}
根据自己对Python的理解,以及php2python.com上关于hash-hmac和rawurlencoded的资料,我写下了:
import hmac, hashlib, urllib, base64
def calculate_signature(string, private_key):
hash_var = hmac.new(private_key, string, hashlib.sha1).digest()
sig = urllib.quote(base64.b64encode(hash_var))
return sig
但是,这两个签名并不等同,因此 Gravity Forms 返回 HTTP 403:错误请求响应。
我的翻译中是否遗漏了什么?
更新 (11/04/15)
我现在已经匹配了我的 php 和 python url。但是,我仍然收到 403 错误。
请您参考如下方法:
php 和 python 签名不匹配的原因与它们的 calculate_signature() 方法无关。
问题是由不同的 expires 变量引起的。 Php 使用了 strtotime("+60 mins") 导致了从现在开始 60 分钟的 UTC 时间。而 Python 使用 datetime.date.now() + timedelta(minutes=60)。这也是从现在起 60 分钟,但在您当前的时区。
我一直想在 UTC 中计算 expire 变量,所以我用 datetime.datetime.utcnow() + timedelta(minutes=60) 替换了我的 Python 计算。
