Shopee API沙箱环境下使用正确测试Partner ID与Partner Key仍返回error_sign错误
Shopee API沙箱环境下使用正确测试Partner ID与Partner Key仍返回error_sign错误
我之前在对接Shopee沙箱API时也碰到过一模一样的签名错误问题,折腾了好一会儿才找到问题所在,结合官方文档和踩过的坑,给你几个核心排查和修复方向:
1. 核心问题:Partner Key需要去掉shpk前缀
你提到看到旧帖里的Partner Key不带shpk前缀,这正是关键!Shopee开发者控制台给的测试Partner Key是带shpk标识的,但实际计算签名时必须去掉这个前缀,只保留后面的字符串部分。
比如你的代码里:
tmp = "shpk7262645a54484f5375737a427378534a4f74715449414f..." partner_key = tmp.encode()
要改成:
tmp = "shpk7262645a54484f5375737a427378534a4f74715449414f..." # 去掉前4个字符的shpk前缀 partner_key = tmp[4:].encode()
2. 确保Base String拼接的正确性
Shopee的签名规则要求Base String是partner_id + path + timestamp的拼接,这里要注意两个细节:
- Partner ID必须转成字符串类型:如果你的
partner_id是数字(比如117...),直接拼接可能会有隐式类型转换问题,建议显式转成字符串:str(partner_id) - Timestamp必须是秒级Unix时间戳:你用
int(time.time())是对的,但要确保本地时间和Shopee服务器时间差在±5分钟内,否则签名会被判无效
修正后的Base String拼接代码:
tmp_base_string = f"{str(partner_id)}{path}{str(timest)}" base_string = tmp_base_string.encode()
3. Redirect URL需要URL编码
Shopee要求redirect参数必须是URL编码后的字符串,否则可能会导致签名计算时的参数不匹配。你可以用urllib.parse.quote来处理:
import urllib.parse redirect_url_encoded = urllib.parse.quote(redirect_url) # 然后拼接到URL中 url = f"{host}{path}?partner_id={partner_id}×tamp={timest}&sign={sign}&redirect={redirect_url_encoded}"
完整修正后的代码示例
import hmac import json import time import requests import hashlib import urllib.parse def shop_auth(): timest = int(time.time()) host = "https://partner.test-stable.shopeemobile.com" path = "/api/v2/shop/auth_partner" redirect_url = "https://www.baidu.com/" # 确保Partner ID为字符串类型 partner_id = str(117...) # 去掉shpk前缀后转成字节 tmp_key = "shpk7262645a54484f5375737a427378534a4f74715449414f..." partner_key = tmp_key[4:].encode() # 正确拼接Base String tmp_base_string = f"{partner_id}{path}{str(timest)}" base_string = tmp_base_string.encode() print("base String:" + tmp_base_string) # 生成签名 sign = hmac.new(partner_key, base_string, hashlib.sha256).hexdigest() # 编码redirect URL redirect_url_encoded = urllib.parse.quote(redirect_url) # 拼接完整请求URL url = f"{host}{path}?partner_id={partner_id}×tamp={timest}&sign={sign}&redirect={redirect_url_encoded}" print(url) # 发起请求验证 response = requests.get(url) print("Response:", response.json()) shop_auth()
额外验证步骤
修改后可以先打印处理后的Partner Key和Base String,确认和官方文档里的示例格式一致。如果还是有问题,可以用Shopee官方提供的签名校验工具(开发者控制台内可找到)来核对你生成的签名是否正确。
内容来源于stack exchange




