PHP API请求示例转Python后auth_hash校验错误如何解决
错误原因分析
- 签名拼接逻辑错误:PHP的
http_build_query会自动对参数键值做URL编码,你手动拼接key=value没有做编码,参数值含特殊字符(比如空格、符号)时签名串和服务端计算用的串不一致
- 签名拼接逻辑错误:PHP的
- POST请求体缺失业务参数:PHP逻辑是把原始业务参数+api_key+auth_hash+nonce所有字段一起作为POST提交,你的代码只提交了三个校验字段,业务参数根本没传给服务端,同时也导致服务端计算签名时用的参数和你本地签名用的不一致
- nonce格式不对:PHP的
explode(' ', microtime())[1]取的是整数秒级时间戳,time.time()返回的是带小数的浮点数,格式不匹配
- nonce格式不对:PHP的
正确Python实现代码
import hashlib import hmac import requests import time from urllib.parse import urlencode # 可选:关闭SSL警告 import urllib3 urllib3.disable_warnings() params = { 'name':'Matthew Jackson', 'state':'nj', 'zip':'034572', 'address':'14 Main Street', 'phone':'', 'dob':'' } def request_ss(url, params, api_key, secretKey): # 对原始业务参数做urlencode,生成签名用的串,和PHP http_build_query逻辑对齐 to_sign = urlencode(params) # 计算hmac sha512签名 sign = hmac.new( key=secretKey.encode('utf-8'), msg=to_sign.encode('utf-8'), digestmod=hashlib.sha512 ).hexdigest() # 合并所有字段到请求体 post_body = params.copy() post_body.update({ 'api_key': api_key, 'auth_hash': sign, 'nonce': str(int(time.time())) # 取整数秒时间戳,和PHP逻辑对齐 }) # 发起POST请求,关闭SSL校验和PHP配置对齐 r = requests.post(url, data=post_body, verify=False) return r.text # 调用示例 create_url = '替换为实际API地址' api_key = '替换为你的api_key' api_secret = '替换为你的api_secret' res = request_ss(create_url, params, api_key, api_secret) print(res)
内容的提问来源于stack exchange,提问作者Tomee
相关产品推荐
相关产品推荐

