异常值:HTTP错误400:对PayPal沙箱站点的Python / urllib2请求后的错误请求

时间:2013-12-05 17:54:46

标签: python curl paypal

我正在尝试将PayPal REST API集成到我的网站中。作为第一步,我正在尝试将cURL命令转换为Python,并且我得到Exception Value: HTTP Error 400

我正在使用的代码(基于https://stackoverflow.com/a/2003832/2675537):

def basic_authorization(user, password):
    s = user + ":" + password
    return "Basic " + s.encode("base64").rstrip()

req = urllib2.Request("https://api.sandbox.paypal.com/v1/oauth2/token",
              headers = {
   "Authorization": basic_authorization("EBWKjlELKMYqRNQ6sYvFo64FtaRLRR5BdHEESmha49TM", "EO422dn3gQLgDbuwqTjzrFgFtaRLRR5BdHEESmha49TM"),
 "Accept": "application/json",
    "Accept": "*/*",   
    "User-Agent": "my-python-app/1", 
    },
                  data = '{"message":{"body":' + 'grant_type=client_credentials' + '}}' )

f = urllib2.urlopen(req)
return HttpResponse(f)

这相当于(我猜):

curl https://api.sandbox.paypal.com/v1/oauth2/token \
-H "Accept: application/json" \
-u "EBWKjlELKMYqRNQ6sYvFo64FtaRLRR5BdHEESmha49TM:EO422dn3gQLgDbuwqTjzrFgFtaRLRR5BdHEESmha49TM" \
-d "grant_type=client_credentials" 

回溯就在这里:(编辑:断开链接)

According to PayPal我应该得到这样的回复:

{"scope":"https://api.paypal.com/v1/payments/.* https://api.paypal.com/v1/vault/credit-card https://api.paypal.com/v1/vault/credit-card/.* https://api.paypal.com/v1/developer/.*","access_token":"OABI8rm75u.5EIuK7.JrI2sLhnv3rhDgLElKAwTfyys","token_type":"Bearer","app_id":"APP-2EJ531395M785864S","expires_in":28800}

我的代码中是否有错误?有没有更好的方法呢?

1 个答案:

答案 0 :(得分:1)

首先,我建议您不要在代码示例中以明文形式发布密钥。

您收到“HTTP错误400:错误请求”的错误是由于请求格式错误造成的。

从文档中,请求的格式为:

urllib2.Request(url [,data] [,headers] [,origin_req_host] [,unverifiable])

  

数据可以是指定要发送到服务器的其他数据的字符串,   如果不需要这样的数据,则为无。

     

标题应该是字典,并且将被视为add_header()   用每个键和值作为参数调用。

所以你的数据字段传递的是dict而不是字符串,它会更具可读性 如果您将Request类之外的字段分开。当你有多个标题 要填写的字段,我发现使用add_header方法更好,如下所示。

import urllib, urllib2


def basic_authorization(user, password):
    s = user + ":" + password
    return "Basic " + s.encode("base64").rstrip()

url = "https://api.sandbox.paypal.com/v1/oauth2/token"
params = { "grant_type": client_credentials}
data = urllib.urlencode(params)

req = urllib2.Request(url, data)
req.add_header("Authorization",basic_authorization("XXX"))
req.add_header("Accept", "application/json")
req.add_header("User-Agent", "my-python-app/1")

response = urllib2.urlopen(req)