#python #flask #stripe-payments
#python #flask #stripe-платежи
Вопрос:
У меня есть простой сайт flask, который подключен к скрипту набора номера на python. Он вызовет номер телефона, который вы вводите на домашней странице, и подключится к вашему номеру телефона вместе с некоторыми другими вещами. Как мне передать номер телефона, по которому клиент пытается позвонить, через процесс оформления заказа Stripe?
В настоящее время у меня есть общая информация о домашней странице клиента в базе данных, и она передается по различным маршрутам через URL, например site.com/subit/userID1234 . Сайт работает, но я не уверен, как передать эти переменные через процесс проверки Stripe.
Я пытаюсь перейти из /stripe_purchase_page/ в /webhook/
#STRIPE
@app.route('/stripe_purchase_page/<uniqueID>')
def stripePurchasePage(uniqueID):
render_template('stripe_redirect_test.html')
stripe_keys = {
"secret_key": os.environ["STRIPE_SECRET_KEY"],
"publishable_key": os.environ["STRIPE_PUBLISHABLE_KEY"],
"endpoint_secret": os.environ["STRIPE_ENDPOINT_SECRET"]
}
stripe.api_key = stripe_keys["secret_key"]
# @app.route("/")
# def index():
# return render_template("index.html")
@app.route("/config")
def get_publishable_key():
# customer = request.form['customer']
# print(customer)
stripe_config = {"publicKey": stripe_keys["publishable_key"]}
return jsonify(stripe_config)
@app.route("/create-checkout-session")
def create_checkout_session():
domain_url = "http://localhost:5000/"
stripe.api_key = stripe_keys["secret_key"]
try:
# Create new Checkout Session for the order
# Other optional params include:
# [billing_address_collection] - to display billing address details on the page
# [customer] - if you have an existing Stripe Customer ID
# [payment_intent_data] - lets capture the payment later
# [customer_email] - lets you prefill the email input in the form
# For full details see https:#stripe.com/docs/api/checkout/sessions/create
# ?session_id={CHECKOUT_SESSION_ID} means the redirect will have the session ID set as a query param
checkout_session = stripe.checkout.Session.create(
success_url=domain_url "success?session_id={CHECKOUT_SESSION_ID}",
cancel_url=domain_url "cancelled",
payment_method_types=["card"],
mode="payment",
line_items=[
{
"name": "T-shirt",
"quantity": 1,
"currency": "usd",
"amount": "2000",
}
]
)
return jsonify({"sessionId": checkout_session["id"]})
except Exception as e:
return jsonify(error=str(e)), 403
@app.route("/webhook", methods=['POST'])
def stripe_webhook():
payload = request.get_data(as_text=True)
sig_header = request.headers.get('Stripe-Signature')
try:
event = stripe.Webhook.construct_event(
payload, sig_header, stripe_keys["endpoint_secret"]
)
except ValueError as e:
# Invalid payload
return 'Invalid payload', 400
except stripe.error.SignatureVerificationError as e:
# Invalid signature
return 'Invalid signature', 400
# Handle the checkout.session.completed event
if event['type'] == 'checkout.session.completed':
session = event['data']['object']
# Fulfill the purchase...
handle_checkout_session(session)
return 'Success', 200
def handle_checkout_session(session):
print("Payment was successful.")
# run some custom code here with the Unique ID
Комментарии:
1. Вы нашли решение этой проблемы? Я сталкиваюсь с той же проблемой.
Ответ №1:
Добавьте свои переменные в метаданные, как указано в другом ответе, а затем в вашем успешном маршруте получите доступ к объекту сеанса stripe и изолируйте их в успешном маршруте.
checkout_session = stripe.checkout.Session.create(
client_reference_id=token,
success_url=domain_url "success?session_id={CHECKOUT_SESSION_ID}",
cancel_url=domain_url "cancelled",
payment_method_types=["card"],
mode="payment",
line_items=[
{
"name": "AICreated.Art - " str(param) " Credits",
"quantity": 1,
"currency": "usd",
"amount": amt,
}
],
metadata={
'user_id': 1234,
'token': 'abcdf'
}
И в вашем успешном маршруте, который запускается после webhook:
@app.route("/success")
def success():
sessions = stripe.checkout.Session.list()
print(sessions.data[00]) # tree view
data = {'username': sessions.data[00].metadata.user_id, 'token': sessions.data[00].metadata.token}
return render_template('home/success.html', data=data, title="Home")
Ответ №2:
Используйте metadata
параметр, см. Документацию по сеансу здесь . Этот параметр, docs here, доступен для всех обновляемых объектов Stripe.
Например, передача user_id
значения:
checkout_session = stripe.checkout.Session.create(
success_url=domain_url "success?session_id={CHECKOUT_SESSION_ID}",
cancel_url=domain_url "cancelled",
payment_method_types=["card"],
mode="payment",
line_items=[
{
"name": "T-shirt",
"quantity": 1,
"currency": "usd",
"amount": "2000",
}
],
metadata={
'user_id': 1234
}
)
Комментарии:
1.Как мне получить user_id для маршрута проверки?
@app.route('/stripe_purchase_page/<uniqueID>')
@app.route("/create-checkout-session")
Или это будет в Stripe javascript?document.querySelector("#submitBtn").addEventListener("click", () => { fetch("/create-checkout-session")
Ответ №3:
?session_id={CHECKOUT_SESSION_ID}"
также будет идентификатор сеанса проверки, так что вы сможете получить его из строки запроса на / по успешному URL.
Комментарии:
1. Мне нужно перенести информацию до создания сеанса проверки. Я пытаюсь получить идентификатор пользователя из формы, заполненной пользователем, прежде чем они пройдут Stripe.
2. Вы могли бы использовать stripe.com/docs/api/checkout/sessions /… вместо
Ответ №4:
Вы можете использовать сеансы для передачи переменных по разным маршрутам. Затем в маршруте проверки stripe вы сохраняете эту информацию в метаданных, чтобы вы могли использовать данные в маршруте webhook stripe следующим образом:
from flask import session
stripe_keys = {
"secret_key": os.environ["STRIPE_SECRET_KEY"],
"publishable_key": os.environ["STRIPE_PUBLISHABLE_KEY"],
"endpoint_secret": os.environ["STRIPE_ENDPOINT_SECRET"]
}
stripe.api_key = stripe_keys["secret_key"]
#STRIPE
@app.route('/stripe_purchase_page)
def stripePurchasePage():
# add unique id to session
session['unique_id'] = unique_id
render_template('stripe_redirect_test.html')
@app.route("/config")
def get_publishable_key():
# customer = request.form['customer']
# print(customer)
stripe_config = {"publicKey": stripe_keys["publishable_key"]}
return jsonify(stripe_config)
@app.route("/create-checkout-session")
def create_checkout_session():
domain_url = "http://localhost:5000/"
stripe.api_key = stripe_keys["secret_key"]
# Retrieve unique id from session and add to metadata
try:
checkout_session = stripe.checkout.Session.create(
success_url=domain_url "success?session_id={CHECKOUT_SESSION_ID}",
cancel_url=domain_url "cancelled",
payment_method_types=["card"],
mode="payment",
metadata={'unique_id': session['unique_id']},
line_items=[
{
"name": "T-shirt",
"quantity": 1,
"currency": "usd",
"amount": "2000",
}
]
)
return jsonify({"sessionId": checkout_session["id"]})
except Exception as e:
return jsonify(error=str(e)), 403
@app.route("/webhook", methods=['POST'])
def stripe_webhook():
payload = request.get_data(as_text=True)
sig_header = request.headers.get('Stripe-Signature')
try:
event = stripe.Webhook.construct_event(
payload, sig_header, stripe_keys["endpoint_secret"]
)
except ValueError as e:
# Invalid payload
return 'Invalid payload', 400
except stripe.error.SignatureVerificationError as e:
# Invalid signature
return 'Invalid signature', 400
# Handle the checkout.session.completed event
if event['type'] == 'checkout.session.completed':
session = event['data']['object']
# Fulfill the purchase...
handle_checkout_session(checkout_session)
return 'Success', 200
def handle_checkout_session(checkout_session):
print("Payment was successful.")
# get data from metadata and do whatever you want with it
unique_id = checkout_session['metadata'].get('unique_id')
# run some custom code here with the Unique ID