You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,它会自动处理所有参数编码、认证和错误处理,不用自己手动拼请求:

  1. 先安装SDK:
pip install stripe
  1. 使用示例:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:00:11