django-allauth 重定向 url 使用 Stripe OAuth 提示“登录失败”

问题描述 投票:0回答:2

使用 django-allauth 通过 Stripe Connect 对用户进行身份验证。似乎连接到 Stripe 并允许登录,但是当返回到我的网站时,它会呈现一个 allauth 错误模板,其中显示:

 An error occurred while attempting to login via your social network account.

关于我在这里做错了什么有什么想法吗?

这就是我所做的。

设置.py

INSTALLED_APPS = [
                  ...
                  'allauth',
                  'allauth.account',
                  'allauth.socialaccount',
                  'allauth.socialaccount.providers.stripe',
                   ...
                  ]

AUTHENTICATION_BACKENDS = [
                           ...
                           'allauth.account.auth_backends.AuthenticationBackend',
                           ...
                           ]

SITE_ID = 1

url.py

urlpatterns = [
               ...
               url(r'^accounts/', include('allauth.urls')),
               ...
              ]

登录.html

{% if user and not.is_anonymous %}
    <h2>Hello, {{ user.get_full_name }}.</h2>

{% else %}
    <p><a href="{% provider_login_url 'stripe' %}" class="btn btn-default">Stripe</a></p>

{% endif %}

条纹连接

Website URL: https://127.0.0.1:8000

Redirect_URIs: http://127.0.0.1:8000/accounts/stripe/login/callback/

按照文档在 django 管理员中设置社交应用程序:

Social Applications = http://127.0.0.1:8000/
python django stripe-payments django-allauth stripe-connect
2个回答
0
投票

哎呀。我在 allauth 管理社交应用程序字段中使用的是 Client_ID,而不是 Stripe Connect 仪表板中的 API 密钥。


0
投票

我也有同样的问题。我的解决方案:

    template_name = "orders/order-create.html"
    form_class = OrderForm
    success_url = reverse_lazy("orders:order-create")

    def post(
        self, request: HttpRequest, *args: tuple, **kwargs: dict
    ) -> HttpResponseRedirect:
        form = self.get_form()
        if form.is_valid():
            super().post(request, *args, **kwargs)
            baskets = Basket.objects.filter(user=self.request.user)
            checkout_session = stripe.checkout.Session.create(
                line_items=baskets.stripe_products(),
                metadata={
                    "order_id": self.object.id,
                    "user_id": self.request.user.id,  # save user
                },
                mode="payment",
                success_url="{}{}".format(
                    settings.DOMAIN_NAME, reverse("orders:order-success")
                )
                + "?session_id={CHECKOUT_SESSION_ID}",
                cancel_url="{}{}".format(
                    settings.DOMAIN_NAME, reverse("orders:order-canceled")
                ),
            )
            request.session["checkout_session_id"] = checkout_session.id
            return HttpResponseRedirect(
                checkout_session.url, status=HTTPStatus.SEE_OTHER
            )
        else:
            return render(request, self.template_name, {"form": form})


class SuccessTemplateView(TemplateView):
    template_name = "orders/success.html"

    def get(self, request, *args, **kwargs) -> HttpResponse:
        session_id = request.GET.get("session_id")

        if session_id:
            # Retrieve information from Stripe session metadata
            session = stripe.checkout.Session.retrieve(session_id)
            user_id = session.metadata.get("user_id")

            if user_id:
                try:
                    user = get_user_model().objects.get(id=user_id)
                    user.backend = (
                       "allauth.account.auth_backends.AuthenticationBackend"
                    )
                    login(request, user)`enter code here`
                except get_user_model().DoesNotExist:
                    return HttpResponseBadRequest(
                        "User does not exist", status=HTTPStatus.BAD_REQUEST
                    )
        return super().get(request, *args, **kwargs)
© www.soinside.com 2019 - 2024. All rights reserved.