2013-03-20 3 views
2

Я попытался адаптировать пример из PayPal APIs Getting Started Guide в PHP:учетные данные API неверны

<?php 

define('PAYPAL_API_USER', '<snip>'); 
define('PAYPAL_API_PWD', '<snip>'); 
define('PAYPAL_API_SIGNATURE', '<snip>'); 
define('PAYPAL_API_APPLICATION_ID', 'APP-80W284485P519543T'); 

$endpoing = 'https://svcs.sandbox.paypal.com/AdaptiveAccounts/CreateAccount'; 
$headers = array(
    'X-PAYPAL-SECURITY-USERID' => PAYPAL_API_USER, 
    'X-PAYPAL-SECURITY-PASSWORD' => PAYPAL_API_PWD, 
    'X-PAYPAL-SECURITY-SIGNATURE' => PAYPAL_API_SIGNATURE, 

    'X-PAYPAL-REQUEST-DATA-FORMAT' => 'JSON', 
    'X-PAYPAL-RESPONSE-DATA-FORMAT' => 'JSON', 

    'X-PAYPAL-APPLICATION-ID' => PAYPAL_API_APPLICATION_ID, 

    'X-PAYPAL-DEVICE-IPADDRESS' => '192.0.2.0', // :-? Also tried with my public IP address 
    'X-PAYPAL-SANDBOX-EMAIL-ADDRESS' => '<snip>', // Typed my account's e-mail 
); 
$payload = '{ 
    "sandboxEmailAddress": "Sender-emailAddress", 
    "accountType": "PERSONAL", 
    "name": { 
     "firstName": "Lenny", 
     "lastName": "Riceman" 
    }, 
    "address": { 
     "line1": "123 Main St", 
     "city": "Austin", 
     "state": "TX", 
     "postalCode": "78759", 
     "countryCode": "US" 
    }, 
    "citizenshipCountryCode": "US", 
    "contactPhoneNumber": "512-555-5555", 
    "dateOfBirth": "1968-01-01Z", 
    "createAccountWebOptions": { 
     "returnUrl": "http://www.example.com/success.html" 
    }, 
    "currencyCode": "USD", 
    "emailAddress": "[email protected]", 
    "preferredLanguageCode": "en_US", 
    "registrationType": "Web", 
    "requestEnvelope": { 
     "errorLanguage": "en_US" 
    } 
}'; 
$options = array(
    CURLOPT_SSL_VERIFYPEER => false, 
    CURLOPT_HTTPHEADER => $headers, 
CURLOPT_POST => false, 
CURLOPT_POSTFIELDS => $payload, 
    CURLOPT_RETURNTRANSFER => true, 
); 

try{ 
    $curl = curl_init($endpoing); 
    if(!$curl){ 
     throw new Exception('Could not initialize curl'); 
    } 
    if(!curl_setopt_array($curl, $options)){ 
     throw new Exception('Curl error:' . curl_error($curl)); 
    } 
    $result = curl_exec($curl); 
    if(!$result){ 
     throw new Exception('Curl error:' . curl_error($curl)); 
    } 
    curl_close($curl); 
    echo $result; 
}catch(Exception $e){ 
    echo 'ERROR: ' . $e->getMessage() . PHP_EOL; 
} 

... но я всегда получаю это обратно:

<?xml version='1.0' encoding='utf-8'?> 
<ns3:FaultMessage xmlns:ns3="http://svcs.paypal.com/types/common" xmlns:ns2="http://svcs.paypal.com/types/aa"> 
    <responseEnvelope> 
     <timestamp>2013-03-20T16:33:46.309-07:00</timestamp> 
     <ack>Failure</ack> 
     <correlationId>7d7fa53e6a930</correlationId> 
     <build>5343121</build> 
    </responseEnvelope> 
    <error> 
     <errorId>520003</errorId> 
     <domain>PLATFORM</domain> 
     <subdomain>Application</subdomain> 
     <severity>Error</severity> 
     <category>Application</category> 
     <message>Authentication failed. API credentials are incorrect.</message> 
    </error> 
</ns3:FaultMessage> 

Я перепроверил учетные данные API (пользователь, пропуск и подпись), и они точно отображаются на странице профиля. Я не совсем уверен в X-PAYPAL-DEVICE-IPADDRESS и X-PAYPAL-SANDBOX-EMAIL-ADDRESS.

Я подозреваю, что я неправильно понял что-то или пропустил какой-то вариант завитки. Можете ли вы определить, что не так в моем коде?

ответ

5

очень удачный, вариант CURLOPT_HTTPHEADER делает не взять хэш пар Header => Значение, только список строк, каждая из которых должна быть полный заголовок HTTP.

Таким образом, вместо $headers = array('X-PAYPAL-SECURITY-USERID' => PAYPAL_API_USER, ...) вам нужно $headers = array('X-PAYPAL-SECURITY-USERID: ' . PAYPAL_API_USER, ...)

+0

Да, конечно ... Я должен быть слепым! И это объясняет, почему я получал сообщение об ошибке XML, а не JSON. Большое спасибо. –

+0

После исправления я все равно получил то же сообщение об ошибке (за исключением того, что красиво отформатирован в JSON). В конце концов, я загрузил некоторые образцы PHP из PayPal.com, у которых был файл конфигурации с учетными данными API от Бога, который знает, кто. Я пробовал, и все это начало работать. Поэтому по какой-то причине PayPal присвоил мне пароль API, который недействителен. (Но, конечно, мое глупое неправильное использование завитка было очевидной проблемой в моем коде.) –

+0

Привет всем, У меня ошибка проверки подлинности. Я получил API с сайта paypal. Я создал учетные записи для песочницы на сайте разработчика. Я также проверил заголовки. Но я не мог решить эту ошибку. пожалуйста, предложите мне. – user2003356

2

Причина заключается в том, что вы используете неправильные учетные данные API. Вам нужно настроить пользователя в своей основной учетной записи разработчика. Как только это будет настроено, вы увидите в своем профиле, что у них есть свои собственные учетные данные API.

У меня была такая же проблема и потребовалось несколько часов, чтобы решить, но теперь все работает хорошо.

+0

Хотя это не отвечает на этот точный вопрос (я на самом деле неправильно использовал Curl), это действительно был большой пробкой, которая заставляла меня тратить несколько дней. Но даже сейчас я знаю, как это сделать, обычно требуется несколько часов, чтобы создать несколько тестовых учетных записей для разработки. –

+0

+1. Чтобы настроить учетные записи в виде песочницы, перейдите на сайт разработчика.paypal.com, нажмите «Приложения» и «Счётчики Sandbox». – bevanb

0

Очень ясно, что APP-ID для песочницы всегда APP-80W284485P519543T.

Когда вы выйдете на живое, у вас будет свой.

Смежные вопросы