真的对贝宝付款感到困惑
Posted
技术标签:
【中文标题】真的对贝宝付款感到困惑【英文标题】:Really confused about paypal payments 【发布时间】:2011-08-01 07:39:23 【问题描述】:更新 1:
将$res
写入文本文件只会返回单词VERIFIED
:
<?php
/*
mysql_connect("localhost", "user", "password") or die(mysql_error());
mysql_select_db("PayPal") or die(mysql_error());
*/
// 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.sandbox.paypal.com', 443, $errno, $errstr, 30);
if (!$fp)
// HTTP ERROR
else
fputs ($fp, $header . $req);
while (!feof($fp))
$res = fgets ($fp, 1024);
if (strcmp ($res, "VERIFIED") == 0)
$ourFileName = "payment_successful.txt";
$ourFileHandle = fopen($ourFileName, 'w') or die("can't open file");
fwrite($ourFileHandle, $res);
fclose($ourFileHandle);
else if (strcmp ($res, "INVALID") == 0)
$ourFileName = "payment_failed.txt";
$ourFileHandle = fopen($ourFileName, 'w') or die("can't open file");
fwrite($ourFileHandle, $res);
fclose($ourFileHandle);
fclose ($fp);
?>
原始问题:
我有以下 IPN(即时付款通知)脚本,它可以工作,即如果成功,它会创建一个成功的文件,如果失败,它会创建一个失败的文件。
paypal 是否会将 post 值返回到 IPN 文件,以便我可以确定哪些付款成功或哪些付款失败?
如果是,我如何访问这些值?
如果没有,我如何确定哪些付款已被接受或拒绝?
这是我目前拥有的 IPN 文件中的脚本:
<?php
// 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.sandbox.paypal.com', 443, $errno, $errstr, 30);
if (!$fp)
// HTTP ERROR
else
fputs ($fp, $header . $req);
while (!feof($fp))
$res = fgets ($fp, 1024);
if (strcmp ($res, "VERIFIED") == 0)
$ourFileName = "payment_successful.txt";
$ourFileHandle = fopen($ourFileName, 'w') or die("can't open file");
fclose($ourFileHandle);
else if (strcmp ($res, "INVALID") == 0)
$ourFileName = "payment_failed.txt";
$ourFileHandle = fopen($ourFileName, 'w') or die("can't open file");
fclose($ourFileHandle);
fclose ($fp);
?>
【问题讨论】:
没关系,我知道贝宝返回了什么。 【参考方案1】:嗨,我是这样实现的
foreach ($_POST as $key => $value)
$data[$key] = $value;
回显'<pre>'
.print_r($data,true).'</pre>'
;
会产生这样的结果:
cmd=_notify-validate
test_ipn=1
payment_type=echeck
payment_date=22:21:28 Mar 24, 2011 PDT
payment_status=Completed
address_status=confirmed
payer_status=verified
first_name=John
last_name=Smith
payer_email=buyer@paypalsandbox.com
payer_id=TESTBUYERID01
address_name=John+Smith
address_country=United+States
address_country_code=US
address_zip=95131
address_state=CA
address_city=San+Jose
address_street=123%2C+any+street
business=seller@paypalsandbox.com
receiver_email=seller@paypalsandbox.com
receiver_id=TESTSELLERID1
residence_country=US
item_name=something
item_number=AK-1234
quantity=1
shipping=3.04
tax=2.02
mc_currency=USD
mc_fee=0.44
mc_gross=12.34
txn_type=web_accept
txn_id=28325521
notify_version=2.1
custom=xyz123
invoice=abc1234
charset=windows-1252
verify_sign=AFcWxV21C7fd0v3bYYYRCps-s-rl31AM3F5ODR-2hb2fIsWPHepIEPzAwg
【讨论】:
【参考方案2】:您的通用脚本中有答案。
Paypal 将在字符串中返回单词 VERIFIED 或 INVALID。
($res, "VERIFIED") == 0
一个很好的技巧是将 $res 的值写入你的日志,你会在最后看到返回的结果。
确保您也使用沙盒进行测试。
http://x.com 也有一个论坛(他们为那个域支付了多少钱?)
FWIW,Paypal 的 IPN 是 PITA。
【讨论】:
是否可以将 $res 的内容写入正在创建的文件中,因为我认为很难回显内容,因为这是由 paypal 发起的页面。 您不能回显内容,或者更好的是,您可以,但谁在乎呢? IPN 事务是 server2server,所以只有服务器会看到回显,您必须将其写入日志文件或数据库中,注意 PayPal IPN 以一种方式向您发送数据,并希望以相同的方式返回数据,或者更好:PayPal发给你 var1=res1&var2=res2&var3=res3,你不能把它们作为 var2=res2&var1=res1&var3=res3 发回,你必须遵守顺序......当我写自己的 IPN 时,我遇到了很多麻烦,因为在我看来 $_POST[] 不尊重数据顺序所以我直接阅读 php://input @MiPnamic,我将 $res 的内容写入了一个文件,它只包含单词 VARIFIED。我不明白如何通过上述 IPN 文件找出哪个付款贝宝正在确认,因此我可以更新数据库中的正确记录。我已经更新了上述问题,以显示将 $res 中的数据写入文本文件的当前代码。 foreach ($_POST as $key => $value) $value = urlencode(stripslashes($value)); $req .= "&$key=$value";如您所见,这将通过 $_POST 变量获取数据,因此如果您想跟踪付款(并且您“必须”这样做),您需要在某处写入 $_POST 内容,信息存储在哪里关于付款。以上是关于真的对贝宝付款感到困惑的主要内容,如果未能解决你的问题,请参考以下文章