真的对贝宝付款感到困惑

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;

回显'&lt;pre&gt;'.print_r($data,true).'&lt;/pre&gt;';

会产生这样的结果:

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 内容,信息存储在哪里关于付款。

以上是关于真的对贝宝付款感到困惑的主要内容,如果未能解决你的问题,请参考以下文章

对测试我的贝宝订阅按钮感到困惑

客户对贝宝沙箱使用真实的信用卡信息

贝宝参考交易问题

整合贝宝循环

贝宝、MPL 和安卓

ActiveMerchant 贝宝网关/快递