How to Integrate LangChain for payments with Stripe for production AI
LangChain for payments gives your agent a structured way to decide when a payment action should happen. Stripe handles the money movement, webhooks, and the audit trail you need in production.
The useful pattern is simple: let the LLM decide intent, then route that intent into a controlled payment workflow backed by Stripe. That gives you an AI agent that can quote, charge, refund, or verify payments without exposing raw payment logic to the model.
Prerequisites
- •Python 3.10+
- •A Stripe account with:
- •
STRIPE_SECRET_KEY - •webhook signing secret if you plan to verify events
- •
- •A LangChain setup with:
- •
langchain - •
langchain-openaior your preferred model provider
- •
- •A payment tool layer in your app that exposes safe actions like:
- •create checkout session
- •create payment intent
- •refund charge
- •Environment variables configured in
.env - •Basic understanding of:
- •Stripe PaymentIntents
- •webhook handling
- •tool calling in LangChain
Install the packages:
pip install langchain langchain-openai stripe python-dotenv
Integration Steps
- •
Initialize Stripe and your model client
Keep Stripe operations outside the model. The agent should call tools, not build API requests itself.
import os
from dotenv import load_dotenv
import stripe
load_dotenv()
stripe.api_key = os.environ["STRIPE_SECRET_KEY"]
- •
Create a Stripe payment tool
Wrap Stripe SDK calls in a normal Python function. In LangChain, expose that function as a tool so the agent can invoke it safely.
from langchain_core.tools import tool
@tool
def create_payment_intent(amount_cents: int, currency: str = "usd", customer_email: str = "") -> str:
"""
Create a Stripe PaymentIntent for a fixed amount.
"""
intent = stripe.PaymentIntent.create(
amount=amount_cents,
currency=currency,
receipt_email=customer_email or None,
automatic_payment_methods={"enabled": True},
metadata={
"source": "langchain_agent",
"customer_email": customer_email,
},
)
return f"payment_intent_id={intent.id}, client_secret={intent.client_secret}"
- •
Bind the tool to a LangChain chat model
Use
bind_tools()so the model can decide when to call the payment function.
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
tools = [create_payment_intent]
agent_llm = llm.bind_tools(tools)
- •
Run a tool-calling loop
This is the core integration. The model receives user intent, emits a tool call, and your code executes the Stripe operation.
from langchain_core.messages import HumanMessage, ToolMessage
messages = [
HumanMessage(content="Charge customer jane@example.com $49 for premium access.")
]
response = agent_llm.invoke(messages)
if response.tool_calls:
for call in response.tool_calls:
if call["name"] == "create_payment_intent":
result = create_payment_intent.invoke(call["args"])
messages.append(response)
messages.append(ToolMessage(content=result, tool_call_id=call["id"]))
final_response = agent_llm.invoke(messages)
print(final_response.content)
- •
Add webhook handling for payment confirmation
Don’t treat “created” as “paid.” Use Stripe webhooks to confirm success before unlocking access.
from flask import Flask, request, abort
app = Flask(__name__)
endpoint_secret = os.environ["STRIPE_WEBHOOK_SECRET"]
@app.route("/stripe/webhook", methods=["POST"])
def stripe_webhook():
payload = request.data
sig_header = request.headers.get("Stripe-Signature")
try:
event = stripe.Webhook.construct_event(
payload=payload,
sig_header=sig_header,
secret=endpoint_secret,
)
except Exception:
abort(400)
if event["type"] == "payment_intent.succeeded":
intent = event["data"]["object"]
print(f"Payment succeeded: {intent['id']}")
return "", 200
Testing the Integration
A practical test is to simulate an agent request and confirm it produces a valid Stripe PaymentIntent ID.
test_messages = [
HumanMessage(content="Create a $12 subscription payment for alex@example.com.")
]
test_response = agent_llm.invoke(test_messages)
print("Tool calls:", test_response.tool_calls)
Expected output:
Tool calls: [{'name': 'create_payment_intent', 'args': {'amount_cents': 1200, 'currency': 'usd', 'customer_email': 'alex@example.com'}, 'id': 'call_...'}]
If you want to verify end-to-end behavior against Stripe’s test mode, inspect the returned payment_intent_id in the dashboard and confirm webhook delivery after completing the payment flow with a test card.
Real-World Use Cases
- •
AI billing assistant
- •Let an agent answer pricing questions, generate invoices, and create PaymentIntents only after explicit user confirmation.
- •
Usage-based access control
- •Charge users before enabling premium workflows like document generation, KYC checks, or claims triage.
- •
Collections and refunds workflow
- •Build an internal ops agent that can identify failed payments, retry charges, or issue refunds through controlled tools.
The production rule here is straightforward: LangChain decides what action is needed, Stripe executes money movement, and your application owns policy enforcement. Keep those boundaries tight and you get an AI payment system that is auditable, testable, and safe enough for real workloads.
Keep learning
- •The complete AI Agents Roadmap — my full 8-step breakdown
- •Free: The AI Agent Starter Kit — PDF checklist + starter code
- •Work with me — I build AI for banks and insurance companies
By Cyprian Aarons, AI Consultant at Topiax.
Want the complete 8-step roadmap?
Grab the free AI Agent Starter Kit — architecture templates, compliance checklists, and a 7-email deep-dive course.
Get the Starter Kit