【问题标题】:Encrypting PayPal Button加密 PayPal 按钮
【发布时间】:2014-01-03 18:33:00
【问题描述】:

我正在动态加密我的 Paypal 按钮,但是当单击“订阅”按钮时,我从 Paypal 收到错误消息:“调度错误,请检查日志文件以获取更多信息”。

我用来生成按钮的代码:

<form id="suf" onsubmit="return newUser();" action="<?php echo $PPBtnURL; ?>" method="POST">
    <?php
        $form = array();
        $form['business']=$PPbtnUser;
        $form['itemname']=$_POST['item_name'];
        $form['itemnumber']=$_POST['item_number'];
        $form['currency_code']="USD";
        $skip_a2 = ($res['a2'] <= $res['a1']);
        foreach($res as $k=>$v){
            if($skip_a2 && ($k == "a2" || $k=="p2" || $k=="t2")){continue;}
            if($k == "trial1" || $k == "trial2"){continue;} 
            $form[$k]=$v;                                   
        }
        $form['src']=1;
        $form['rm']=2;
        $form['return']="https://www.mysite.com/signup2.php";
        $form['cancel_return']="https://www.mysite.com/";
        $form['bname']=$_POST['bname'];
        $form['fname']=$_POST['fname'];
        $form['lname']=$_POST['lname'];                         
        $form['pwone']=$_POST['pwone'];
        $form['pwtwo']=$_POST['pwtwo'];

        $encrypted = paypal_encrypt($form); 

        function paypal_encrypt($hash){
            global $MY_KEY_FILE;
            global $MY_CERT_FILE;
            global $PAYPAL_CERT_FILE;
            global $OPENSSL;

            // private key file to use
            $MY_KEY_FILE = "/home/mysite/mysite.com/prvkey.pem";
            // public certificate file to use
            $MY_CERT_FILE = "/home/mysite/mysite.com/a62ecbe3015a2165c8859b953753038a-pubcert.pem";
            // Paypal's public certificate
            $PAYPAL_CERT_FILE = "/home/mysite/mysite.com/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";
            }

            //Assign Build Notation for PayPal Support
            $hash['bn']= 'StellarWebSolutions.PHP_EWP2';

            $data = "";
            foreach ($hash as $key => $value) {
                if ($value != "") {
                    $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";
            }
        };
    ?>
    <input type="hidden" name="cmd" value="_s-xclick">
    <input type="hidden" name="encrypted" value="<?PHP echo $encrypted; ?>">
    <input type="image" src="https://www.sandbox.paypal.com/en_US/i/btn/btn_subscribeCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
    <img alt="" border="0" src="https://www.sandbox.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1">
</form>

我按照步骤操作并使用了大部分示例代码here。

什么可能导致此错误?我没有来自 PHP 的错误。

额外问题:Paypal 指的是什么日志文件?

【问题讨论】:

  • 哪个服务器日志?我的 ipn 日志中没有任何内容,php 中也没有任何内容,就像我说的那样。除了贝宝如何访问我服务器上的任何日志?

标签: php button encryption paypal


【解决方案1】:

现在有点晚了,但如果有帮助的话:我在遵循同一个教程后遇到了同样的错误,虽然我在你的代码中看不到问题,但我发现只要 $ 中有东西我就会收到这个错误表单被传递到 PayPal 不喜欢的 paypal_encrypt()。

tl;dr:$form 中的无效数据会触发此“有用”错误

另外,请注意,您将数据从 $_POST 直接传递到 $openssl_cmd 而不转义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 2012-09-04
    • 2011-04-13
    • 2011-09-02
    • 1970-01-01
    • 2012-08-23
    • 2016-07-09
    相关资源
    最近更新 更多