Sagepay(Opayo)对接Django:生成商户会话密钥MSK失败问题求助
问题根因
你代码的核心错误是requests.post的传参方式不符合接口要求:
params参数用于生成URL查询字符串(会把参数拼接到接口地址的?后面)- 而你参考的curl命令中
-d对应的是POST请求体参数,且要求为JSON格式,你把参数放错了位置才触发422错误。
修正方案
把requests.post的params=data改为json=data即可,requests的json参数会自动将Python字典序列化为JSON请求体,和curl命令的逻辑完全对齐。
修正后的代码如下:
import requests def BasketView(request): headers = { "Authorization": "Basic aEpZeHN3N0hMYmo0MGNCOHVkRVM4Q0RSRkxodUo4RzU0TzZyRHBVWHZFNmhZRHJyaWE6bzJpSFNyRnliWU1acG1XT1FNdWhzWFA1MlY0ZkJ0cHVTRHNocktEU1dzQlkxT2lONmh3ZDlLYjEyejRqNVVzNXU=", # 用json参数的话这个Content-Type头可以省略,requests会自动添加 "Content-type": "application/json", } data = {"vendorName": "sandbox"} # 把params改成json r = requests.post("https://pi-test.sagepay.com/api/v1/merchant-session-keys", headers=headers, json=data) # 可以打印r.text查看接口返回的具体内容,方便后续排查问题 print(r.status_code, r.text)
额外排查建议
如果修改后仍有异常,可以打印返回体的具体内容,Opayo的接口会在返回体里明确说明参数校验失败的具体原因。
内容的提问来源于stack exchange,提问作者Johnd90
相关产品推荐
相关产品推荐

