Преобразование запроса cURL командной строки в запрос PHP cURL (PayPal API)

Вот пример PayPal запроса cURL командной строки к их API разрешений:

curl https://svcs.sandbox.paypal.com/Permissions/GetAccessToken \
-s  \
--insecure \
-H "X-PAYPAL-SECURITY-USERID: api_username" \
-H "X-PAYPAL-SECURITY-PASSWORD: api_password" \
-H "X-PAYPAL-SECURITY-SIGNATURE: api_signature" \
-H "X-PAYPAL-REQUEST-DATA-FORMAT: NV" \
-H "X-PAYPAL-RESPONSE-DATA-FORMAT: NV" \
-H "X-PAYPAL-APPLICATION-ID: app_id" \
-d requestEnvelope.errorLanguage=en_US \
-d token=token \
-d verifier=code

Я попытался ввести свои учетные данные, токен и верификатор в вышеупомянутой командной строке cURL в мою командную строку и получил успешный ответ.

Однако, когда я попытался с моим приложением PHP, я даже не получаю ответ об ошибке. Вот мой запрос php cURL:

class PayPalSession
{
private $devUsername;
private $devPassword;
private $devSignature;
private $appId;

public function __construct($devUsername, $devPassword, $devSignature, $applicationId, $format)
{
$this->devUsername = $devUsername;
$this->devPassword = $devPassword;
$this->devSignature = $devSignature;
$this->applicationId = $applicationId;
$this->format = $format;
}/** sendHttpRequest
Sends a HTTP request to the server for this session
Input:  $data
Output: The HTTP Response as a String
*/
public function sendHttpRequest($data, $endpoint)
{
//build eBay headers using variables passed via constructor
$headers = $this->buildPaypalHeaders();

//initialise a CURL session
$connection = curl_init();
//set the server we are using (could be Sandbox or Production server)
curl_setopt($connection, CURLOPT_URL, $endpoint);

//stop CURL from verifying the peer's certificate
curl_setopt($connection, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($connection, CURLOPT_SSL_VERIFYHOST, 0);

//set the headers using the array of headers
curl_setopt($connection, CURLOPT_HTTPHEADER, $headers);

//set method as POST
curl_setopt($connection, CURLOPT_POST, 1);

//set the Json body of the request
curl_setopt($connection, CURLOPT_POSTFIELDS, $data);

//set it to return the transfer as a string from curl_exec
curl_setopt($connection, CURLOPT_RETURNTRANSFER, 1);

//Send the Request
$response = curl_exec($connection);

//print $response;

//close the connection
curl_close($connection);

//return the response
return $response;
}/** buildPayPalHeaders
Generates an array of string to be used as the headers for the HTTP request to PayPal
Output: String Array of Headers applicable for this call
*/
private function buildPaypalHeaders()
{
$headers = array (
// API credentials for the API Caller account
'X-PAYPAL-SECURITY-USERID: ' . $this->devUsername,
'X-PAYPAL-SECURITY-PASSWORD: ' . $this->devPassword,
'X-PAYPAL-SECURITY-SIGNATURE: ' . $this->devSignature,

// Application ID
'X-PAYPAL-APPLICATION-ID: ' . $this->applicationId,

// Input and output formats
'X-PAYPAL-REQUEST-DATA-FORMAT : ' . $this->format,
'X-PAYPAL-RESPONSE-DATA-FORMAT : ' . $this->format,
);

return $headers;
}
}

Вот переменные, которые передаются в коде выше:

$format = 'NV';
$endpoint = 'https://svcs.sandbox.paypal.com/Permissions/GetAccessToken'
$data = "requestEnvelope%5BerrorLanguage%5D=en_US&token=$requestToken&verifier=$verificationCode"

..и конечно $requestToken а также $verifierCode был установлен на то, что было предоставлено мне PayPal.

Я подозреваю, что моя проблема в моих данных, которые я передаю "CURLOPT_POSTFIELDS", Формат должен быть «NV» (имя = значение или ключ = значение), но если вы посмотрите на пример PayPal "requestEnvelope.errorLanguage=en_US" это не похоже на простую пару ключ = значение, поэтому я не уверен, как отформатировать это для запроса.

Я попробовал это:

$requestAsArray = array('requestEnvelope' => array("errorLanguage" => "en_US"), "token" => "$requestToken", "verifier" => "$verificationCode");

$data = http_build_query($requestAsArray);

Но до сих пор не получил ответ от PayPal API. Я также попытался отправить запрос в формате JSON и изменить $format в «JSON», но API требует запросов name = value / key = value.

Вот документация PayPal для этого вызова их API: https://developer.paypal.com/docs/classic/permissions-service/integration-guide/PermissionsUsing/

Любая помощь приветствуется!

1

Решение

При использовании заголовка в формате NVP

'X-PAYPAL-REQUEST-DATA-FORMAT : NV'

массив запросов должен быть

    $requestAsArray = array(
'requestEnvelope.errorLanguage' =>"en_US", "token" => "$requestToken", "verifier" => "$verificationCode");

А потом использовать

$data = http_build_query($requestAsArray);

Когда вы используете заголовок в формате JSON

'X-PAYPAL-REQUEST-DATA-FORMAT : JSON'

Массив запроса должен быть

$requestAsArray = array(
'requestEnvelope' => array("errorLanguage" => "en_US")
, "token" => "$requestToken", "verifier" => "$verificationCode");

а затем использовать

$data = json_encode($requestAsArray);

Я использую этот метод в платежных вызовах PayPal Adaptive, и это всегда работает. Это должно работать и в этом случае.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]