PayPal 并行支付 IPN
Posted
技术标签:
【中文标题】PayPal 并行支付 IPN【英文标题】:PayPal Parallel Payment IPN 【发布时间】:2012-01-17 09:05:20 【问题描述】:我已经卡了好几天了!我正在尝试通过并行付款从 PayPal IPN 获取详细信息。
我需要汇款到的两个电子邮件地址和金额,还有状态。
我在看这里:
https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_api_APIPN
这些是我的代码中我尝试获取电子邮件和金额的行:
$Email1 = $_POST['transaction[0].receiver'];
$Email2 = $_POST['transaction[1].receiver'];
及金额部分:
$Amount1 = $_POST['transaction[0].amount'];
$Amount2 = $_POST['transaction[1].amount'];
我正在使用此页面的 IPN 代码。
https://cms.paypal.com/cms_content/AU/en_AU/files/developer/IPN_php_41.txt
有什么帮助吗? POST 变量出现空白?
更新:我发现了这个:
<source lang="php">
<?php
error_reporting(E_ALL ^ E_NOTICE);
// By Gleb Esman, gleb@memberwing.com, http://www.memberwing.com/
//
// Pull raw POST data.
// We need to pull raw data and build our own copy of $_POST in order to
// workaround of invalid POST keys that Adaptive IPN request uses.
$raw_post_data = file_get_contents('php://input');
$raw_post_array = explode('&', $raw_post_data);
$_YOUR_POST = array();
foreach ($raw_post_array as $keyval)
$keyval = explode('=', $keyval);
if (count($keyval) == 2)
$_YOUR_POST[$keyval[0]] = urldecode($keyval[1]);
if (count($_YOUR_POST) < 3)
$_YOUR_POST = $_POST;
$original_post_used = TRUE;
else
$original_post_used = FALSE;
// Build final $_req postback request
// Paypal's IPN Sample
// read the post from PayPal system and add 'cmd'
if ($original_post_used)
$_req = 'cmd=_notify-validate';
foreach ($_YOUR_POST as $key => $value)
$value = urlencode(stripslashes($value));
$_req .= "&$key=$value";
else
$_req = $raw_post_data . '&cmd=_notify-validate';
// $_req is ready for postback to Paypal here...
$req = $_req;
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// PHP 4.1
// read the post from PayPal system and add 'cmd'
//$req = 'cmd=_notify-validate';
//
//foreach ($_POST as $key => $value)
// $value = urlencode(stripslashes($value));
// $req .= "&$key=$value";
//
// 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('ssl://www.paypal.com', 443, $errno, $errstr, 30);
// throw all this junk into the local error log so we can see what happened!
function log_arr($item, $key)
$p .= "$key = $item";
error_log(urldecode($p));
array_walk_recursive($_YOUR_POST, 'log_arr');
error_log(urldecode($req));
// assign posted variables to local variables
$item_name = $_POST['item_name'];
$item_number = $_POST['item_number'];
$payment_status = $_POST['payment_status'];
$payment_amount = $_POST['mc_gross'];
$payment_currency = $_POST['mc_currency'];
$txn_id = $_POST['txn_id'];
$receiver_email = $_POST['receiver_email'];
$payer_email = $_POST['payer_email'];
if (!$fp)
// HTTP ERROR
else
fputs($fp, $header . $req);
while (!feof($fp))
$res = fgets($fp, 1024);
if (strcmp($res, "VERIFIED") == 0)
// 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
else if (strcmp($res, "INVALID") == 0)
// log for manual investigation
fclose($fp);
?>
</source>
在日志文件中产生这个:
[10-Dec-2011 07:13:50] transaction[0].id_for_sender_txn = xxxxx
[10-Dec-2011 07:13:50] log_default_shipping_address_in_transaction = xxx
[10-Dec-2011 07:13:50] transaction[0].receiver = xxxxx
[10-Dec-2011 07:13:50] action_type = xxxx
[10-Dec-2011 07:13:50] transaction[1].paymentType = xxx
[10-Dec-2011 07:13:50] transaction[0].amount = xxxx
[10-Dec-2011 07:13:50] charset = xxx
谁能告诉我如何将这些转换为变量,因为这是打印在日志文件中的内容?
【问题讨论】:
【参考方案1】:试试$_POST['transaction']['0']['receiver']
等等。此外,启用E_ALL
错误消息,以便您看到有关此类事情的通知。如果启用了该功能,并且您检查了错误日志,您将看到未定义的索引通知。此外,如果您不顾一切地调试 $_POST/$_GET/whatever
的东西并且不是您控制请求,您可以随时将内容写入文件并检查它。
【讨论】:
是的,之前尝试过,但没有成功。在日志中得到了这个:[10-Dec-2011 06:18:47] PHP 警告:urlencode() 期望参数 1 是字符串,数组在第 22 行给出 xxxxxxxx 您在前几行将 $_YOUR_POST 构建为一个数组,然后尝试将其用作字符串。我认为 http_build_query 可能有用。以上是关于PayPal 并行支付 IPN的主要内容,如果未能解决你的问题,请参考以下文章