使用 php 成功完成 paypal 货币交易后提交表单

Posted

技术标签:

【中文标题】使用 php 成功完成 paypal 货币交易后提交表单【英文标题】:submitting the form after successful paypal money transaction using php 【发布时间】:2012-08-03 10:21:44 【问题描述】:

我已经制作了一个表格。目前此表单执行以下操作:

    客户填写表格(创建订单) 点击“提交”按钮 所有表单条目都输入到数据库中。

我想将其更改为执行以下操作:

    客户填写表格 在表格末尾有一个文本框,显示此订单将花费他多少费用。 点击“提交”按钮(如果接受价格) 重定向到贝宝 如果支付成功 -> 所有表单条目都输入到数据库中。否则 -> 回显“交易失败”。

这是我到目前为止所做的:

“form.php”内容

<html><head><title>Title</title></head><body>
<form action="php-form-processor.php" method="post">
    <table border="0" cellspacing="5" width = "500">
        <tr>
            <td align="right" >Choose an Item:</td>
            <td align="left">
            <select name="formItem" value="<?=$varItem;?>" class="input_full" >
                <option value="1">Cheese</option>
            </select>
            </td>
        </tr>
        <tr bgcolor="#D0E8F5">
            <td align="right" >Item count:</td>
            <td align="left">
                <input type="text" name="formItemCount" maxlength="50" value="<?=$varItemCount = 1;?>"  class="input_full" />
            </td>
        </tr>
    </table>
    <p align="center">
    <input type="submit" name="formSubmit" align = "center" value="Submit" />
    </p>
</form></body></html>

“php-form-processor.php”内容

<?php
if($_POST['formSubmit'] == "Submit")

    $varItem = $_POST['formItem'];
    $varItemCount = $_POST['formItemCount'];

    //database stuff
    $username = "...";
    $password = "...";
    $hostname = "..."; 
 // connect and add to the database varItem and varItemCount
    mysql_query($sql);
    mysql_close($dbhandle);

?>

表单要大得多,但我已经简化了 *** 的版本。订单的价格必须根据“varItem”和“varItemCount”的值而变化。基本上我想在将订单写入数据库之前添加“使用 PayPal 支付”选项。 附言我已经注册了 paypal Sandbox 帐户并添加了“买家”和“卖家”。

接下来我该怎么做?

编辑:好的,这里有一个如何解决问题的小指南。这里有一些建议:

首先,下载paypal IPN listener wrapper:https://github.com/Quixotix/PHP-PayPal-IPN 然后注册 SandBox 账户加 1 个买家和 1 个卖家账户 以卖家身份登录并创建表单(使用非托管按钮!) 将表单放入您的页面并通过“自定义”输入解析 ID 或任何其他必要信息(可以在此处找到一些有用的建议:http://www.devshed.com/c/a/PHP/Creating-a-Paypal-IPN-System-in-PHP-Part-Two/) 现在在表单提交后重定向到此页面 别忘了在 paypal 卖家账户中启用 IPN,并在必要的地址字段中输入 IPNlistener 链接 提交贝宝表单并等待听众回复 完成

整个过程是这样的:

    客户填写表格 提交表单后 - 所有条目都写入数据库 + ID + 1 个名为“已付款”的附加字段,表示:1 - 如果客户为订单付款,0 - 如果没有 使用 header("Location: URL") 从 Form_Processing 重定向到 Paypal_Form 使用“会话”将订单 ID 写入会话或使用 POST 消息 提交 PaypalForm 并使用“自定义”字段作为我们订单 ID 的载体 设置监听器以更新数据库如下:如果交易成功 -> 将数据库列“已支付”更新为 1(完成)。使用“自定义”字段中的 ID 选择所需的订单,即:

$sql = "UPDATE paypal_test SET payed = '1' WHERE id = '".$_POST['custom']."'";

现在我们有了一个包含已完成和未完成表格的数据库。另外,您可以编写一个逻辑来删除“旧”未完成的订单。出于这个原因,您可以创建名为“日期”的附加列,然后进行比较: if (current_date.days - old_date.days > 7) -> 从数据库中删除。就是这样!

