2015-09-22 54 views
3

我列出我們的訂閱按鈕,所有的計劃如下(Django的模板語法):我如何知道用戶使用Stripe的Checkout.js選擇了哪個計劃?

{% for plan in plans %} 
    <tr> 
    <td>{{ plan.name }}</td> 
    <td>£{{ plan.price_human }}</td> 
    <td> 
     <form method="POST" action="."> 
     {% csrf_token %} 
     <script 
     src="https://checkout.stripe.com/checkout.js" class="stripe-button" 
     data-key="{{ public_key }}" 
     data-image="/static/images/logo-n.png" 
     data-name="Product Name" 
     data-description="{{ plan.name }}" 
     data-currency="{{ plan.currency }}" 
     data-amount="{{ plan.price }}" 
     data-locale="{{ request.LANGUAGE_CODE }}" 
     data-email="{{ user.email }}" 
     data-label="{% trans 'Subscribe' %}" 
     data-panel-label="{% trans 'Subscribe' %}" 
     data-allow-remember-me="false" 
     > 
     </script> 
     </form> 
    </td> 
    </tr> 
    {% endfor %} 

然後我在迴應這種形式創建客戶/訂閱張貼:

class SubscribePageView(generic.TemplateView): 
    def post(self, request, *args, **kwargs): 
    stripe.api_key = settings.STRIPE_SECRET_KEY 
    user = self.request.user 
    token = request.POST.get('stripeToken') 

    customer = stripe.Customer.create(
     source=token, 
     plan=[[WHERE DOES THIS COME FROM??]], 
     email=user.email, 
    ) 
    user.customer_id = customer.id 
    user.save() 

但在那個時候,我沒有計劃ID回傳給Stripe。 :/。

我在做這樣的各種錯誤嗎?

回答

3

所有Stripe簽出腳本都會將令牌插入到表單中的隱藏字段中,然後將整個表單提交給您的服務器。如果您需要任何其他信息,如該計劃,你應該包括在你的形式也:

<form method="POST" action="."> 
    {% csrf_token %} 
    <input type="hidden" name="plan" value="{{ plan.id }}"> 
    <script....> 
</form> 

現在,您可以通過request.POST['plan']訪問計劃。

+1

但是,然後有人可以欺騙請求,並告訴我他們買了一個不同於他們購買的計劃的計劃? –

+1

但是Stripe checkout沒有做任何事情來「購買」一個計劃或向用戶收費,它所做的只是創建與其信用卡相關的用戶令牌。您仍然從您的服務器端代碼購買實際的計劃購買,這就是您向用戶收費的點。因此,如果他們修改了帖子,他們仍然會根據您實際收到的內容收費。 –

+1

來自[文檔](https://stripe.com/docs/checkout):「值得注意的是,Checkout實際上並沒有創建費用 - 它只創建令牌。您可以使用這些令牌來創建實際的費用服務器。」 –

相關問題