如何用Python正确调用Steam InitTxn接口?orderid参数缺失问题求解
Steam微交易InitTxn接口调用问题及解决方法
问题背景
为Steam平台游戏开发内购功能,服务器基于Python 3实现,调用InitTxn接口时始终收到Required parameter 'orderid' is missing错误,尽管参数已按要求传入。
第一次尝试:参数放在URL中(POST请求)
代码实现:
conn = http.client.HTTPSConnection("partner.steam-api.com") orderid = uuid.uuid4().int & (1<<64)-1 print("orderid = ", orderid) key = "xxxxxxxxxxxxxxxxxxx" # 出于安全考虑隐藏 steamid = "xxxxxxxxxxxxxxxxxxx" # 出于安全考虑隐藏 pid = "testItem1" appid = "480" itemcount = 1 currency = 'CNY' amount = 350 description = 'testing_description' urlSandbox = "/ISteamMicroTxnSandbox/" s = f'{urlSandbox}InitTxn/v3/?key={key}&orderid={orderid}&appid={appid}&steamid={steamid}&itemcount={itemcount}¤cy={currency}&itemid[0]={pid}&qty[0]={1}&amount[0]={amount}&description[0]={description}' print("s = ", s) conn.request('POST', s) r = conn.getresponse() print("InitTxn result = ", r.read())
生成的请求URL:
s = /ISteamMicroTxnSandbox/InitTxn/v3/?key=xxxxxxx&orderid=11506775749761176415&appid=480&steamid=xxxxxxxxxxxx&itemcount=1¤cy=CNY&itemid[0]=testItem1&qty[0]=1&amount[0]=350&description[0]=testing_description
错误响应:
InitTxn result = b"<html><head><title>Bad Request</title></head><body><h1>Bad Request</h1>Required parameter 'orderid' is missing</body></html>"
补充说明:采用相同参数传递方式调用GetUserInfo接口(改为GET请求)可正常工作。
第二次尝试:参数放在POST请求体中
调整后的代码:
params = { 'key': key, 'orderid': orderid, 'appid': appid, 'steamid': steamid, 'itemcount': itemcount, 'currency': currency, 'pid': pid, 'qty[0]': 1, 'amount[0]': amount, 'description[0]': description } s = urllib.parse.urlencode(params) # 控制台输出:s = key=xxxxx&orderid=9231307508782239594&appid=480&steamid=xxx&itemcount=1¤cy=CNY&pid=testItem1&qty%5B0%5D=1&amount%5B0%5D=350&description%5B0%5D=testing_description print("s = ", s) conn.request('POST', url=f'{urlSandbox}InitTxn/v3/', body=s)
仍收到相同错误:Required parameter 'orderid' is missing
解决方法
问题核心是POST请求未设置正确的Content-Type头,同时存在参数名错误,修正后即可正常调用:
import http.client import uuid import urllib.parse conn = http.client.HTTPSConnection("partner.steam-api.com") orderid = uuid.uuid4().int & (1<<64)-1 key = "xxxxxxxxxxxxxxxxxxx" steamid = "xxxxxxxxxxxxxxxxxxx" pid = "testItem1" appid = "480" itemcount = 1 currency = 'CNY' amount = 350 description = 'testing_description' urlSandbox = "/ISteamMicroTxnSandbox/" params = { 'key': key, 'orderid': orderid, 'appid': appid, 'steamid': steamid, 'itemcount': itemcount, 'currency': currency, 'itemid[0]': pid, # 修正参数名:接口要求为itemid[0]而非pid 'qty[0]': 1, 'amount[0]': amount, 'description[0]': description } encoded_params = urllib.parse.urlencode(params) # 必须设置Content-Type头,确保服务器正确解析请求体 headers = { 'Content-Type': 'application/x-www-form-urlencoded' } conn.request('POST', f'{urlSandbox}InitTxn/v3/', body=encoded_params, headers=headers) r = conn.getresponse() print("InitTxn result = ", r.read())
关键修复点:
- 添加
Content-Type: application/x-www-form-urlencoded请求头,Steam服务器依赖该头解析POST请求体中的参数 - 修正参数名:将
pid改为接口要求的itemid[0],避免参数无法被识别
内容的提问来源于stack exchange,提问作者ArtS
相关产品推荐
相关产品推荐