【问题讨论】:

您的实际问题是什么?在我看来,您仍然需要 Paypal 确认此交易(您的第 5 步)。您是否为此使用了 IPN 机制? 确保您正在检查该人支付的金额 - 您可以通过一些客户端黑客行为将输入 POST 变量修改为 PayPal,这样有人可以为 100 美元的商品支付 1 美元,除非您检查他们可以逃脱惩罚。如果我没记错,PayPal 会回复金额。还要确保这是正确的交易类型(我认为是“Web Payment Accept”,但有很多不同的交易,例如“eCheque”,它们并不代表已完成的交易——IPN 发送所有通知,包括退款) 哎呀,没有足够的时间来编辑评论,所以我很快就会创建一个新的 @williamvicary 感谢您对价格检查的建议。我将创建一个数据库列,其中包含客户必须支付的价格。如果我从贝宝收到的回复有不同的金额钱-> 数据库不会更新。如果有其他一些方法/想法来提高安全性,我很乐意听到他们的声音!另外,关于“交易类型”,我不完全理解“eCheque”比“Web Payment Accept”差多少,我如何确保客户不会使用“bad”方法?除非贝宝有这个选项。 Paypal 没有该选项,eCheque 需要时间来清除,并且收款人可以取消 afaik。我建议您阅读变量文档cms.paypal.com/us/cgi-bin/… 这是几年前的事,情况可能已经改变。 【参考方案1】:

嗯,你几乎已经描述了你需要做什么:

第一个:制作一个 onChange javascript,总结价值并将其发布到您想要的地方; 2nd:在提交后对值进行 php 检查(确保还检查注入问题); 3rd:重定向到paypal,等待回复; 4th:根据paypals的回答回显结果;

PS:我希望你不是在等待有人真正为你重写整个脚本;)

【讨论】:

【参考方案2】:

我不会接受 PayPal 回发给您的内容,这是一种检查用户身份验证的草率方式,并希望用户单击“返回网站”按钮。而是使用 IPN (https://www.paypal.com/ipn/) 并确保将回复发回 PayPal 进行验证。

从 PayPal 签出这个 PHP 示例:https://cms.paypal.com/uk/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_admin_IPNImplementation

【讨论】:

谢谢!您的 IPN 建议很有帮助。查看“编辑”以了解我最终如何解决问题。 (如果你想ofc);)【参考方案3】:

派对迟到了....但在 2021 年试试这个..

如果您想将自定义表单与 paypals 智能支付按钮 (https://developer.paypal.com/docs/checkout/) 结合使用,那么您可以尝试这种方法。这对我有用,你也不需要 IPN(下面的方法是最新的,而且速度更快)。

在您的前端使用这个(使用这个,您可以将表单数据发送到您的服务器):https://developer.paypal.com/demo/checkout/#/pattern/server

在您的后端使用这个(我将创建和捕获代码放在一个文件中): 创建订单:https://developer.paypal.com/docs/checkout/reference/server-integration/set-up-transaction/ 获取订单:https://developer.paypal.com/docs/checkout/reference/server-integration/capture-transaction/ 设置:https://developer.paypal.com/docs/checkout/reference/server-integration/setup-sdk/

现在您可以在 paypal 批准订单后将表单数据写入您的数据库。

在这里给出了类似的答案How to submit data for the address and payment details after PayPal payment is made

【讨论】:

以上是关于使用 php 成功完成 paypal 货币交易后提交表单的主要内容,如果未能解决你的问题,请参考以下文章

PayPal ExpressCheckout API:以当地货币获取交易总额

PHP Paypal IPN:交易未确认

来自paypal沙箱的消息:“此PayPal交易的货币必须与商户账户的货币匹配”

如何从贝宝获得成功或失败响应?

由于货币不受支持,此交易无法处理 - Paypal 直接付款

Braintree Paypal 交易处理器被拒绝(货币代码无效)