我正在为自定义数字电子商务创建一个IPN,但我有一个问题:一切正常工作,我在我的数据库中创建一个“待付款”,其ID为我称为PID(支付ID),用户转到paypal页面付款完成后,paypal会在IPN监听器上与我联系,检查付款是否完成并启用用户购买的所有媒体 .
我使用micah carrick php类(http://www.micahcarrick.com/php-paypal-ipn-integration-class.html)成功创建了一个IPN,一切正在运行 i ALWAYS get a pendign payment status ,我无法得到确认的IPN .
我目前正在paypal沙盒中测试它,我创建了2个买家和一个卖家,我已经为每个人启用了“付款审核” .
我尝试了不同的方法,但我总是得到相同的结果 .
Code: file_put_contents('ipn.log',"\n>IPN\n",FILE_APPEND);
//Check the Payment ID,i pass it to the IPN by GET
if(!isset($_GET['pid'])|| !is_numeric($_GET['pid'])){
file_put_contents('ipn.log',"\n!!!IPN:INVALID PID(".$_GET['pid'].")!!!\n",FILE_APPEND);
exit('PID INVALIDO!');
}
//Logging errors
ini_set('log_errors', true);
ini_set('error_log', dirname(__FILE__).'/ipn_errors.log');
// instantiate the IpnListener class
require('ipnlistener.php');
$listener = new IpnListener();
//Use the sandbox instead of going "live"
$listener->use_sandbox = true;
//validate the request
try {
$listener->requirePostMethod();
$verified = $listener->processIpn();
}
catch (Exception $e) {
error_log($e->getMessage());
exit(0);
}
//Just for debug
file_put_contents('ipn.log',"\n###IPN:verifying...###\n",FILE_APPEND);
if($verified){//the payment is verified
file_put_contents('ipn.log',"\n###IPN:transaction verified(confirmed=".$_POST['payment_status'].")###\n".$listener->getTextReport(),FILE_APPEND);
/*
Once you have a verified IPN you need to do a few more checks on the POST
fields--typically against data you stored in your database during when the
end user made a purchase (such as in the "success" page on a web payments
standard button). The fields PayPal recommends checking are:
1. Check the $_POST['payment_status'] is "Completed"
2. Check that $_POST['txn_id'] has not been previously processed
3. Check that $_POST['receiver_email'] is your Primary PayPal email
4. Check that $_POST['payment_amount'] and $_POST['payment_currency']
are correct
Since implementations on this varies, I will leave these checks out of this
example and just send an email using the getTextReport() method to get all
of the details about the IPN.
*/
if($_POST['payment_status']=="Completed"){
//--check if the price is right and enable the user media--
confirm_payment($_GET['pid'],$_POST['payment_amount']);
file_put_contents('ipn.log',"\n###IPN:Transaction completed###\n".$listener->getTextReport(),FILE_APPEND);
}
}
else {
/*
An Invalid IPN *may* be caused by a fraudulent transaction attempt. It's
a good idea to have a developer or sys admin manually investigate any
invalid IPN.
*/
file_put_contents('ipn.log',"\n###IPN:ERROR###\n".$listener->getTextReport(),FILE_APPEND);
}
我创建的调试日志总是这样
IPN < - 它声明ipn被正确调用## IPN:验证... ### < - IPN正在验证交易## IPN:交易已验证(已确认=待处理)< - 交易已经过验证,但尚未确认,因为它正在等待,我无法启用下载!
2 回答
禁用付款审核 . 付款审核将始终将其置于待处理状态 .
那's actually the whole point of it; to be able to use negative testing and payment review in order to test '负' scenario'来验证你的错误处理 .
我对你正在使用的课程并不熟悉,但这就是我在所有工作中一直用于PP IPN的东西,它就像一个魅力,也许有一天我会以自己的面向对象的方式,但现在这似乎要做的伎俩,我希望它可以帮助你 . (只是为了让你走上正确的轨道,我使用相同的文件来传输和传出来自PP的消息)