Как вы переносите переменную, такую как userId, через процесс проверки Stripe в Flask?

#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