【问题标题】:Paypal html button custom field limitPaypal html按钮自定义字段限制
【发布时间】:2016-02-28 16:41:40
【问题描述】:

Paypal html 按钮的 自定义 字段限制为 256 个字符。有没有办法增加这个限制,或者我可以使用其他字段(如 custom1、custom2、other)等...

谢谢

【问题讨论】:

  • 不,为什么需要超过 256 个字符?
  • 因为我发送了很多自定义数据
  • 只是为了通过 IPN 在您的服务器上接收它?
  • 接收和更新数据库
  • 在重定向到贝宝之前将数据添加到数据库

标签: php paypal paypal-ipn php-5.4


【解决方案1】:

你可以使用这些:

<input type="hidden" name="on0" value="Size">
<input type="hidden" name="on1" value="Position">

第一个选项字段名称和标签。 os0 变量包含此选项字段的相应值。例如,如果 on0 是大小,则 os0 可能很大。

第二个选项字段名称和标签。 os1 变量包含此选项字段的相应值。例如,如果 on1 是颜色,那么 os1 可能是蓝色。 通过增加选项名称索引(on0 到 on6),您最多可以指定 7 个选项字段名称(6 个带有订阅按钮)。

Optional for Buy Now, Add to Cart, Subscribe, Automatic Billing, and Installment Plan buttons
Not used with Donate or Buy Gift Certificate buttons

【讨论】:

  • 这些字段没有特定用途吗?
  • 是的,这些用于特定目的。但我们也可以将其用于其他目的。
【解决方案2】:

不是通过自定义字段发送全部数据,而是将数据保存在数据库中,然后发送记录 ID。在 ipn / cancel 上,检索 ID 并更新/删除记录。

为此,首先您需要更改按钮代码以发布到您自己网站而不是贝宝上的 php 文件,因此常规按钮代码:

<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_xclick">
<input type="hidden" name="business" value="seller@designerfotos.com">
<input type="hidden" name="item_name" value="hat">
<input type="hidden" name="item_number" value="123">
<input type="hidden" name="amount" value="15.00">
<input type="image" name="submit" border="0"
src="https://www.paypalobjects.com/en_US/i/btn/btn_buynow_LG.gif"
alt="PayPal - The safer, easier way to pay online">
</form>

变成:

<form action="buttonhandler.php" method="post">
    <input type="hidden" name="item_number" value="123">
    <input type="image" name="submit" border="0"
    src="https://www.paypalobjects.com/en_US/i/btn/btn_buynow_LG.gif"
    alt="PayPal - The safer, easier way to pay online">
</form>

请注意,缺少一些字段 - cmd、business、item_name 和 amount,因为我们将在 php 中生成这些字段。

您可以在按钮 html 中定义金额,但最好在您的数据库中定义它,然后您可以自动拒绝用户支付错误金额的订单(通过摆弄发送到贝宝的数据 -他们目前可以使用您的普通 html 按钮系统执行的操作)。

在 php 文件中,您收集产品信息,将订单保存到数据库,并生成通常包含在按钮表单字段中的 paypal 数据

//buttonhandler.php

$item_number = $_POST['item_number'];
//get item name, price from DB
//Note made up ORM code here for brevity - 
//use whatever db acccess method you usually do:
$item = Items::getOne($item_number);

//save order in db, and retrieve order id. You can save whatever you need into the order, 
//this is a simple example that just takes item number, amount and timestamp
Orders::add($item->number, $item->amount, time());
$orderId = Orders::lastInsertId();

//create paypal data
$paypalData=array(
    'business'=>'seller@designerfotos.com',
    'cmd'=>'_xclick',
    'notify_url'=>'http://yoursite.com/1hd-ff-ipn.php', //call this something random, you dont want it getting hit by web bots
    'return'=>'http://yoursite.com/thanks-for-your-order.php',
    'cancel_return'=>'http://yoursite.com/cancel.php?orderid=' . $orderId,
    'amount'=>$item->amount,
    'currency_code'=>'GBP',
    'item_number'=>$item->number,
    'item_name'=>$item->name,
    'custom'=>$orderId
);
 //build a query string and redirect to paypal
$query_string = http_build_query($paypalData);
header("Location: https://www.paypal.com/cgi-bin/webscr?" . $query_string);
//done
die();

现在您可以在 ipn 脚本中对照 orderid 交叉检查价格:

//1hd-ff-ipn.php
$order = Orders::getOne($_POST['custom']);
if ($_POST['mc_gross'] != $order->amount) {
    //price mismatch, handle accordingly
}
//more checks here as required, then
$order->paymentStatus = 'complete';
$order->save(); 

并在您的取消页面中删除订单

//cancel.php
Orders::delete($_GET['orderid');
?>
<h1>Sorry you cancelled</h1>

您还可以每小时/每天/任何时间运行一个 crom 来处理废弃的订单

//cron.php
//delete pending older than 1 day, 
Orders::deleteWhere('status = ? and ordered_on <?','pending', time() - (24 * 60 * 60));

【讨论】:

  • 非常感谢,我会按照您的方法进行操作,但我认为最好使用 jQuery 将参数发送到我的 cancel_return url。如果我完全按照您的描述进行操作,将需要进行太多更改。
猜你喜欢
  • 2011-10-13
  • 2020-03-11
  • 2017-11-14
  • 2017-04-23
  • 2020-10-18
  • 2018-06-18
  • 2020-08-06
  • 2012-07-23
  • 2013-05-30
相关资源
最近更新 更多