【问题标题】:InvalidRequestError: This customer has no attached payment sourceInvalidRequestError:此客户没有附加付款来源
【发布时间】:2018-07-28 16:11:02
【问题描述】:

我一直在关注 Stripe 的快速入门指南。

https://stripe.com/docs/quickstart

https://stripe.com/docs/subscriptions/quickstart

这是我的表单的样子:

<form id="register-form" method="post">
    {% csrf_token %}
    {% for field in registration_form %}
        <p>{{ field }}</p>
        {% if field.errors %}
            <p class="text-danger">{{ field.errors.as_text|cut:"* "|escape }}</p>
        {% endif %} 
    {% endfor %}
    {% if registration_form.non_field_errors %}
        <p class="text-danger">{{ registration_form.non_field_errors.as_text|cut:"* "|escape }}</p>
    {% endif %}
    <div id="stripe-wrapper">
        <p id="card-element"></p>
    </div>                  
    <p id="card-errors" role="alert"></p>
    <button id="register-btn" class="btn btn-primary" type="submit">Register</button>

    <script type="text/javascript">
        var displayError=   document.getElementById('card-errors');
        var stripe=         Stripe("pk_test_BjhejGz5DZNcSHUVaqoipMtF");
        var elements=       stripe.elements();

        var style=      {
            base: {
                fontSize: "1.1875rem",
                fontSmoothing: "always",
                fontWeight: "600"
            }
        };

        var card=   elements.create("card",{style:style});
        card.mount("#card-element");
        card.addEventListener('change', function(event) {

            if (event.error) {
                displayError.textContent = event.error.message;
            } else {
                displayError.textContent = '';
            }
        });

        var formID= "register-form";
        var form=   document.getElementById(formID);
        form.addEventListener("submit",function(event){
            event.preventDefault();

            stripe.createToken(card).then(function(result){
                if(result.error) {
                    displayError.textContent=   result.error.message;
                } else {
                    stripeTokenHandler(result.token, formID);
                }                               
            })
        });
        // tut https://stripe.com/docs/stripe-js/elements/quickstart#create-form
        function stripeTokenHandler(token, formID) {
            // Insert the token ID into the form so it gets submitted to the server
            var form = document.getElementById(formID);
            var hiddenInput = document.createElement('input');
            hiddenInput.setAttribute('type', 'hidden');
            hiddenInput.setAttribute('name', 'stripeToken');
            hiddenInput.setAttribute('value', token.id);
            form.appendChild(hiddenInput);
            // Submit the form
            form.submit();
        }
    </script>
</form>

然后我的views.py 有这个:

if registration_form.is_valid():
    stripe.api_key= "sk_test_8rdFokhVsbsJJysHeKgyrMTc"
    stripeCustomer= stripe.Customer.create(
        email=request.POST["username"],
    )
    subscription=   stripe.Subscription.create(
        customer=stripeCustomer["id"],
        items=[{"plan":"plan_CLFfBrRAKl7TRt"}],
    )

这给了我一个错误:

Internal Server Error: /login-register/
Traceback (most recent call last):
  File "/home/myUserName/myDjangoProjectWithStripe/local/lib/python2.7/site-packages/django/core/handlers/exception.py", line 42, in inner
    response = get_response(request)
  File "/home/myUserName/myDjangoProjectWithStripe/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 249, in _legacy_get_response
    response = self._get_response(request)
  File "/home/myUserName/myDjangoProjectWithStripe/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 178, in _get_response
    response = middleware_method(request, callback, callback_args, callback_kwargs)
  File "/home/myUserName/myDjangoProjectWithStripe/local/lib/python2.7/site-packages/mezzanine/pages/middleware.py", line 98, in process_view
    return view_func(request, *view_args, **view_kwargs)
  File "/home/myUserName/myDjangoProjectWithStripe/product_blog/theme/views.py", line 154, in login_register
    items=[{"plan":"plan_CLFfBrRAKl7TRt"}],
  File "/home/myUserName/myDjangoProjectWithStripe/local/lib/python2.7/site-packages/stripe/api_resources/subscription.py", line 33, in create
    return super(Subscription, cls).create(**params)
  File "/home/myUserName/myDjangoProjectWithStripe/local/lib/python2.7/site-packages/stripe/api_resources/abstract/createable_api_resource.py", line 17, in create
    response, api_key = requestor.request('post', url, params, headers)
  File "/home/myUserName/myDjangoProjectWithStripe/local/lib/python2.7/site-packages/stripe/api_requestor.py", line 153, in request
    resp = self.interpret_response(rbody, rcode, rheaders)
  File "/home/myUserName/myDjangoProjectWithStripe/local/lib/python2.7/site-packages/stripe/api_requestor.py", line 365, in interpret_response
    self.handle_error_response(rbody, rcode, resp.data, rheaders)
  File "/home/myUserName/myDjangoProjectWithStripe/local/lib/python2.7/site-packages/stripe/api_requestor.py", line 178, in handle_error_response
    raise err
InvalidRequestError: Request req_o39ceLlhtpJmmr: This customer has no attached payment source

如何向客户附加付款来源?因为我在测试,所以我使用的是测试信用卡,它的号码是4242 4242 4242 4242

【问题讨论】:

  • 问题是如果客户没有注册卡(付款来源),您无法在 Stripe 中创建订阅。
  • @Rasovica 如何将付款来源附加给客户?

标签: django stripe-payments


【解决方案1】:

错误的意思是,客户没有附加的付款方式/来源。您正在将stripeToken 添加到您的html 表单中,但您没有在服务器端做任何事情。您需要将令牌添加到您的客户(在创建客户时将 source 设置为令牌),然后您就可以向客户收费、创建订阅等。

【讨论】:

  • 我是否将source 属性放在CustomerSubscription 对象中?
  • 在客户上,因为订阅需要在客户订阅计划之前配置付款。 2020年对这个问题的更新是来源是outdated,现在可以使用payment method
【解决方案2】:

您需要在注册中添加付款表格, 假设您有 /payment-form 路线,请在您的 views.py 中添加以下内容:

from yourapp import settings

def payment_form(request):
    context = { "stripe_key": settings.STRIPE_PUBLIC_KEY }
    return render(request, "yourtemplate.html", context)

在您的模板中,复制并粘贴在条带文档的结帐部分下找到的表单。

<form action="/checkout" method="POST">
<script src="https://checkout.stripe.com/checkout.js" class="stripe-button"
    data-key="stripe_key" # Make sure to wrap the variable name with double {}
    data-amount="2000"
    data-name="Your APp"
    data-description="Your Product"
    data-image="Link to your logo"
    data-currency="usd">
</script>
</form>

请注意,我们将条带 public_key 传递给 data-key 属性,默认情况下,它将使用您的实际公钥填充,但我发现使用该变量更好。

我们还将表单的 action 属性设置为 /checkout,我们将在下一步中创建它。该路由将处理结帐逻辑。

实际情况是这样的:当用户提交表单(即:支付)时,他们的银行账户信息被发送到 Stripe 进行处理。如果付款被接受,stripe 将向表单的 action 属性中指定的端点发出 POST 请求。这个想法是然后捕获该令牌并使用它来向用户的卡收费。

【讨论】:

  • 就我而言,我没有使用 Stripe 按钮来提交信息。我会用 HTML 更新我的问题
猜你喜欢
  • 2016-05-22
  • 1970-01-01
  • 2016-05-21
  • 1970-01-01
  • 2017-03-13
  • 1970-01-01
  • 2020-12-14
  • 2018-12-13
  • 2019-01-26
相关资源
最近更新 更多