Я интегрировал адаптивные платежи PayPal в один из плагинов WordPress. Мой функционал полностью готов и работал до вчерашнего дня. Однако, когда я начал с финального тестирования, я застрял с этим исключением —
PPConnectionException Object ( [url:PPConnectionException:private] => https://svcs.sandbox.paypal.com/AdaptivePayments/Pay [data:PPConnectionException:private] => [message:protected] => error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number
........) //I am just pasting necessary piece of error to understand the problem
Я использовал эту библиотеку — https://github.com/paypal/adaptivepayments-sdk-php
Я тестирую его в среде песочницы.
Кажется, проблема в OpenSSL или cURL.
Я много искал решение, но не нашел никакого полезного ответа.
Я также вставляю пример кода ниже (это для «параллельного» метода оплаты, но ни этот, ни другие методы не работают) —
require_once('../PPBootStrap.php');
require_once('../Common/Constants.php');
define("DEFAULT_SELECT", "- Select -");
if(isset($_POST['receiverEmail'])) {
$receiver = array();
/*
* A receiver's email address
*/
for($i=0; $i<count($_POST['receiverEmail']); $i++) {
$receiver[$i] = new Receiver();
$receiver[$i]->email = $_POST['receiverEmail'][$i];
/*
* Amount to be credited to the receiver's account
*/
$receiver[$i]->amount = $_POST['receiverAmount'][$i];
/*
* Set to true to indicate a chained payment; only one receiver can be a primary receiver. Omit this field, or set it to false for simple and parallel payments.
*/
$receiver[$i]->primary = $_POST['primaryReceiver'][$i];
}
$receiverList = new ReceiverList($receiver);
}
$payRequest = new PayRequest(new RequestEnvelope("en_US"), $_POST['actionType'], $_POST['cancelUrl'], $_POST['currencyCode'], $receiverList, $_POST['returnUrl']);
// Add optional params
if($_POST["memo"] != "") {
$payRequest->memo = $_POST["memo"];
}
$service = new AdaptivePaymentsService(Configuration::getAcctAndConfig());
try {
/* wrap API method calls on the service object with a try catch */
$response = $service->Pay($payRequest);
} catch(Exception $ex) {
require_once '../Common/Error.php';
/*******
***************************************************
PLEASE NOTE: the code is breaking here, an exception is thrown
***************************************************
*******/
exit;
}
$_POST
данные передаются из другого файла.
Я интегрировал приведенный выше код в свой плагин (в WordPress). На самом деле, если я запускаю вышеупомянутую функциональность непосредственно в отдельном файле PHP, даже это не работает. Итак, ясно, что проблема в чем-то другом. Кажется, проблема в соединении с PayPal и моим сервером.
Я не получаю, все работало до вчерашнего дня, но вдруг перестало работать. Кроме того, на моем сервере ничего не обновлялось, связанное с openssl, cURL или PHP.
Любая помощь будет принята с благодарностью. Спасибо !!!
РЕДАКТИРОВАТЬ:
Изменение номера версии openssl решает проблему. Тем не менее, я до сих пор обеспокоен тем, какой номер версии 1
а также 4
правильно и будет работать в будущем.
Кроме того, есть ли проблемы безопасности, связанные с изменением значения с 3
к чему-то еще?
Если бы кто-то мог уточнить это, было бы здорово. Еще раз спасибо.
У меня такая же проблема. Похоже, что PayPal вчера внес некоторые изменения в ответ на проблему безопасности. Загрузка новой версии PayPal PHP SDK, которая была только что выпущена, должна исправить это
https://github.com/paypal/rest-api-sdk-php/releases/tag/v0.13.1
Когда я делаю любое из следующих изменений в файле PPHttpConfig.php, это работает —
CURLOPT_SSLVERSION => 4
ИЛИ ЖЕ
CURLOPT_SSLVERSION => 1
2
не работает и 3
выбрасывает исключение.
Я держу номер версии 1
а пока как я вижу номер версии 3
заменяется 1
в ссылке, предоставленной @Phil
Я также отредактировал свой ответ для еще одного небольшого запроса. Если бы кто-нибудь мог ответить на это, было бы здорово.
Проблема безопасности теперь печально известна ПУДЕЛЬ атака, которая делает SSLv3 совершенно небезопасным.
От источник cURL, Вы можете увидеть, что означают значения (//
комментарии мои):
enum {
CURL_SSLVERSION_DEFAULT, // 0, probably good
CURL_SSLVERSION_TLSv1, // 1, works
CURL_SSLVERSION_SSLv2, // 2, insecure
CURL_SSLVERSION_SSLv3, // 3, insecure
CURL_SSLVERSION_LAST /* never use, keep last */ // 4
};
Таким образом, 1 означает TLSv1, и, как говорится в комментарии, «никогда не использовать», 1, вероятно, лучше, чем 4, и, возможно, 0 лучше, чем 1, потому что он может попытаться использовать TLSv1 (или TLSv1.x или что-либо другое, которое будет использоваться по умолчанию в будущих версиях cURL).
Тем не менее, я не тестировал 0 на нескольких системах, а использовал версию протокола SSL / TLS «по умолчанию» может быть имею ввиду SSLv3 вместо самой последней и самой большой и поэтому не мог работать, поэтому YMMV.