"unsupported_grant_type" 使用 Google 的 urlfetch 从 PayPal 获取 oauth 令牌时。使用 "requests" 有效

"unsupported_grant_type" when using Google's urlfetch to get an oauth token from PayPal. Using "requests" works

我一直在尝试(但惨遭失败)使用 google 的 urlfetch 模块(python 在 App Engine 的本地服务器中)从 paypal 检索令牌。它使用 App Engine 的“请求”模块 outside 工作如下:

    url = base + "/v1/oauth2/token"

    payload = {
        'grant_type': 'client_credentials',
        }


    auth_encoded = APP_CLIENT_ID + ":" + APP_SECRET
    auth_encoded = base64.b64encode(auth_encoded)

    ##headers = {'Content-Type': 'application/json', 'Authorization': 'Basic ' + auth_encoded}
    headers = {'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': 'Basic ' + auth_encoded}

    r = requests.post(url,headers=headers,params=payload)
    print r.text

...但是在使用 urlfetch 尝试同样的事情时我收到了这条消息:

{"error":"unsupported_grant_type","error_description":"Grant Type is NULL"}

...这是我正在使用的代码:

    url = base + "/v1/oauth2/token"

    payload = {"grant_type": "client_credentials"}

    auth_encoded = APP_CLIENT_ID + ":" + APP_SECRET
    auth_encoded = base64.b64encode(auth_encoded)

    headers = {'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': 'Basic ' + auth_encoded}

    result = urlfetch.fetch(
        url=url,
        method=urlfetch.POST,
        headers=headers,
        payload = payload
    )

...我已经尝试了所有我能想到的。应该是很简单的事情。

此 API 调用的格式为 application/x-www-form-urlencoded ,而不是 JSON。

因此:

payload = "grant_type=client_credentials"

import urllib
payload = urllib.urlencode({"grant_type": "client_credentials"})