Как создать Flask-Stripe Checkout и Charge для нескольких предметов - PullRequest
0 голосов
/ 02 июля 2019

Я строю интеграцию с Stripe, следуя примерам в его документации, но не могу понять, как создать Charge для более чем одного продукта.

Я просматривал все документы Stripe иискал какие-либо статьи / форумы о подобной проблеме, но не смог ничего найти.Я был бы очень признателен за ссылки на статьи по этому вопросу или за советы, которые помогут мне понять, как ее решить.

Вот код на стороне сервера:

```python
@app.route("/checkout", methods=["GET", "POST"])
def checkout():
    if request.method == "POST":
        # Process a JSON string with a checkout information:
        # { item_id: item_quantity, ... }
        # Build the SQL query based on it
        items = {}
        shopping_cart = request.form["cart_checkout"]
        shopping_cart = shopping_cart.lstrip("{")
        shopping_cart = shopping_cart.rstrip("}")
        shopping_cart = shopping_cart.split(",")
        sqlQuery = "SELECT * FROM Items WHERE item_id IN ("
        for KeyValPair in shopping_cart:
            Key = KeyValPair.split(":")[0]
            Key = Key.strip('"')
            sqlQuery = sqlQuery + Key + ","
            Value = KeyValPair.split(":")[1]
            items[Key] = Value
        sqlQuery = sqlQuery.rstrip(",")
        sqlQuery = sqlQuery + ") ORDER BY item_id ASC"
        cart_items = sql_select(sqlQuery)

        # Add a column about the quantity of items
        for item in cart_items:
            item["quantity"] = items[item["item_id"]]

        # Build a Stripe checkout list
        line_items_list = []
        for item in cart_items:
            line_item = {}
            line_item["name"] = item["item_name"]
            line_item["description"] = item["item_description"]
            line_item["amount"] = item["price"]
            line_item["currency"] = "usd"
            line_item["quantity"] = item["quantity"]
            line_items_list.append(dict(line_item))

        stripe_session = stripe.checkout.Session.create(
            submit_type="pay",
            payment_method_types=["card"],
            line_items=line_items_list,
            success_url='https://example.com/success',
            cancel_url='https://example.com/cancel',
        )

        return render_template("checkout.html",
            stripe_id=stripe_session.id,
            stripe_pk=stripe_keys["PUBLIC_KEY"])

    return redirect("/")
```

И вот часть HTML-шаблона:

```html
<form action="/checkout" method="post" id="form_checkout" onsubmit="return cart_info()"
    ...
    <input type="hidden" name="cart_checkout" id="checkout_info" value="{{ cart_checkout }}">
    <script
        src="https://checkout.stripe.com/checkout.js" class="stripe-button"
        data-key="{{ stripe_pk }}"
        data-name="Company Name"
        data-image="https://stripe.com/img/documentation/checkout/marketplace.png"
        data-description="A description of the product or service being purchased"
        data-amount="999"
        data-shipping-address="true"
        data-zip-code="true"
        data-allow-remember-me="true"
        data-panel-label="Pay"
        data-label="Checkout"
        data-locale="auto">
    </script>
</form>
```

Если я сделаю простой пример Charge из документов Stripe, как это:

```python
@app.route('/charge', methods=['POST'])
def charge():
    # Amount in cents
    amount = 500

    customer = stripe.Customer.create(
        email='customer@example.com',
        source=request.form['stripeToken']
    )

    charge = stripe.Charge.create(
        customer=customer.id,
        amount=amount,
        currency='usd',
        description='Flask Charge'
    )

    return render_template('charge.html', amount=amount)
```

Тогда я могу создать без каких-либо проблем успешныйtest Charge, он отображается с меткой успеха на панели инструментов моей Stripe.Если я использую stripe.checkout.Session.create, приборная панель Stripe правильно создает неполную запись о моем сеансе Checkout с выбранным списком элементов, но я не знаю, как действовать дальше, чтобы завершить Charge для них.

1 Ответ

0 голосов
/ 04 июля 2019

Как часто случается, когда я начинаю задавать вопросы, я в конечном итоге нахожу ответы самостоятельно, смеется.У меня был шаблон "checkout.html", но он не работал, и никаких ошибок не отображалось, поэтому я предположил, что мне не хватает еще некоторого кода, необходимого для его работы.

Как оказалось, всеЯ скучал, был "" в строке кода.Вот рабочий сеанс Checkout с добавлением немного JavaScript:

{% extends "layout.html" %}

{% block title %}Checkout{% endblock %}

{% block head %}
    <script src="https://js.stripe.com/v3/"></script>
{% endblock %}

{% block main %}

    <!-- Main content -->
    <div class="wrapper main-content">

        {% with messages = get_flashed_messages(with_categories=true) %}
            {% for category, message in messages %}
                <div class="alert alert-{{ category }}">{{ message }}</div>
            {% endfor %}
        {% endwith %}

        <h2 class="section-header">Checkout</h2>

        <p id="result_msg"></p>

        <button onclick="checkout()">Checkout</button>

    </div>

    <script type="text/javascript">
        function checkout() {
            var stripe = Stripe("{{ stripe_pk }}");

            stripe.redirectToCheckout({
                // Make the id field from the Checkout Session creation API response
                // available to this file, so you can provide it as parameter here
                // instead of the {{CHECKOUT_SESSION_ID}} placeholder.
                sessionId: "{{CHECKOUT_SESSION_ID}}"
            }).then(function (result) {
                // If `redirectToCheckout` fails due to a browser or network
                // error, display the localized error message to your customer
                // using `result.error.message`.
                document.getElementById("result_msg").innerHTML = result.error.message;
            });
        }
    </script>

{% endblock %}
...