Stripe Connect与Django的集成

问题描述

我是django中的新集成Stripe,但最近我遇到一个错误,就是找不到答案,每次尝试将Stripe帐户连接到我的网站时,都会出现此错误

{“错误”:{“消息”:“没有应用程序与提供的客户端标识符匹配”}}

这是代码

import urllib

import requests

from django.urls import reverse
from django.http import HttpResponseRedirect
from django.views import View
from django.conf import settings
from django.shortcuts import redirect

from .models import Seller


class StripeAuthorizeView(View):

    def get(self,request):
        if not self.request.user.is_authenticated:
            return HttpResponseRedirect(reverse('login'))
        url = 'https://connect.stripe.com/oauth/authorize'
        params = {
            'response_type': 'code','scope': 'read_write','client_id': settings.STRIPE_CONNECT_CLIENT_ID,'redirect_uri': f'http://localhost:8000/users/oauth/callback'
        }
        url = f'{url}?{urllib.parse.urlencode(params)}'
        return redirect(url)


class StripeAuthorizeCallbackView(View):

    def get(self,request):
        code = request.GET.get('code')
        if code:
            data = {
                'client_secret': settings.STRIPE_SECRET_KEY,'grant_type': 'authorization_code','code': code
            }
            url = 'https://connect.stripe.com/oauth/token'
            resp = requests.post(url,params=data)
            # add stripe info to the seller
            stripe_user_id = resp.json()['stripe_user_id']
            stripe_access_token = resp.json()['access_token']
            seller = Seller.objects.filter(user_id=self.request.user.id).first()
            seller.stripe_access_token = stripe_access_token
            seller.stripe_user_id = stripe_user_id
            seller.save()
        url = reverse('home')
        response = redirect(url)
        return response

settings.py

STRIPE_PUBLISHABLE_KEY = '<your test publishable key here>'
STRIPE_SECRET_KEY = '<your test secret key here>'
STRIPE_CONNECT_CLIENT_ID = '<your test connect client id here>'

解决方法

当您应该使用data = data时,似乎正在使用params = data:

        static void sleepSome(int durationInSeconds)
        {
            Console.WriteLine("About to sleep for " + durationInSeconds + " seconds");

            Thread.Sleep(durationInSeconds * 1000);

            Console.WriteLine("Sleep over");

        }

从请求文档中,参数用于Url参数: 您通常希望在 URL的查询字符串中发送某种数据。如果您是手动构建网址,则此数据会在网址中以问号(例如, httpbin.org/get?key=val 。通过请求,您可以使用params关键字参数将这些参数作为字符串字典提供。

https://requests.readthedocs.io/en/master/user/quickstart/

对于data = data部分,也来自同一页面: 请求的简单API意味着所有形式的HTTP请求都是显而易见的。例如,这是您发出HTTP POST请求的方式

       data = {
            'client_secret': settings.STRIPE_SECRET_KEY,'grant_type': 'authorization_code','client_id': settings.STRIPE_CONNECT_CLIENT_ID,'code': code
        }
        url = 'https://connect.stripe.com/oauth/token'
        #resp = requests.post(url,params=data)
        resp = requests.post(url,data=data) #Try with this instead