2017-08-01 57 views
-1

我試圖使用Python Flask和Stripe實現電子商務網站付款結帳頁面。我已經成功設置了Stripe;不過,我現在試圖添加一個「促銷代碼」功能,用戶可以在其中鍵入促銷代碼,點擊「應用促銷代碼」按鈕,然後將發送方法發送到我的後端,以便促銷代碼爲驗證。運行條紋<腳本src>僅在點擊某個按鈕時

不幸的是,我目前在我的HTML運行此腳本:

 <script src="https://checkout.stripe.com/checkout.js" class = "stripe-button" style = "" 
       data-key="{{ key }}" 
       data-description="" 
       data-amount="{{ amount }}" 
       data-locale="auto">   
     </script> 
     <script> 
     document.getElementsByClassName("stripe-button-el")[0].style.display = 'none'; 
    </script> 

這是什麼做的是運行的每一個檢測到POST請求的時間條紋結賬腳本。這是有問題的,因爲我的「應用促銷代碼」按鈕還會生成一個POST請求:

<div class="form-group"> 
          <div class="col-md-12" style = "margin-bottom: 10px"> 
          <input type="code" name="code" id="code" class="form-control" placeholder="Enter Code Here" style = "margin: 0 0 10px 0; border: solid 0.5px #0b3c5d; border-radius: 6px"> 
          </div> 
         </div> 

我的問題是:當檢測到的,而不是運行SRC每次腳本POST請求,我怎麼能運行該腳本SRC只有當點擊「確認訂單」按鈕並且沒有點擊「應用促銷代碼」按鈕?在Python中檢測request.form ['submit']值的常用方法不起作用,因爲Stripe腳本偵聽發佈請求並且不關心發佈請求的值。這裏是我的後端:

@app.route('/charge', methods=['GET', 'POST']) 
def charge(): 
if request.method == 'POST': 
    session.modified = True 
    if request.form.get('code') and not request.form['code'] == 'SAVE10MORE': 
     print('WRONG!') 
    customer = stripe.Customer.create(
     email = session['user'], 
     source = request.form['stripeToken'] 
    ) 

    charge = stripe.Charge.create(
     customer = customer.id, 
     amount = int(100 * (session['subtotal'] + session['tax'])), 
     currency = 'usd', 
     description = 'Payment' 
    ) 
    orders = mongo.db.orders 
    has_ordered = orders.find_one({'_id': session['user']}) 
    if has_ordered: 
     orders.update({'_id': session['user']}, 
         {'$set': 
          {'name': request.form['name'], 
          'dorm': request.form['dorm']}}) 
    else: 
     orders.insert({'_id': session['user'], 
         'name': request.form['name'], 
         'dorm': request.form['dorm']}) 
    for key, value in (session['customer']).iteritems(): 
     has_ordered = orders.find_one({'_id': session['user'], str(key): {'$exists': True}}) 
     total = int(value) 
     if has_ordered: 
      total += int(has_ordered[key]) 
     orders.update({'_id': session['user']}, 
         {'$set': 
          {key: total}}) 
    content = render_template('message.html', ordered = True) 
    send_mail('Your Order Summary', content, session['user'], True) 
    session['customer'] = {} 
    return redirect(url_for('index')) 
else: 
    try: 
     if g.user: 
      return render_template('charge.html', 
            key = stripe_keys['publishable_key'], 
            amount = int(100 * (session['subtotal'] + session['tax'])), 
            tax = session['tax'], 
            subtotal = session['subtotal'], 
            months = 2 * deliveries_remaining()) 
    except KeyError: 
     return redirect(url_for('shop')) 
    return redirect(url_for('login')) 

請讓我知道我可以停止運行該腳本SRC當我點擊某個按鈕!提前致謝!這將非常有幫助。

而且,我完整的HTML如下:

<div class = "container"> 
    <form role="form" action="{{ url_for('charge')}}" method="post"> 
    <div class="row cart-body" style = "margin-bottom: 20px"> 
     <div class="col-sm-8 col-xs-12"> 
      <div class="productbox" style = "width: 100%"> 
      <h2 class="section-heading"><strong>Delivery Information</strong></h2> 

        <div class="panel-body"> 

        <div class="form-group"> 
          <div class="col-md-12"><strong>Student Full Name:</strong></div> 
          <div class="col-md-12"> 
          <input type="name" name="name" id="name" class="form-control" placeholder="John Harvard" value = "{{name}}" style = "margin: 10px 0 10px 0; border: solid 0.5px #0b3c5d; border-radius: 6px"> 
          </div> 
         </div> 
         <div class = "form-group"> 
          <div class="col-md-12"><strong>Full Dorm Address:</strong></div> 
          <div class = "col-md-12"> 
          <input type="dorm" name="dorm" id="dorm" class="form-control" placeholder="Straus C-12, Dewolfe 20-05" value = "{{loc}}" style = "margin: 10px 0 20px 0; border: solid 0.5px #0b3c5d; border-radius: 6px"> 
          </div> 
         </div>  
         <div class="col-md-12"> 
          <span><p style = "text-align: center"><i class="fa fa-info-circle" aria-hidden="true"></i>&nbsp; Don't know your dorm address yet? You can leave it blank and update it later under My Account <i class="fa fa-arrow-right" aria-hidden="true"></i> Manage Orders.</p></span> 
         </div><br> 
      </div> 
      </div> 
     </div> 
     <div class = "col-sm-4 col-xs-12"> 
      <div class="productbox" style = "width: 100%"> 
       <h2 class="section-heading"><strong>Promo Code</strong></h2> 
        <div class="panel-body"> 
        <div class="form-group"> 
          <div class="col-md-12" style = "margin-bottom: 10px"> 
          <input type="code" name="code" id="code" class="form-control" placeholder="Enter Code Here" style = "margin: 0 0 10px 0; border: solid 0.5px #0b3c5d; border-radius: 6px"> 
          </div> 
          <div class="col-md-12" style = "text-align: center"> 
          <input type="submit" name="apply" id="apply" class="btn btn-md" value = "Apply Code"> 
          </div> 
         </div> 
      </div> 
      </div> 
     </div> 
    </div> 
<div class = "form-group" style = "text-align: center"> 
    <div class="form-group"> 
      <div class="col-md-12 button-field" style = "text-align: center;"> 
       <input type="submit" name = 'submit' class="btn btn-default btn-responsive btn-lg" value = "Confirm Order"></input> 
      </div> 
      </div>  
     <script src="https://checkout.stripe.com/checkout.js" class = "stripe-button" style = "" 
       data-key="{{ key }}" 
       data-description="" 
       data-amount="{{ amount }}" 
       data-locale="auto">   
     </script> 
     <script> 
     document.getElementsByClassName("stripe-button-el")[0].style.display = 'none'; 
    </script> 
    </div> 
</form> 

+1

Checkout.js不應該是一個IIFE(立即調用的函數表達式)。試着將它變成一個不是IFFE的函數,它將在按鈕點擊時被調用。 –

+0

嗨,這很有道理,但我該怎麼做?我不熟悉Javascript和JQuery ......我所知道的僅僅是Python Flask,HTML和CSS。一些示例代碼將不勝感激。 –

+0

請在您的問題中包含您的checkout.js。 –

回答

0

你可能會需要使用Google Checkout的"custom integration",它可以讓你從觸發JavaScript代碼的彈出窗口的打開。然後,您可以將彈出窗口的開口綁定到「確認訂單」按鈕的單擊事件處理程序。