You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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}&timestamp={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}&timestamp={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

火山引擎 最新活动