Python集成Stripe支付时Metadata参数报错的解决咨询
解决Stripe API中metadata参数的"Invalid hash"错误
嘿,我一眼就看出问题所在啦!你遇到的这个错误,根源是requests库默认的表单编码方式不支持直接传递嵌套字典类型的参数。
错误原因详解
当你把metadata作为字典传入requests.post的data参数时,requests会把这个嵌套字典转换成不符合Stripe API要求的字符串格式(比如变成metadata={'data': 'data'}这种原始字符串),Stripe的服务器无法识别这种格式的嵌套参数,所以返回了"Invalid hash"的错误。
虽然Stripe文档确实支持metadata参数,但它要求嵌套参数必须用表单键值对的嵌套写法(比如metadata[data]),或者你直接发送JSON格式的请求体。
两种解决方法
方法1:使用表单嵌套键名传递metadata
把metadata字典拆成metadata[key]格式的键值对,这样requests就能正确编码成Stripe接受的表单格式:
import requests import json url = "https://api.stripe.com/v1/sources" headers = {'AUTHORIZATION': 'Bearer sk_test_NXht3wZpuYWRIWpMDDqT3RG2'} data = { 'type': 'alipay', 'owner[email]': 'abc@xyz.com', 'redirect[return_url]': 'https://www.google.com', 'amount': '500', 'currency': 'USD', # 把嵌套字典改成这种表单嵌套键名的格式 'metadata[data]': 'data' } # 建议把请求结果存成变量,避免重复发送两次请求 response = requests.post(url, data=data, headers=headers) print(json.loads(response.text))
方法2:发送JSON格式的请求体
直接用requests.post的json参数(会自动设置Content-Type: application/json),这样可以直接传递嵌套字典,Stripe能正确解析:
import requests import json url = "https://api.stripe.com/v1/sources" headers = { 'AUTHORIZATION': 'Bearer sk_test_NXht3wZpuYWRIWpMDDqT3RG2', # 手动设置Content-Type也可以,不过用json参数会自动加 'Content-Type': 'application/json' } data = { 'type': 'alipay', 'owner[email]': 'abc@xyz.com', 'redirect[return_url]': 'https://www.google.com', 'amount': '500', 'currency': 'USD', # 这里可以直接用嵌套字典 'metadata': { 'data': 'data' } } response = requests.post(url, json=data, headers=headers) print(json.loads(response.text))
额外建议:使用Stripe官方Python SDK
其实更省心的方式是用Stripe官方提供的Python SDK,它会自动处理所有参数编码、认证和错误处理,不用自己手动拼请求:
- 先安装SDK:
pip install stripe
- 使用示例:
import stripe stripe.api_key = "sk_test_NXht3wZpuYWRIWpMDDqT3RG2" source = stripe.Source.create( type="alipay", owner={"email": "abc@xyz.com"}, redirect={"return_url": "https://www.google.com"}, amount=500, currency="usd", metadata={"data": "data"} ) print(source)
这样就完全不用操心参数格式的问题啦!
内容的提问来源于stack exchange,提问作者user_123
相关产品推荐
相关产品推荐

