【问题标题】:using POST response in php在 php 中使用 POST 响应
【发布时间】:2011-11-18 19:51:12
【问题描述】:

我正在设置一个简单的 paypal 按钮。单击后,我需要将订单写入我的数据库,然后通过 POST 将其重定向到贝宝。数据库部分工作得很好,但是 POST 到 paypal 却不行。

我正在使用code by wez furlong 向贝宝服务器发送发布请求,并且需要处理响应以正确重定向客户端(我需要从响应中获取位置)。

最后,这应该像普通的贝宝“立即购买”按钮一样,在点击时将用户重定向到贝宝。

我似乎无法得到回复,而且贝宝文档对此非常含糊。如何提取正确的 url 以重定向客户端?

任何帮助表示赞赏! 托比亚斯

【问题讨论】:

标签: php post paypal response


【解决方案1】:

这是我在我的网站上实现此功能的方式。它工作正常:

显示 Paypal 按钮的代码:

Content += "<br/><a href='javascript:Pay();'><img src='http://www.example.com/images/paypal_checkout_button.jpg' alt='Secure payment through PayPal' border='0' /></a><br/><br/>";

Pay() 是客户端点击按钮时调用的 javascript 函数。

函数Pay()的代码

function Pay() {
    var MessageParam = "msgjson=" + JSON.encode(msgJSON) + "&invoicejson=" + JSON.encode(invoiceJSON);
    var myRequest = new Request({url:"http://www.example.com/savetransaction.php", onSuccess: function(InvoiceId) {CallPayPal(InvoiceId);}}).post(MessageParam);
}

Function Pay 做了两件事:

1 - 将事务的详细信息提交到服务器上运行的 PHP 脚本 (savetransaction.php)。此脚本将事务保存在数据库中。请注意,事务在数据库中保存为待处理。一旦我收到 Paypal 的已付款确认,它将更改为已付款。脚本 savetransaction.php 返回一个发票 id 号,即插入后数据库中的 id。这是在整个支付过程中识别此交易的唯一标识符。我会将这个号码发送到贝宝,它会在付款确认中将其发回给我。

2 - onSuccess 调用函数 CallPayPal(InvoiceId),它将客户端发送到 Paypal(见下文)。

CallPayPal(InvoideId)函数代码

function CallPayPal(InvoiceId) {
    var PayPalUrl = "https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_xclick-subscriptions&business=YOURCODEHERE&lc=US&item_name=YOURITEMNAMEHERE&item_number=YOURITEMNUMBER&no_note=1&no_shipping=2&rm=1&return=URL_OF_SCRIPT_THAT_WILL_HANDLE_PAYPAL_RESPONSE&cancel_return=URL_OF_SCRIPT_THAT_WILL_BE_CALLED_IF_CLIENT_CANCEL_PAYMENT_AT_PAYPAL&src=1&a3=" + invoiceJSON.AmtSubs + "&p3=1&t3=M&currency_code=USD&bn=PP%2dSubscriptionsBF%3abtn_subscribeCC_LG%2egif%3aNonHosted";
    window.open(PayPalUrl + "&invoice=" + InvoiceId,"_self");
}

您需要更改贝宝网址以满足您的需求。我的是订阅按钮。请注意,我在末尾包含了 InvoiceId。这将由 PayPal 接收并在响应中发回。

当客户完成付款后,Paypal 会将他发送回我包含在变量 return 中的地址。 Paypal 将在 url 上附加一个交易代码。请参阅下面的 php 脚本,我在其中处理来自 Paypal 的返回:

PayPalPDT.php 的代码

$req = 'cmd=_notify-synch';

$tx_token = $_GET['tx'];
$auth_token = "enter your own authorization token";
$req .= "&tx=$tx_token&at=$auth_token";

// post back to PayPal system to validate
$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";

//$fp = fsockopen ('http://www.sandbox.paypal.com', 80, $errno, $errstr, 30);
// If possible, securely post back to paypal using HTTPS
// Your PHP server will need to be SSL enabled
// replace www.sandbox.paypal.com with www.paypal.com when you go live
$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);

if (!$fp)
{
    // HTTP ERROR
}
else
{
    fputs ($fp, $header . $req);
    // read the body data
    $res = '';
    $headerdone = false;
    while (!feof($fp))
    {
        $line = fgets ($fp, 1024);
        if (strcmp($line, "\r\n") == 0)
        {
            // read the header
            $headerdone = true;
        }
        else if ($headerdone)
        {
            // header has been read. now read the contents
            $res .= $line;
        }
    }

    // parse the data
    $lines = explode("\n", $res);
    $keyarray = array();
    if (strcmp ($lines[0], "SUCCESS") == 0)
    {
        for ($i=1; $i<count($lines);$i++)
        {
            list($key,$val) = explode("=", $lines[$i]);
            $keyarray[urldecode($key)] = urldecode($val);
        }
        $firstname = $keyarray['first_name'];
        $lastname = $keyarray['last_name'];
        $itemname = $keyarray['item_name'];
        $amount = $keyarray['payment_gross'];
        $invoiceid = $keyarray['invoice'];
        $profileid = $keyarray['subscr_id'];
        // check the payment_status is Completed
        // check that txn_id has not been previously processed
        // check that receiver_email is your Primary PayPal email
        // check that payment_amount/payment_currency are correct
        // process payment
        // show receipt to client
    }
}

我希望这会有所帮助。请随时提出后续问题。

祝你好运!

【讨论】:

    【解决方案2】:

    wezfurlong 上的代码用于让服务器向 paypal 发送 PHP 帖子,而不是用于重定向客户端。我想我是通过创建一个指向 paypal 的 html 表单和一个提交它的 javascript 命令来实现的,类似于:

    <html><body>
    <form method='post' action='paypalurl'>
      <input name='some required field' blah blah...>
    </form>
    <script>
      document.forms[0].submit();
    </script>
    </body></html>
    

    【讨论】:

      【解决方案3】:

      由于您需要将 用户 重定向到 PayPal,因此您无法从服务器发送 POST 来实现此目的。

      相反,我建议您使用一些 AJAX 并拦截按钮单击。当按钮被点击时,您的 JavaScript 函数可以调用服务器上的 URL 来写出数据,然后还将用户发送到 PayPal。

      【讨论】:

        【解决方案4】:

        如果您使用的是标头重定向,请使用 GET 变量。
        例如:https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=yourpaypalemail&amount=theamount&item_name=the%20item%20name

        有关您可以使用的其他变量,另请参阅https://merchant.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_html_Appx_websitestandard_htmlvariables 上的“网站付款标准的 HTML 变量”。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-11-17
          • 2016-11-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多