用php加密动态“添加到购物车”贝宝按钮的问题

Posted

技术标签:

【中文标题】用php加密动态“添加到购物车”贝宝按钮的问题【英文标题】:problem with encrypting dynamic "add to cart" paypal button with php 【发布时间】:2011-08-31 11:33:16 【问题描述】:

我在php中构建了一个简单的支付系统,将paypal和wordpress集成在一起 基本上,我构建了一个列表,其中每个列表项从 wordress 中的特定页面(每个产品的页面)检索元数据,并使用此数据动态构建“添加到购物车”贝宝按钮。这很好用!但.. 然后出于明显的原因,我尝试加密“添加到购物车”按钮。我找到了一个应该做到这一点的 php 程序(并且从我在不同的互联网论坛中看到的 - 大部分时间都兑现了这个承诺),并且我认为我遵循了带有证书的所有贝宝说明(私人、公共、贝宝等) ..)

虽然我没有从 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" >
                <img  border="0" src="https://www.paypalobjects.com/WEBSCR-640-20110429-1/he_IL/i/scr/pixel.gif"  >
                </form><br/>';
echo $line;

?>

php 构建按钮和加密功能:

<?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" >

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

                </form><br/>

编辑:在将 html 表单(不是!php 加密功能)从“_cart”更改为“_s-xclick”后,我得到一个不同的错误:

企业的电子邮件地址不在加密的 blob 中。请联系您的商家。

根据各种 paypal 论坛中的更多建议,我还尝试更新证书和密钥(全部三个......)。一点帮助都没有!

【问题讨论】:

为什么不直接检测篡改而不加密呢?此外,该代码将适用于无法安装所有 OpenSSL 内容的更多托管计划。查看以下答案:***.com/q/14489512/105539 这是一个老问题,不再相关(很久以前问过这个问题)但是:我认为“稍后验证”方式不是一个好策略。在特定的用例中它会使代码复杂化。而且我没有看到很多涉及汇款的代码在“稍后验证”的情况下可以很好地工作。 一个有点老的问题,但我认为这个信息与任何登陆这里的人有关:***.com/questions/4106376/… 【参考方案1】:

我会将 cmd 更改为 _s-xclick。所有 PayPal 加密支付都使用此命令。

当我尝试它时,我得到了 “企业的电子邮件地址不在加密的 blob 中。请联系您的商家。”错误。您是否尝试过“安全商家 ID”而不是电子邮件?它在帐户的个人资料中。

我个人建议使用按钮管理器 API 而不是加密按钮。 https://merchant.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_ButtonMgrAPIIntro 它的主要优点是您可以调用 API 来检索按钮的内容。加密的 blob 无法真正解密以查看电子邮件是否确实存在。

我希望这会有所帮助。 洛尔福尔

【讨论】:

感谢 lorefold,我今天也发现了 _s-xlick 的问题,现在我收到了电子邮件地址问题消息。实际上我确实使用了安全的商家 ID 而不是电子邮件,反之亦然。没有帮助。想不通 - 我会查看这个按钮 api 并回来 好的,我尝试了 paypal nvp api 按钮 api,它对我有用,所以我将离开这个开发路径。仍然无法弄清楚应用程序出了什么问题..【参考方案2】:

检查 OpenSSL 版本是否更改或证书是否有问题。

您可以参考Paypal重新生成证书并上传到Paypal。

【讨论】:

以上是关于用php加密动态“添加到购物车”贝宝按钮的问题的主要内容,如果未能解决你的问题,请参考以下文章

仅在商店中用 woocommerce 中的贝宝结帐替换添加到购物车按钮

我需要加密 Paypal 添加到购物车按钮吗?

贝宝购物车变量传递的概念问题

动态加密的贝宝按钮?

Magento购物车页面中的贝宝支付标准?

将贝宝和“添加到购物车”添加到我的 wamp 服务器