В настоящее время я много занимался поиском того, как данные должны быть структурированы до шифрования PKCS7 для правильного использования в кнопке PayPal Buy-Now. На данный момент лучшими данными, которые я нашел на данный момент относительно структуры данных, является пример кода Paypal, который демонстрирует, как зашифрованная кнопка появляется на вашем веб-сайте (это можно найти здесь:https://www.paypal.com/cgi-bin/webscr?cmd=p/xcl/rec/ewp-techview-outside)
На первый взгляд, мои результаты выглядят точно так же, как показано в ссылке PayPal, за исключением того, что, когда я нажимаю кнопку, я получаю ошибку PayPal, в которой говорится: «Мы не смогли расшифровать идентификатор сертификата». Поэтому я думаю, что проблема заключается либо в том, как структурированы данные, либо в самом фактическом шифровании (я также провел много отладок и убедился, что все сертификаты и ключи успешно зарегистрированы). Код ниже демонстрирует кнопку, которую создает мой php-код.
<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="image" src="https://www.sandbox.paypal.com/en_US/i/btn/x-click-but23.gif" border="0" name="submit" alt="Make payments with PayPal - it\'s fast, free and secure!">
<input type="hidden" name="encrypted" value="-----BEGIN PKCS7-----MIIH6QYJKM585oH7A[to much data to show]9QRQIpFZzRK6cJu6QQO+q/xfiw==-----END PKCS7-----">
</form>
Это мои данные до шифрования:
cert_id=9CE6NSORUBVMC cmd=_xclick [email protected] item_name=Cat Litter #40 amount=12.95 no_shipping=1 return=http://test183653.comli.com/MainPage.php cancel_return=http://test183653.comli.com/MainPage.php no_note=1 currency_code=USD bn=PP-BuyNowBF
В настоящее время я использую приведенный выше формат в результате добавления кусочков информации в Интернете, но, похоже, он не работает (также не работает, когда я удаляю все пробелы в строке). Таким образом,
ОСНОВНОЙ ВОПРОС: Может кто-нибудь сказать мне или указать мне правильное направление, чтобы узнать правильный формат данных перед шифрованием?
Для тех, кто заинтересован проверить, является ли код ошибками при неправильном шифровании, функцию, которая шифрует данные, можно найти ниже:
function encryptButton($parameters) {
if (($this->certificateID == '') ||
!IsSet($this->certificate) ||
!IsSet($this->paypalCertificate)) {
return FALSE;
}
$clearText = '';
$encryptedText = '';
$clearText = 'cert_id='.$this->certificateID;
foreach (array_keys($parameters) as $key) {
$clearText .= "\n{$key}={$parameters[$key]}";
}
$clearFile = tempnam($this->tempFileDirectory, 'cle');
$signedFile = preg_replace('/cle/', 'signed', $clearFile);
$encryptedFile = preg_replace('/cle/', 'encrypted', $clearFile);
$out = fopen($clearFile, 'wb');
fwrite($out, $clearText);
fclose($out);
//openssl_pkcs7_sign occurs here
if (!openssl_pkcs7_sign($clearFile, $signedFile, $this->certificate, $this->privateKey, array(), PKCS7_BINARY)) {
return FALSE;
}
$signedData = explode("\n\n", file_get_contents($signedFile));
$out = fopen($signedFile, 'wb');
fwrite($out, base64_decode($signedData[1]));
fclose($out);
//openssl_pkcs7_encrypt occurs here
if (!openssl_pkcs7_encrypt($signedFile, $encryptedFile, $this->paypalCertificate, array(), PKCS7_BINARY)) {
return FALSE;
}
$encryptedData = explode("\n\n", file_get_contents($encryptedFile));
$encryptedText = $encryptedData[1];
@unlink($clearFile);
@unlink($signedFile);
@unlink($encryptedFile);
return $encryptedText;
}function getEncryptedString($params) {
return "-----BEGIN PKCS7-----".str_replace("\n", "", $this->encryptButton($params))."-----END PKCS7-----"; }
}
Задача ещё не решена.
Других решений пока нет …