真搞不清楚PayPal付款
更新1:真搞不清楚PayPal付款
写$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是否会向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);
}
?>
您的通用脚本答案。
贝宝将在字符串中返回VERIFIED或INVALID字样。
($res, "VERIFIED") == 0
一个好的技巧是将$ res的值写入您的日志,您会在最后看到返回的结果。
确保您也使用沙盒进行测试。
也有在http://x.com(多少钱,他们付出代价的域?)
FWIW一个论坛,PayPal的IPN是一个PITA。
是否有可能将$ res的内容写入正在创建的文件中,因为我认为难以回显内容,因为这是由贝宝启动的页面。 – oshirowanen 2011-04-08 08:02:58
你无法回应内容,或者更好,你可以但谁在乎? IPN事务是server2server,因此只有服务器才能看到回显,您必须将其写入日志文件或数据库中,请注意,PayPal IPN以单向方式向您发送数据,并希望以相同方式返回数据,或更好:PayPal发送给你var1 = res1&var2 = res2&var3 = res3,你不能将它们作为var2 = res2&var1 = res1&var3 = res3发送,你必须遵守命令...... AFAIK当我编写自己的IPN时,我遇到了很多麻烦,因为在我看来,$ _POST []不尊重数据顺序,所以我直接通过php://输入 – MiPnamic 2011-04-08 08:10:56
@MiPnamic,将$ res的内容写入文件,它只包含VARIFIED一词。我不明白如何通过上述IPN文件找出Paypal正在确认的付款,所以我可以更新数据库中的正确记录。我更新了上述问题以显示将$ res中的数据写入文本文件的当前代码。 – oshirowanen 2011-04-08 08:15:35
您好我实现我的这种方式
foreach ($_POST as $key => $value)
{
$data[$key] = $value;
}
做回声'<pre>'
.print_r($的数据,真实)。 '</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
[email protected]
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
[email protected]
[email protected]
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=AFcWxV21C7fd0v3bYYYRCpSSRl31AM3F5ODR-2hb2fIsWPHepIEPzAwg
没关系,我想通了,什么是贝宝返回。 – oshirowanen 2011-04-08 08:30:18