#python #paypal #python-requests #http-status-code-400
Вопрос:
Я пытаюсь получить список всех транзакций со своего бизнес-аккаунта PayPal с помощью API поиска транзакций, но продолжаю получать ответ 400 INVALID_REQUEST.
Согласно этой документации, я все правильно делаю с заголовками. Я также предоставил доступ к своему приложению для выполнения такого рода поиска. Кто-нибудь может мне помочь?
import requests, json
USERNAME = <MY USERNAME>
KEY = <MY SECRET KEY>
TOKEN = <MY TOKEN - GENERATED BY POSTMAN>
headers = {"Content-Type": "application/json",
"Accept-Language": "en_US",
"Authorization": "Bearer <MY TOKEN>",
"Accept": "application/json"
}
LINK = "https://api-m.paypal.com"
GET = "/v1/reporting/transactions?start_date=2021-01-01T00:00:00-0700amp;end_date=2021-06-01T00:00:00-0700"
GET_LINK = LINK GET
response = requests.get(GET_LINK, auth=(USERNAME, KEY), headers=headers)
print(response)
Спасибо
Комментарии:
1. как вы создали этот код?
POSTMAN
имеет функцию генерации кода для разных языков. Вы сгенерировали код сpostman
помощью ?2. всегда помещайте полное сообщение об ошибке (начинающееся со слова «Обратная связь») в вопрос (не комментарий) в виде текста (не скриншот, не ссылка на внешний портал). Есть и другая полезная информация.
3. используете ли вы ссылку на живую/производственную среду с
token
помощью generated bypostman
?4. ты проверял
print(response.text)
? Я воссоздал весь код, запустил его и получил ошибку400
, ноresponse.text
получил объяснение:"issue":"Date range is greater than 31 days"
если я изменю даты, это сработает для меня
Ответ №1:
Я воссоздал весь код, сгенерировал TOKEN
, выполнил запрос и получил ошибку 400
… но в response.text
я получил объяснение:
"issue":"Date range is greater than 31 days"
Если я изменю даты на
'start_date': '2021-01-01T00:00:00-0700',
'end_date': '2021-02-01T00:00:00-0700',
тогда это работает на меня.
Кстати: Вам нужно (USERNAME, KEY)
только сгенерировать TOKEN
, а позже вы сможете использовать только TOKEN
.
Мой полный код, используемый для тестов:
Ему нужно только CLIENT_ID
и SECRET
потому, что он запускает код, чтобы получить TOKEN
import requests
# --- constants ---
CLIENT_ID = "ARg..." # 80 chars
SECRET = "EAl..." # 80 chars
#ENDPOINT = "https://api-m.sandbox.paypal.com" # Sandbox - doesn't have access to transactions
ENDPOINT = "https://api-m.paypal.com" # Live
DEBUG = True
# --- functions ---
def display_response(response):
print('response:', response)
print('url:', response.url)
print('text:', response.text)
def display_data(data):
for key, value in data.items():
if key == 'scope':
for item in value.split(' '):
print(key, '=', item)
else:
print(key, '=', value)
def get_token():
if DEBUG:
print('--- get token ---')
url = ENDPOINT '/v1/oauth2/token'
headers = {
"Accept": "application/json",
"Accept-Language": "en_US",
}
payload = {
"grant_type": "client_credentials"
}
response = requests.post(url, auth=(CLIENT_ID, SECRET), data=payload)
if DEBUG:
display_response(response)
data = response.json()
if DEBUG:
display_data(data)
return data['access_token']
def get_transactions():
if DEBUG:
print('--- transaction ---')
url = ENDPOINT "/v1/reporting/transactions"
headers = {
"Content-Type": "application/json",
"Accept-Language": "en_US",
"Authorization": f"Bearer {TOKEN}",
"Accept": "application/json"
}
payload = {
'start_date': '2021-01-01T00:00:00-0700',
'end_date': '2021-02-01T00:00:00-0700',
}
response = requests.get(url, headers=headers, params=payload)
if DEBUG:
display_response(response)
data = response.json()
if DEBUG:
display_data(data)
# --- main ---
TOKEN = get_token()
print('--- token ---')
print('TOKEN:', TOKEN)
get_transactions()