使用 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/
哎呀。我在 allauth 管理社交应用程序字段中使用的是 Client_ID,而不是 Stripe Connect 仪表板中的 API 密钥。
我也有同样的问题。我的解决方案:
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)