【发布时间】:2016-02-26 16:40:17
【问题描述】:
我目前正在尝试将 PayPal 结帐按钮集成到网站,但没有取得多大成功。
基本上,用户可以将产品编号和数量添加到存储在服务器上的购物车中。然后,他们可以转到“查看购物车”页面,该页面将向他们显示购物车中的产品。从那里他们应该能够单击一个按钮将所有相关信息传输到 PayPal,以便他们可以使用 PayPal 结帐,但我生成的按钮只是转到一个白页(在 PayPal 的末尾https://www.paypal.com/cgi-bin/webscr)。
这里是生成按钮的代码:
$sendPayData = array(
"METHOD" => "BMCreateButton",
"USER" => "****",
"PWD" => "****",
"SIGNATURE" => "****",
"BUTTONCODE" => "CLEARTEXT", //Just while debugging
"BUTTONTYPE" => "BUYNOW",
"BUTTONCOUNTRY" => "GB",
"BUTTONIMAGE" => "reg",
"VERSION" => "65.1"
);
$productInfo = array();
$connection = new mysqli(constant("PERCH_DB_SERVER"),constant("PERCH_DB_USERNAME"),constant("PERCH_DB_PASSWORD"),constant("PERCH_DB_DATABASE"));
$sql = 'SELECT * FROM perch2_shop_products WHERE productCode IN ("'.implode('","',array_keys($_SESSION["cartProducts"])).'")';
if($connection->connect_error){
die("Connection Failed: ".$connection->connect_error);
}
$result = $connection->query($sql);
$total = 0;
if($result->num_rows>0){
$i = 0;
while($row = $result->fetch_assoc()){
$sendPayData["L_BUTTONVAR".((3*$i)+1)] = 'item_name_'.($i+1).'='.preg_replace("/[^A-Za-z0-9 ]/", '',$row["productTitle"]);
$sendPayData["L_BUTTONVAR".((3*$i)+2)] = 'quantity_'.($i+1).'='.$_SESSION["cartProducts"][$row["productCode"]];
$sendPayData["L_BUTTONVAR".((3*$i)+3)] = 'amount_'.($i+1).'='.$row["productPrice"];
$total += $row["productPrice"];
$i++;
}
}
$i--;
$sendPayData["L_BUTTONVAR".((3*$i)+4)] = "cmd=_cart";
$sendPayData["L_BUTTONVAR".((3*$i)+5)] = "upload=1";
$sendPayData["L_BUTTONVAR".((3*$i)+6)] = "currency_code=GBP";
$sendPayData["L_BUTTONVAR".((3*$i)+7)] = "business=****";
$sendPayData["L_BUTTONVAR".((3*$i)+8)] = "no_shipping=1";
$sendPayData["L_BUTTONVAR".((3*$i)+9)] = "no_note=1";
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_URL, 'https://api-3t.paypal.com/nvp?'.http_build_query($sendPayData));
$nvpPayReturn = curl_exec($curl);
curl_close($curl);
parse_str($nvpPayReturn, $returnArray);
echo $returnArray["WEBSITECODE"];
为了让事情更简单,这里是发送到贝宝的变量(没有空格):
https://api-3t.paypal.com/nvp?
METHOD=BMCreateButton&
USER=****&
PWD=****&
SIGNATURE=****&
BUTTONCODE=CLEARTEXT&
BUTTONTYPE=BUYNOW&
BUTTONCOUNTRY=GB&
BUTTONIMAGE=reg&
VERSION=65.1&
L_BUTTONVAR1=item_name_1%3DName1&
L_BUTTONVAR2=quantity_1%3D1&
L_BUTTONVAR3=amount_1%3D6.85&
L_BUTTONVAR4=item_name_2%3DName2&
L_BUTTONVAR5=quantity_2%3D1&
L_BUTTONVAR6=amount_2%3D5.99&
L_BUTTONVAR7=item_name_3%3DName3&
L_BUTTONVAR8=quantity_3%3D1&
L_BUTTONVAR9=amount_3%3D12.85&
L_BUTTONVAR10=cmd%3D_cart&
L_BUTTONVAR11=upload%3D1&
L_BUTTONVAR12=currency_code%3DGBP&
L_BUTTONVAR13=business%3D****&
L_BUTTONVAR14=no_shipping%3D1&
L_BUTTONVAR15=no_note%3D1
更新 1
原来 paypal 没有应用 cmd 变量,而 cmd 仍然是:
<input type="hidden" name="cmd" value="_xclick">
代替:
<input type="hidden" name="cmd" value="_cart">
如果我找出原因,我会更新。
正如之前所说,这似乎是 PayPal 的问题,而不是我的 php,因为当我转移到 PayPal 网站时出现白屏。
更新 2
似乎如果您将按钮类型设置为cart 而不是buynow,那么它会将cmd 设置为_cart 但只有在您有item_name、quantity 等时才会生成一个按钮item_name_1、quantity_1 等。但是,如果您这样做,当您点击进入 PayPal 时,它会说您的购物车是空的。
如果我手动将项目变量更改为 _1 ,那么按钮将按预期工作,显示 PayPal 登录页面,其中包含订单中列出的所有项目。
PayPals 按钮生成器有问题吗?
更新 3
它进入白屏的原因是,如果您定义 cmd 变量,它只会添加另一个变量,而不是覆盖旧的变量。 Paypal 然后不知道该怎么做,因为有 2 个。
似乎没有办法创建上传购物车按钮,除非您使用 html 手动制作,否则可能会被篡改。
更新 4
如果您将buynow 更改为cart 并从按钮中删除<input type="hidden" name="cmd" value="_cart">,则它可以工作。由于某种原因,使用upload=1 变量不会覆盖cart 按钮的add=1 函数并导致您的购物篮显示为空。
但即使这在 html 版本中有效,我也需要能够使用加密按钮,所以除了将订单分组到一个项目然后使用 custom 变量发送之外,我仍然不知道该怎么做通过 IPN 获取订单详情。
【问题讨论】:
-
白页可能意味着可能的语法错误。使用报错php.net/manual/en/function.error-reporting.php
-
我有错误报告,但我应该更清楚。白页在 PayPal 的末尾
-
我真的不需要使用沙盒,因为我不需要处理付款我只需要进入购物车概览并登录屏幕,它只是显示为白色。
-
你曾经解决过这个问题吗?我也有类似的问题,需要支持加密按钮。