当前位置: 首页 > 知识库问答 >
问题:

如何将条带自定义结帐令牌发布到flask后端

沈骞仕
2023-03-14

我正在尝试将Stripe custom checkout https://Stripe.com/docs/checkout#Integration-Custom与Flask和WTForms集成在一起。我现在的问题是付款表似乎没有过帐,所以信用卡费用无法创建。

表单似乎已被识别,因为令牌被发布到Stripe的api中,并有200个响应:

XHRPOST
https://api.stripe.com/v1/tokens
[HTTP/2.0 200 OK 1444ms]


Form data   
card[cvc]   123
card[exp_month] 10
card[exp_year]  20
card[name]      dev@local.host
card[number]    4242424242424242
email   dev@local.host
guid    4a6cfd25-8c4b-4d98-9dd2-9e9c1770e290
key pk_test_DVVO0zxtWjXSZx4yHsZGJxtv
muid    c6b9d635-20de-4fc6-8995-5d5b2d165881
payment_user_agent  Stripe+Checkout+v3+checkout-manhattan+    (stripe.js/9dc17ab)
referrer    http://localhost:8000/subscription/index
sid 494d70dd-e854-497b-945b-de0e96a0d646
time_on_page    26657
validation_type card
<script src="https://checkout.stripe.com/checkout.js"></script>
<form role="form" id = "payment_form" action="{{ url_for('billing.charge') }}" method="post">
  {{ form.hidden_tag }}
  <input type="hidden" id="stripeToken" name="stripeToken" />
  <input type="hidden" id="stripeEmail" name="stripeEmail" />
<div class="form-group">
              <div class="col-md-12 button-field" style = "text-align: center;">
                <button type="confirm" id = 'confirm' onclick = "runStripe('https://checkout.stripe.com/checkout.js')" class="btn btn-default btn-responsive btn-lg">Confirm Order</button>
              </div>
            </div>  
        <script>
          var handler = StripeCheckout.configure({
            key: "{{ stripe_key }}",
            locale: 'auto',
            token: function(token) {

                    // token ID as a hidden field 
                var form = document.createElement("form");
                form.setAttribute('method', "POST");
                form.setAttribute('action', "{{ url_for('billing.charge') }}");
                form.setAttribute('name', "payment-form");

                var inputToken = document.createElement("input");
                inputToken.setAttribute('type', "hidden");
                inputToken.setAttribute('name', "stripeToken");
                inputToken.setAttribute('value', token.id);
                form.appendChild(inputToken);

                // email as a hidden field 
                var inputEmail = document.createElement("input");
                inputEmail.setAttribute('type', "hidden");
                inputEmail.setAttribute('name', "stripeEmail");
                inputEmail.setAttribute('value', token.email);
                form.appendChild(inputEmail);

                document.body.appendChild(form);
            }
          });

        document.getElementById('confirm').addEventListener('click', function(e) {
        // Open Checkout with further options:
        handler.open({
          name: 'Stripe.com',
          description: '2 widgets',
          amount: '{{ amount }}'
        });
        e.preventDefault();
      });

      // Close Checkout on page navigation:
      window.addEventListener('popstate', function() {
        handler.close();
      });
    </script>
    <script>
    document.getElementsByClassName("stripe-button-el")[0].style.display = 'none';
  </script>

我尝试在html标记中使用post方法,但没有成功。我还尝试在javascript令牌中添加一个表单变量,以发布到我的收费路由中,这是根据以下问题改编的:Stripe Checkout Link onClick不处理付款

下面是我的索引和收费路线供参考:

@billing.route('/index', methods=['GET', 'POST'])
def index():
stripe_key = current_app.config.get('STRIPE_PUBLISHABLE_KEY') 
amount = 1010

form = CreditCardForm(stripe_key=stripe_key)

return render_template('billing/index.html', stripe_key=stripe_key, form=form)

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

if request.method == 'POST':
        customer = stripe.Customer.create(
            email = current_user,
            source = request.form['stripeToken']
        )

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

return render_template('charge.html', customer=customer, charge=charge)

共有1个答案

佘辰龙
2023-03-14

我决定将令牌更改为jquery,现在看来它工作得很好,而且简单得多:

    <script>
      var handler = StripeCheckout.configure({
        key: "{{ stripe_key }}",
        locale: 'auto',
        token: function(token) {

          $(document).ready(function(){
            $("#stripeToken").val(token.id);
            $("#stripeEmail").val(token.email);
            $("#payment_form").submit();
})
</script>

为了识别jquery,我还在html文件的顶部添加了jquery包的脚本:

脚本src=“http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js”type=“text/JavaScript”>

最后,对于另外一个在烧瓶中需要帮助的人,这里是我调整后的路线:

@billing.route('/index', methods=['GET', 'POST'])
@handle_stripe_exceptions
@login_required

def index():
stripe_key = current_app.config.get('STRIPE_PUBLISHABLE_KEY') 
amount = 1010

form = CreditCardForm(stripe_key=stripe_key, name=current_user.name, amount=amount )

if request.method == 'POST':

    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('billing/index.html', stripe_key=stripe_key, form=form)
 类似资料:
  • 我试图创建一个服务帐户与一个已知的,固定的令牌Jenkins使用,以部署到Kubernetes的东西。我使用以下YAML创建了令牌:

  • 问题内容: 我有一个像这样的数据结构: 我尝试通过$ .ajax将其发送到服务器: 我想通过烧瓶将其保存在服务器中: 工作正常! 但是我如何得到呢? 不起作用。 这是firebug中的发布数据: 问题答案: 你正在发送编码为查询字符串而不是JSON的数据。Flask能够处理JSON编码的数据,因此像这样发送它更有意义。这是你需要在客户端执行的操作: 在服务器端,通过(已解码)访问数据:

  • 我已经构建了一个定制的gradle插件,我正试图将其发布到一个私有的maven repo。我使用插件来实现这一点。在经历了很多麻烦之后,我查看了google play services插件的实现(https://github.com/google/play-services-plugins/blob/master/google-services-plugin/publish.gradle)并试图复

  • 我有两个Rest终点。 -身份提供程序,在用户通过用户名/密码的身份验证后,发送JWT令牌作为响应。 -接受上述JWT令牌作为头,对其进行验证,如果令牌有效,则发送用户JSON作为响应。 我已经使用Angular2创建了我的UI null

  • 我正试图发送一个授权令牌,但我的服务器不知何故没有接收它。 //service.ts } //endpoint //标记过滤器

  • 问题内容: 我继承了一些代码,这些代码最终将成为API调用的一部分。基于现有代码,该调用是使用access_token检索JSON代码的帖子。尽管这通常很简单,并且像其他所有API一样,但是此代码要求为客户机密提供一个自定义的httpheader字段。 我能够使用URLRequest等在Objective C中完成此工作,但是由于我正在创建对Web组件的调用,因此遇到了很多困难。 我正在使用一个非