проблема с шифрованием динамической кнопки "добавить в корзину" PayPal с php - PullRequest
3 голосов
/ 24 мая 2011

Я создал простую платежную систему, интегрирующую PayPal с WordPress в PHP. В основном я строю список, в котором каждый элемент списка извлекает метаданные с определенной страницы в WordRESS (страница для каждого продукта), и с помощью этих данных динамически формировать «добавить в корзинуКнопка PayPal.это работало нормально!но .. Затем я попытался зашифровать кнопку «добавить в корзину» по понятным причинам.Я нашел программу php, которая должна была это делать (и из того, что я вижу на разных интернет-форумах - большую часть времени выполняет это обещание), и я думаю, что выполнил все инструкции PayPal с сертификатом (private, public, paypals и т. Д.)...)

Хотя я не получаю никакой ошибки со страницы html - когда я нажимаю кнопку добавления в корзину, я получаю ошибку PayPal: «Мы обнаружили проблему с этой корзиной. Если проблемасохраняется, пожалуйста, свяжитесь с продавцом. "но у меня нет никаких подробностей, почему и что я делаю неправильно ..

У меня есть торговый счет в PayPal.

Чтобы удалить ненужные помехи и шум, я построил тестстраница со статическими данными, чтобы проверить, работает ли кнопка правильно, и вот она: рад за любую помощь

базовая тестовая страница:

<?php
include_once "testfunctions.php";
//inserting some test data
$themetacost='100';
$themetaname="testbook";
$themetashipping='20';
//building the paypal button
$line='';
$line.='<form target="paypal" action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank" id="payform" >
            <input type="hidden" name="cmd" value="_cart">
                        <input type="hidden" name="encrypted" value="';
$line.= buildbutton($themetacost,$themetaname,$themetashipping);
$line.='">';
$line.='<input type="image" src="https://www.paypalobjects.com/WEBSCR-640-20110429-1/he_IL/i/btn/btn_cart_SM.gif" border="0" name="submit" alt="PayPal - הדרך הקלה והבטוחה לשלם באופן מקוון!">
                <img alt="" border="0" src="https://www.paypalobjects.com/WEBSCR-640-20110429-1/he_IL/i/scr/pixel.gif" width="1" height="1">
                </form><br/>';
echo $line;

?>

функции php buildbutton и функции шифрования:

<?php
function buildbutton($amount,$bname,$shipping) {
//Sample PayPal Button Encryption: Copyright 2006-2010 StellarWebSolutions.com
//Not for resale  - license agreement at
//http://www.stellarwebsolutions.com/en/eula.php
//Updated: 2010 02 01



$form = array('cmd' => '_cart',
        'business' => 'X@XXX.CO.il', // changed from the original
        'cert_id' => 'XXXXXXXXXXX',// changed from the original
    'shipping' => $shipping,
        //'invoice' => '', //check what this is
        'currency_code' => 'ILS',
        //'no_shipping' => '0', //refers to shipping address
        'add'=>'1',
    'item_name' => $bname,
    'amount' => $amount
    );


    $encrypted = paypal_encrypt($form); 

return $encrypted;
}
function paypal_encrypt($hash)
{
    //Sample PayPal Button Encryption: Copyright 2006-2010 StellarWebSolutions.com
    //Not for resale - license agreement at
    //http://www.stellarwebsolutions.com/en/eula.php
    # private key file to use //

$MY_KEY_FILE = "/home/paypal/my-prvkey.pem";
# public certificate file to use
$MY_CERT_FILE = "/home/paypal/my-prvkey.pem";// 

# Paypal's public certificate
$PAYPAL_CERT_FILE = "/home/paypal/paypal_cert.pem";

# path to the openssl binary
$OPENSSL = "/usr/bin/openssl";

    if (!file_exists($MY_KEY_FILE)) {
        echo "ERROR: MY_KEY_FILE $MY_KEY_FILE not found\n";
    }
    if (!file_exists($MY_CERT_FILE)) {
        echo "ERROR: MY_CERT_FILE $MY_CERT_FILE not found\n";
    }
    if (!file_exists($PAYPAL_CERT_FILE)) {
        echo "ERROR: PAYPAL_CERT_FILE $PAYPAL_CERT_FILE not found\n";
    }
        if (!file_exists($OPENSSL)){
                echo "error with openssl $OPENSSL not found \n";
        }


    //Assign Build Notation for PayPal Support
    //$hash['bn']= 'StellarWebSolutions.PHP_EWP2'; //this is not needed cause i dont have a ewp

    $data = "";
    foreach ($hash as $key => $value) {
        if ($value != "") {
            //echo "Adding to blob: $key=$value\n";
            $data .= "$key=$value\n";
        }
    }

    $openssl_cmd = "($OPENSSL smime -sign -signer $MY_CERT_FILE -inkey $MY_KEY_FILE " .
                        "-outform der -nodetach -binary <<_EOF_\n$data\n_EOF_\n) | " .
                        "$OPENSSL smime -encrypt -des3 -binary -outform pem $PAYPAL_CERT_FILE";

    exec($openssl_cmd, $output, $error);

    if (!$error) {
        return implode("\n",$output);
    } else {
        return "ERROR: encryption failed";
    }
}

