作者:互联网 时间: 2026-08-09 13:40:01
Stripe 技能通过托管 OAuth 网关在 AI 智能体和 Stripe 生态系统之间提供了一个坚实的桥梁。开发人员无需手动处理复杂的令牌刷新和敏感凭据,而是可以利用 Openclaw Skills 通过安全代理与客户、产品和发票进行交互。这种集成简化了财务工作流的实现,允许智能体以最小的配置处理支付和管理定期计费,同时保持高安全标准。
下载入口:https://github.com/openclaw/skills/tree/main/skills/byungkyu/stripe-api从源直接安装技能的最快方式。
npx clawhub@latest install stripe-api
将技能文件夹复制到以下位置之一
全局模式~/.openclaw/skills/
工作区
<project>/skills/
优先级:工作区 > 本地 > 内置
将此提示词复制到 OpenClaw 即可自动安装。
请帮我使用 Clawhub 安装 stripe-api。如果尚未安装 Clawhub,请先安装(npm i -g clawhub)。
首先,将您的 API 密钥设置为环境变量:
export MATON_API_KEY="YOUR_API_KEY"
接下来,创建一个新的 Stripe 连接以接收授权 URL:
curl -X POST https://ctrl.maton.ai/connections r
-H "Authorization: Bearer $MATON_API_KEY" r
-H "Content-Type: application/json" r
-d '{"app": "stripe"}'
在浏览器中打开响应中返回的 URL 以完成 OAuth 流程。激活后,您可以开始向网关 https://gateway.maton.ai/stripe/v1/ 发起请求。
该技能利用了原生的 Stripe 对象模型。所有金额均以最小货币单位处理(例如,美元为分)。
| 资源 | 前缀 | 描述 |
|---|---|---|
| 客户 | cus_ |
存储用户资料和信息。 |
| 产品 | prod_ |
定义待售商品或服务。 |
| 价格 | price_ |
设置成本和计费周期。 |
| 订阅 | sub_ |
跟踪定期计费周期。 |
| 发票 | in_ |
记录付款请求。 |
| 收款 | ch_ |
代表单次资金变动。 |
注意:所有 POST 请求必须格式化为 application/x-www-form-urlencoded。
name: stripe
description: |
Stripe API integration with managed OAuth. Manage customers, subscriptions, invoices, products, prices, and payments.
Use this skill when users want to process payments, manage billing, or handle subscriptions with Stripe.
For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
Requires network access and valid Maton API key.
metadata:
author: maton
version: "1.0"
clawdbot:
emoji: ??
homepage: "https://maton.ai"
requires:
env:
- MATON_API_KEY
Access the Stripe API with managed OAuth authentication. Manage customers, subscriptions, invoices, products, prices, and process payments.
# List customers
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/stripe/v1/customers?limit=10')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
https://gateway.maton.ai/stripe/{native-api-path}
Replace {native-api-path} with the actual Stripe API endpoint path. The gateway proxies requests to api.stripe.com and automatically injects your OAuth token.
All requests require the Maton API key in the Authorization header:
Authorization: Bearer $MATON_API_KEY
Environment Variable: Set your API key as MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
Manage your Stripe OAuth connections at https://ctrl.maton.ai.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=stripe&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'stripe'}).encode()
req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Response:
{
"connection": {
"connection_id": "c3c82a73-4c86-4c73-8ebd-1f325212fde6",
"status": "ACTIVE",
"creation_time": "2026-02-01T06:04:02.431819Z",
"last_updated_time": "2026-02-10T22:40:01.061825Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "stripe",
"metadata": {}
}
}
Open the returned url in a browser to complete OAuth authorization.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple Stripe connections, specify which one to use with the Maton-Connection header:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/stripe/v1/customers')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', 'c3c82a73-4c86-4c73-8ebd-1f325212fde6')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If omitted, the gateway uses the default (oldest) active connection.
All Stripe API endpoints follow this pattern:
/stripe/v1/{resource}
GET /stripe/v1/balance
Response:
{
"object": "balance",
"available": [
{
"amount": 0,
"currency": "usd",
"source_types": {"card": 0}
}
],
"pending": [
{
"amount": 5000,
"currency": "usd",
"source_types": {"card": 5000}
}
]
}
GET /stripe/v1/balance_transactions?limit=10
GET /stripe/v1/customers?limit=10
Query Parameters:
| Parameter | Description |
|---|---|
limit |
Number of results (1-100, default: 10) |
starting_after |
Cursor for pagination |
ending_before |
Cursor for reverse pagination |
email |
Filter by email |
created |
Filter by creation date |
Response:
{
"object": "list",
"data": [
{
"id": "cus_TxKtN8Irvzx9BQ",
"object": "customer",
"email": "[email protected]",
"name": null,
"balance": 0,
"currency": "usd",
"created": 1770765579,
"metadata": {}
}
],
"has_more": true,
"url": "/v1/customers"
}
GET /stripe/v1/customers/{customer_id}
POST /stripe/v1/customers
Content-Type: application/x-www-form-urlencoded
[email protected]&name=John%20Doe&metadata[user_id]=123
POST /stripe/v1/customers/{customer_id}
Content-Type: application/x-www-form-urlencoded
name=Jane%20Doe&[email protected]
DELETE /stripe/v1/customers/{customer_id}
GET /stripe/v1/products?limit=10
Query Parameters:
| Parameter | Description |
|---|---|
active |
Filter by active status |
type |
Filter by type: good or service |
Response:
{
"object": "list",
"data": [
{
"id": "prod_TthCLBwTIXuzEw",
"object": "product",
"active": true,
"name": "Premium Plan",
"description": "Premium subscription",
"type": "service",
"created": 1769926024,
"metadata": {}
}
],
"has_more": true
}
GET /stripe/v1/products/{product_id}
POST /stripe/v1/products
Content-Type: application/x-www-form-urlencoded
name=Premium%20Plan&description=Premium%20subscription&type=service
POST /stripe/v1/products/{product_id}
Content-Type: application/x-www-form-urlencoded
name=Updated%20Plan&active=true
DELETE /stripe/v1/products/{product_id}
GET /stripe/v1/prices?limit=10
Query Parameters:
| Parameter | Description |
|---|---|
active |
Filter by active status |
product |
Filter by product ID |
type |
Filter: one_time or recurring |
currency |
Filter by currency |
Response:
{
"object": "list",
"data": [
{
"id": "price_1SvtoVDfFKJhF88gKJv2eSmO",
"object": "price",
"active": true,
"currency": "usd",
"product": "prod_TthCLBwTIXuzEw",
"unit_amount": 1999,
"recurring": {
"interval": "month",
"interval_count": 1
},
"type": "recurring"
}
],
"has_more": true
}
GET /stripe/v1/prices/{price_id}
POST /stripe/v1/prices
Content-Type: application/x-www-form-urlencoded
product=prod_XXX&unit_amount=1999¤cy=usd&recurring[interval]=month
POST /stripe/v1/prices/{price_id}
Content-Type: application/x-www-form-urlencoded
active=false
GET /stripe/v1/subscriptions?limit=10
Query Parameters:
| Parameter | Description |
|---|---|
customer |
Filter by customer ID |
price |
Filter by price ID |
status |
Filter: active, canceled, past_due, etc. |
Response:
{
"object": "list",
"data": [
{
"id": "sub_1SzQDXDfFKJhF88gf72x6tDh",
"object": "subscription",
"customer": "cus_TxKtN8Irvzx9BQ",
"status": "active",
"current_period_start": 1770765579,
"current_period_end": 1773184779,
"items": {
"data": [
{
"id": "si_TxKtFWxlUW50cR",
"price": {
"id": "price_1RGbXsDfFKJhF88gMIShAq9m",
"unit_amount": 0
},
"quantity": 1
}
]
}
}
],
"has_more": true
}
GET /stripe/v1/subscriptions/{subscription_id}
POST /stripe/v1/subscriptions
Content-Type: application/x-www-form-urlencoded
customer=cus_XXX&items[0][price]=price_XXX
POST /stripe/v1/subscriptions/{subscription_id}
Content-Type: application/x-www-form-urlencoded
items[0][id]=si_XXX&items[0][price]=price_YYY
DELETE /stripe/v1/subscriptions/{subscription_id}
GET /stripe/v1/invoices?limit=10
Query Parameters:
| Parameter | Description |
|---|---|
customer |
Filter by customer ID |
subscription |
Filter by subscription ID |
status |
Filter: draft, open, paid, void, uncollectible |
Response:
{
"object": "list",
"data": [
{
"id": "in_1SzQDXDfFKJhF88g3nh4u2GS",
"object": "invoice",
"customer": "cus_TxKtN8Irvzx9BQ",
"amount_due": 0,
"amount_paid": 0,
"currency": "usd",
"status": "paid",
"subscription": "sub_1SzQDXDfFKJhF88gf72x6tDh",
"hosted_invoice_url": "https://invoice.stripe.com/...",
"invoice_pdf": "https://pay.stripe.com/invoice/.../pdf"
}
],
"has_more": true
}
GET /stripe/v1/invoices/{invoice_id}
POST /stripe/v1/invoices
Content-Type: application/x-www-form-urlencoded
customer=cus_XXX
POST /stripe/v1/invoices/{invoice_id}/finalize
POST /stripe/v1/invoices/{invoice_id}/pay
POST /stripe/v1/invoices/{invoice_id}/void
GET /stripe/v1/charges?limit=10
Query Parameters:
| Parameter | Description |
|---|---|
customer |
Filter by customer ID |
payment_intent |
Filter by payment intent |
Response:
{
"object": "list",
"data": [
{
"id": "ch_3SyXBvDfFKJhF88g1MHtT45f",
"object": "charge",
"amount": 5000,
"currency": "usd",
"customer": "cus_TuZ7GIjeZQOQ2m",
"paid": true,
"status": "succeeded",
"payment_method_details": {
"card": {
"brand": "mastercard",
"last4": "0833"
},
"type": "card"
}
}
],
"has_more": true
}
GET /stripe/v1/charges/{charge_id}
POST /stripe/v1/charges
Content-Type: application/x-www-form-urlencoded
amount=2000¤cy=usd&source=tok_XXX
GET /stripe/v1/payment_intents?limit=10
Response:
{
"object": "list",
"data": [
{
"id": "pi_3SyXBvDfFKJhF88g17PeHdpE",
"object": "payment_intent",
"amount": 5000,
"currency": "usd",
"customer": "cus_TuZ7GIjeZQOQ2m",
"status": "succeeded",
"payment_method": "pm_1SyXBpDfFKJhF88gmP3IjC8C"
}
],
"has_more": true
}
GET /stripe/v1/payment_intents/{payment_intent_id}
POST /stripe/v1/payment_intents
Content-Type: application/x-www-form-urlencoded
amount=2000¤cy=usd&customer=cus_XXX&payment_method_types[]=card
POST /stripe/v1/payment_intents/{payment_intent_id}/confirm
POST /stripe/v1/payment_intents/{payment_intent_id}/cancel
GET /stripe/v1/payment_methods?customer=cus_XXX&type=card
GET /stripe/v1/payment_methods/{payment_method_id}
POST /stripe/v1/payment_methods/{payment_method_id}/attach
Content-Type: application/x-www-form-urlencoded
customer=cus_XXX
POST /stripe/v1/payment_methods/{payment_method_id}/detach
GET /stripe/v1/coupons?limit=10
GET /stripe/v1/coupons/{coupon_id}
POST /stripe/v1/coupons
Content-Type: application/x-www-form-urlencoded
percent_off=25&duration=once
DELETE /stripe/v1/coupons/{coupon_id}
GET /stripe/v1/refunds?limit=10
GET /stripe/v1/refunds/{refund_id}
POST /stripe/v1/refunds
Content-Type: application/x-www-form-urlencoded
charge=ch_XXX&amount=1000
Stripe uses cursor-based pagination with starting_after and ending_before:
GET /stripe/v1/customers?limit=10&starting_after=cus_XXX
Response includes:
{
"object": "list",
"data": [...],
"has_more": true,
"url": "/v1/customers"
}
Use the last item's ID as starting_after for the next page.
const response = await fetch(
'https://gateway.maton.ai/stripe/v1/customers?limit=10',
{
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
}
}
);
const data = await response.json();
console.log(data.data);
import os
import requests
response = requests.get(
'https://gateway.maton.ai/stripe/v1/customers',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'},
params={'limit': 10}
)
data = response.json()
for customer in data['data']:
print(f"{customer['id']}: {customer['email']}")
application/x-www-form-urlencoded for POST requests (not JSON)cus_ (customers), prod_ (products), price_ (prices), sub_ (subscriptions), in_ (invoices), ch_ (charges), pi_ (payment intents)curl -g when URLs contain brackets to disable glob parsingjq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments| Status | Meaning |
|---|---|
| 400 | Bad request or invalid parameters |
| 401 | Invalid or missing Maton API key |
| 402 | Card declined or payment required |
| 404 | Resource not found |
| 429 | Rate limited |
| 500 | Stripe internal error |
MATON_API_KEY environment variable is set:echo $MATON_API_KEY
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
stripe. For example:https://gateway.maton.ai/stripe/v1/customershttps://gateway.maton.ai/v1/customers