如何为多个项目创建Flask-Stripe Checkout和Charge

时间:2019-07-02 12:05:56

标签: javascript python html flask stripe-payments

我正在按照Stripe文档中的示例构建与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>
```

如果我从Stripe文档中做一个简单的Charge示例,就像这样:

```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)
```

然后,我可以毫无问题地创建成功的测试费用,它会在Stripe的仪表板上显示成功标签。如果我使用stripe.checkout.Session.create,则Stripe仪表板会使用选定的项目列表正确创建有关Checkout会话的不完整记录,但是我不知道如何从那里继续为它们确定费用。

1 个答案:

答案 0 :(得分:0)

通常,当我开始提问时,我最终会自己找到答案,哈哈。我有一个"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 %}