?>

Я попытался изменить переменные на числа, чтобы проверить, не существует ли проблема, которая не помогла.

и вот как выглядит зашифрованный источник тестовой страницы:

action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank" id="payform" >

            <input type="hidden" name="cmd" value="_cart">

                        <input type="hidden" name="encrypted" value="-----BEGIN PKCS7-----
MIIBdwYJKoZIhvcNAQcDoIIBaDCCAWQCAQAxggEwMIIBLAIBADCBlDCBjjELMAkG
A1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQw
EgYDVQQKEwtQYXlQYWwgSW5jLjETMBEGA1UECxQKbGl2ZV9jZXJ0czERMA8GA1UE
AxQIbGl2ZV9hcGkxHDAaBgkqhkiG9w0BCQEWDXJlQHBheXBhbC5jb20CAQAwDQYJ
KoZIhvcNAQEBBQAEgYAiFKR0WuQJcr6cQZvDCptQeDNyfipH9pDy1Q58C+ITCZWY
XRkkUOvvL3jniO1GUxsY2JleGAdZWSV1qgnO3uNjj0V3Z0AxbrAiuA0lLd8pscBT
MM+9+1RwjTOUVtOi3PASy1TC4hk6Wq01KUk1DCpbqMtqBZ6sWb5jHRxWqbL08zAr
BgkqhkiG9w0BBwEwFAYIKoZIhvcNAwcECClgCVLJPeXAgAgr8wXDhqI+og==
-----END PKCS7-----"><input type="image" src="https://www.paypalobjects.com/WEBSCR-640-20110429-1/he_IL/i/btn/btn_cart_SM.gif" border="0" name="submit" alt="PayPal - äãøê ä÷ìä åäáèåçä ìùìí áàåôï î÷ååï!">

                <img alt="" border="0" src="https://www.paypalobjects.com/WEBSCR-640-20110429-1/he_IL/i/scr/pixel.gif" width="1" height="1">

                </form><br/>

edit: после изменения в html-форме (не! Функция php encrypt) с '_cart' на '_s-xclick' я получаю другую ошибку:

Адрес электронной почты длябизнеса нет в зашифрованном блобе.Пожалуйста, свяжитесь с вашим продавцом.

, следуя дополнительным советам на различных форумах PayPal, я также пытался обновить сертификаты и ключи (все три из них ..).вообще не помогло!

1 Ответ

2 голосов
/ 24 мая 2011

Я бы изменил cmd на _s-xclick. Все зашифрованные платежи PayPal используют эту команду.

Когда я попробовал это, я получил «Адрес электронной почты для бизнеса отсутствует в зашифрованном блобе. Пожалуйста, свяжитесь с вашим продавцом». ошибка. Вы пытались использовать «Безопасный идентификатор продавца» вместо электронной почты? Это в профиле аккаунта.

Лично я бы рекомендовал использовать API диспетчера кнопок вместо зашифрованных кнопок. https://merchant.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_ButtonMgrAPIIntro его основное преимущество заключается в том, что вы можете вызвать API для получения содержимого кнопки. Зашифрованный большой двоичный объект не может быть дешифрован, чтобы увидеть, действительно ли там находится электронное письмо.

Надеюсь, это поможет. Lorefold

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...