API PayPal — API поиска транзакций: Ответ на 400 НЕВЕРНЫХ ЗАПРОСОВ

#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 by postman ?

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()