php - 在 PHP 中使用 POST 响应

标签 php post paypal response

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

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

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

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

感谢任何帮助! 托拜厄斯

最佳答案

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

显示 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)。此脚本将事务保存在数据库中。请注意,交易在数据库中保存为 Pending。一旦我从 Paypal 收到已付款的确认信息,它将更改为已付款。脚本 savetransaction.php 返回一个发票 ID 号,这是插入后数据库中的 ID。这是在整个支付过程中标识此交易的唯一标识符。我会将此号码发送到 paypal,它会在付款确认中将其发回给我。

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");
}

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

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

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
    }
}

希望对您有所帮助。请随时提出后续问题。

祝你好运!

关于php - 在 PHP 中使用 POST 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7447346/

相关文章:

Laravel Paypal 删除包但错误仍然存​​在

php - 在mysql中插入新行时连接

php - 在 Wordpress 页面上显示特定帖子

PHP - MVC - 防止在 Controller 中调用不需要的方法的更好方法?

javascript - 当在选项上设置 header 时,获取 POST 内容类型不会更改

PayPal - 动态付款接收方?

api - PayPal SetExpressCheckOut API 问题

php - 如何在 xdebug 模式下启用输出突出显示?

来自表单属性的 Javascript 回调

java - 将 BufferedReader 转换为 String 时出现乱码 (%22)