我正在尝试将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}
我的代码中是否有错误?有没有更好的方法呢?
答案 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)