Ошибка PayPal 10002 с использованием API разрешений и TransactionSearch

У меня есть запрос на разрешение, который выглядит следующим образом:

timestamp, signature = genPermissionsAuthHeader.getAuthHeader(str(self.username), str(self.password), str(access_token), str(token_secret), "POST", "https://api-3t.sandbox.paypal.com/nvp") # https://svcs.sandbox.paypal.com/Permissions/GetBasicPersonalData
        log.info(timestamp)
        log.info(signature)
    authorization_header = "timestamp=" + timestamp + ",token=" + access_token + ",signature=" + signature
    log.info(authorization_header)

    headers = {
        "X-PAYPAL-AUTHORIZATION": authorization_header,
    }

    url = "https://api-3t.sandbox.paypal.com/nvp"

    nvp_params = {
        "METHOD": "TransactionSearch",
        "STARTDATE": "2012-01-01T05:38:48Z",
    }

    r = requests.post(url, data=nvp_params, headers=headers)

    log.info(r.text)
    self.response.content_disposition = "text/html"
    self.response.write(r.text)

У меня есть токен доступа и секрет токена из API разрешений, использующий мои учетные данные PayPal на developer.paypal.com в разделе "Учетные записи в песочнице"

Когда я запускаю этот метод, я получаю сообщение об ошибке:

TIMESTAMP=2014%2d04%2d21T22%3a50%3a18Z&CORRELATIONID=c8f9212035b60
&ACK=Failure&VERSION=0%2e000000&BUILD=10277387&L_ERRORCODE0=10002
&L_SHORTMESSAGE0=Authentication%2f
Authorization%20Faile
d&L_LONGMESSAGE0=You%20do%20not%20have%20permissions%20to%20make%20this%20API%20call
&L_SEVERITYCODE0=ErrorNone

Я могу позвонить в GetBasicPersonalDetails, и это похоже на работу. Любая помощь будет отличной, спасибо!

3 ответа

Решение

Я нашел ответ, мне не хватало параметра "SUBJECT" в строке параметров, отправляемых для оплаты. Так что на случай, если кто-нибудь еще столкнется с этим в будущем, полный код после получения токенов разрешений для запуска тестовой оплаты для песочницы:

def test_sales(self, access_token=None, token_secret=None):

timestamp, signature = genPermissionsAuthHeader.getAuthHeader(str(self.username), str(self.password), str(access_token), str(token_secret), "POST", "https://api-3t.sandbox.paypal.com/nvp") # https://svcs.sandbox.paypal.com/Permissions/GetBasicPersonalData
log.info(timestamp)
log.info(signature)

authorization_header = "timestamp=" + timestamp + ",token=" + access_token + ",signature=" + signature
log.info(authorization_header)

headers = {
    "X-PAYPAL-AUTHORIZATION": authorization_header,
}

url = "https://api-3t.sandbox.paypal.com/nvp"

nvp_params = {
    "METHOD": "DoDirectPayment",
    "PAYMENTACTION": "Sale",
    "AMT": "22.00",
    "ACCT": "4111111111111111",
    "CVV2": "111",
    "FIRSTNAME": "Jane",
    "LASTNAME": "Smith",
    "EXPDATE": "012018",
    "IPADDRESS": "127.0.0.1",
    "STREET": "123 Street Way",
    "CITY": "Englewood",
    "STATE": "CO",
    "ZIP": "80112",
    "VERSION": "86",
    "SIGNATURE": self.signature,
    "USER": self.username,
    "PWD": self.password,
    "SUBJECT": "person_who_you_acting_on_behalf_of@domain.com"
}


r = requests.post(url, data=nvp_params, headers=headers)
log.info("Search transaction\n\n" + r.text + "\n\n")
self.response.content_disposition = "text/html"
self.response.write(urllib.unquote(r.text).decode('utf8'))

И для генерации заголовка я использовал: https://github.com/paypal/python-signature-generator-for-authentication-header

Надеюсь, это поможет кому-то, спасибо!

TransactionSearch не является частью API AdaptivePayments, поэтому для этого метода не требуется "X-PAYPAL-AUTHORIZATION". Предполагая, что вы получили разрешение для метода TransactionSearch для целевой учетной записи (см. https://developer.paypal.com/docs/classic/permissions-service/gs_PermissionsService/), будет работать следующий код:

import requests

api_username="username"
api_password="password"
api_signature="signature"

target_account_email="xxx.yyy-buyer@zzz.com"    #customers email

data_req = {
    'METHOD':'TransactionSearch',
    'SUBJECT':, target_account_email,
    'VERSION':'86.0',
    'STARTDATE':'2009-10-11T00:00:00Z',
    'USER':api_username,  
    'PWD':api_password,   
    'SIGNATURE':api_signature 
} 
response=requests.post(url_en_point,data=data_req,timeout=3).text
print response

Вот некоторая информация о сообщении об ошибке, которое вы получаете. Одна из причин - неверные учетные данные API. Другая возможность - вы пытаетесь передать просроченный токен. После создания транзакции в PayPal токен больше не действует. Вместо этого вы создали идентификатор транзакции.
Ниже приведена дополнительная информация о сообщениях об ошибках PayPal API.
Сообщения об ошибках PayPal API

Если вы пытаетесь найти транзакцию для своих последних транзакций в PayPal, то вы можете использовать API PaymentDetailsRequest
Вот руководство по интеграции с сайта разработчиков PayPal:

Получить платежную информацию PayPal API коды

Другие вопросы по тегам