Stripe API;如何在切换页面时传递参数?

时间:2018-04-16 05:30:40

标签: python flask stripe-payments

我正在使用Flask使用Stripe API。我想知道如何在切换页面时传递参数,就像我使用redirect(url_for(''))一样, 例如,

@app.route('/charge', methods=['POST'])
def charge():

    amount= #Amount in cents

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

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

当我完成输入卡片信息后,页面将切换到其他页面并创建令牌。现在我想从上一页获得金额作为参数。但是在使用Stripe API时我不知道该怎么做。

通常,我可以像这样的回答那样做 redirect while passing arguments

我该怎么做?

我试过第一个人的方式,但它没有用。

上一页是这样的 在此页面上,用户将通过条纹签出窗口输入他们的卡片信息,输入后,它会重定向到charge页面。

@app.route('/checkout', methods=['GET'])
def checkout():
    item_id = request.args['item_id']
    item = Item.query.filter_by(id=item_id).first()
    return redirect(url_for('charge', item_id=item_id), code=307)
    return render_template('checkout.html', title='Check Out',key=stripe_keys['publishable_key'], item=item)

当我进入此页面时 Bad Request The browser (or proxy) sent a request that this server could not understand. 此错误消息显示在页面上。

1 个答案:

答案 0 :(得分:2)

解决方案如下:

from flask import Flask, request 

@app.route('/previouspage/', methods=['GET'])
def previous_page():
   item = Item.query.filter_by(id=item_id).first()
   redirect(url_for('charge', amount=item.price), code=307)


@app.route('/charge/<amount>', methods=['GET', 'POST'])
def charge(amount):

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

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

但是,避免在URls中传递路径变量的更正确的方法是使用查询字符串(例如,charge?amount = 10.0)。像这样:

@app.route('/previouspage/', methods=['GET'])
def previous_page():
    item = Item.query.filter_by(id=item_id).first()
    return redirect(url_for('charge', amount=item.price), code=307)


@app.route('/charge', methods=['GET', 'POST'])
def charge():
    amount = request.args.get('amount')
    customer = stripe.Customer.create(
            email='customer@example.com',
            source=request.form['stripeToken']
            )

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

请注意,这两种方法都不安全,因为有人可以更改网址中的价格。所以更好的是你应该只传递Item ID并在/charge中获取项目。像这样:

@app.route('/previouspage/', methods=['GET'])
def previous_page():
    return redirect(url_for('charge', item_id=item_id), code=307)


@app.route('/charge', methods=['GET', 'POST'])
def charge():
    amount = request.args.get('item_id')
    item = Item.query.filter_by(id=item_id).first()
    if not item:
        return '....some kind of error'

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

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