PayPal购物车上传转到白页

时间:2016-02-26 16:40:17

标签: php paypal

我目前正在尝试将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"];

为了简化这里的事情,发送给paypal的变量(没有间距):

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才生成按钮{ {1}},quantity而不是item_name_1quantity_1等。但是,如果您这样做,当您点击进入Pay​​Pal时,它会说您的购物车是空的。 如果我手动将项目变量更改为_1,则按钮将按预期工作,显示PayPal登录页面,其中包含订单中列出的所有项目。

PayPals按钮生成器有问题吗?

更新3

它进入白色屏幕的原因是因为如果您定义cmd变量,它将只添加另一个变量而不是覆盖旧变量。 Paypal然后不知道该做什么,因为有2个。

似乎没有办法创建上传购物车按钮,除非您使用html手动创建,这可能会被篡改。

更新4

如果您将buynow更改为cart并从按钮中删除<input type="hidden" name="cmd" value="_cart">,那么它就能正常运行。由于某些原因,使用upload=1变量不会覆盖add=1按钮的cart功能,并导致您的购物篮显示为空。

但即使这在html版本中有效,我也需要能够使用加密按钮,所以除了将订单分组到一个项目之外我仍然不知道该做什么,然后使用custom变量来将订单详细信息发送到IPN。

1 个答案:

答案 0 :(得分:0)

由于尚未得到答复,我想我也可以回答那些与我在同一条船上的人。

虽然这不是一个真正的答案,你是否可以实现我尝试使用Paypal按钮生成器实现的目标,但我最终使用快速结账API(这是Paypal支持建议而不是按钮)他们的一些建议没有起作用后发电机。)

https://developer.paypal.com/docs/integration/direct/express-checkout/integration-jsv4/server-side-REST-integration/

自从我上次使用它以来,这个API似乎有所改变,现在可能有更好的方法。