paypal自定义金额变量BMUpdate?

时间:2012-06-28 09:04:25

标签: php paypal sandbox

以下是我的沙箱立即购买按钮的生成代码。我添加了另一个隐藏的输入amount,它将包含一个变量,其总金额(我的网站上没有固定价格)将被发送到paypal。

<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" id="paypal-container-2" method="post">
            <input type="hidden" name="cmd" value="_s-xclick">
            <input type="hidden" name="hosted_button_id" value="EJWG97W7YUN4G">
            <input type="hidden" name="amount" value="<?php echo $total; ?>" />
            <input type="image" src="https://www.sandbox.paypal.com/en_US/i/btn/btn_buynowCC_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>

通过阅读类似问题can't POST item price in paypal sandbox,这种方式会使隐藏的输入amount对用户操纵开放?答案是使用BMUpdateButton API来更新按钮数量。我不知道如何将BMUpdateButton API实现到PHP中。我如何用PHP实现这一目标?有教程吗?非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

继承人基础知识lol还需要其他功能解码

function updateItemPP($buttoncode, $amount, $item_name)

{

$API_USERNAME ="yourname";

$API_PASSWORD = "yourpassY";

$API_SIGNATURE = "yoursig";

$API_ENDPOINT = 'https://api-3t.paypal.com/nvp';

$VERSION = '60.0';



$ch=curl_init();



curl_setopt($ch, CURLOPT_URL,$API_ENDPOINT);

curl_setopt($ch, CURLOPT_VERBOSE, 1);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);

curl_setopt($ch, CURLOPT_POST, 1);

$nvpreq="USER=".urlencode($API_USERNAME)."&PWD=".urlencode($API_PASSWORD)."&SIGNATURE=".urlencode($API_SIGNATURE)."&VERSION=".urlencode($VERSION)."&METHOD=BMCreateButton&HOSTEDBUTTONID=".urlencode($buttoncode)."&BUTTONTYPE=BUYNOW&L_BUTTONVAR1=amount=".urlencode($amount)."&L_BUTTONVAR2=item_name=".urlencode($item_name);

echo "here is the request string:\n".$nvpreq;

curl_setopt($ch,CURLOPT_POSTFIELDS,$nvpreq);

$response = curl_exec($ch);

$response = urldecode($response);

echo "this is update response".$response;

$nvpResArray=$this->deformat($response);

$ack = ($nvpResArray["ACK"]);

$HostedButtonID=($nvpResArray["HOSTED_BUTTON_ID"]);

if ($ack=="FAILOR")

return "failor";

else 

return $HostedButtonID;

}

这个功能不是我写的,而是另一个用户

static function deformat( $str )
    {
        $result = array();

        while ( strlen( $str ) ) {
            // postion of key

            $keyPos = strpos( $str, '=' );

            // position of value
            $valPos = strpos( $str, '&' ) ? strpos( $str, '&' ): strlen( $str );

            /*getting the Key and Value values and storing in a Associative Array*/
            $key = substr( $str, 0, $keyPos );
            $val = substr( $str, $keyPos + 1, $valPos - $keyPos - 1 );

            //decoding the respose
            $result[ strtoupper( urldecode( $key ) ) ] = urldecode( $val );
            $str = substr( $str, $valPos + 1, strlen( $str ) );
            //echo  substr( $str, $valPos + 1, strlen( $str ) );
        }


        return $result;
    }

这应该会有所帮助,但它也会返回一个新的按钮代码,所以请务必将其包含在页面上的按钮调用中

答案 1 :(得分:0)

以这种方式将支付金额作为输入(即使是隐藏的字段),是不安全的,并且可能导致黑客为一件物品支付0.1英镑,这应该花费+ 100英镑......并且完全收到货物!

我的防范方法是将“立即购买”付款按钮POST到处理页面。当用户同意购买项目时,应计算总数并将其存储在链接到唯一标识符的数据库中。处理页面将使用标识符从数据库中提取总金额并使用此值进行付款。当验证支付数据(例如business_email和金额)时,用户将被重定向到PayPal以完成付款 - 支付未触及的金额。

我希望这有帮助!