Skip to main content
 首页 » 编程设计

php之重力形式签名——从 PHP 到 Python

2025年05月04日25jillzhang

我需要将一些现有的 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 计算。