php - ejemplo - PayPal IPN ya no funciona
paypal sandbox ipn (2)
Yo tuve el mismo problema. Comenzaron a agregar "/ r / n" al final de la respuesta, por lo que estaba comparando "VERIFICADO" con "VERIFICADO / r / n" y estaba fallando. Tu puedes hacer:
trim($res)
antes de probar VERIFIED, o puede usar strpos
lugar de strcmp
:
if (strpos($res, "VERIFIED") === 0)
(needs ===, not ==)
Finalmente, también pidieron a todos los clientes hace un tiempo que comenzaran a agregar el encabezado de conexión:
$header .= "Connection: close/r/n";
Desde ayer, el IPN de PayPal funcionaba bien, pero hoy no puedo recibir ninguna IPN. Revisé MySQL, compruebe el IPN Adresse y todo está bien. Estaba pensando que PayPal hizo algunos cambios en su servidor IPN, esa mujer en el teléfono me dijo que no. Algo raro.
Entonces, ¿podría alguien revisar el ipn.php y el add.php?
agregar php
<?
define(''BASEPATH'', true);
require_once("../../config.php");
if(!$is_online){
redirect(''../../../index.php'');
exit;
}
$s_host = parse_url($site[''site_url'']);
if($_GET[''cash''] != '''' && is_numeric($_GET[''cash''])){
$cash = ($_GET[''cash''] < 1 ? 1 : $_GET[''cash'']);
$cash = number_format($cash, 2, ''.'', '''');
}else{
redirect(''../../../index.php'');
exit;
}
?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>Redirecting...</title>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<style>body{background: #fff;font: 13px Trebuchet MS, Arial, Helvetica, Sans-Serif;color: #333;line-height: 160%;margin: 0;padding: 0;text-align: center;}h1{font-size: 200%;font-weight: normal}.centerdiv{position: absolute;top: 50%; left: 50%; width: 340px; height: 200px;margin-top: -100px; margin-left: -160px;}</style>
<script type="text/javascript">
setTimeout(''document.paypalform.submit()'',1000);
</script>
</head>
<body>
<div class="centerdiv"><h1>Connecting to Paypal <img src="<?=$site[''site_url'']?>/img/go_loader.gif" /></h1></div>
<form name="paypalform" action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_xclick">
<input type="hidden" name="business" value="<?=$site[''paypal'']?>">
<input type="hidden" name="item_name" value="<?=''Add Funds - ''.$data[''login''].'' - ''.$s_host[''host'']?>">
<input type="hidden" name="custom" value="<?=($data[''id''].''|''.$cash.''|''.VisitorIP())?>">
<input type="hidden" name="amount" value="<?=$cash?>">
<input type="hidden" name="currency_code" value="<?=($site[''currency_code''] == '''' ? ''USD'' : $site[''currency_code''])?>">
<input type="hidden" name="button_subtype" value="services">
<input type="hidden" name="no_note" value="1">
<input type="hidden" name="no_shipping" value="2">
<input type="hidden" name="rm" value="1">
<input type="hidden" name="return" value="<?=$site[''site_url'']?>/bank.php?success">
<input type="hidden" name="cancel_return" value="<?=$site[''site_url'']?>/bank.php?cancel">
<input type="hidden" name="notify_url" value="<?=$site[''site_url'']?>/system/payments/paypal/ipn.php">
</form>
</body>
</html>
ipn
<?php
define(''BASEPATH'', true);
require("../../config.php");
$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.1/r/n";
$header .= "Content-Type: application/x-www-form-urlencoded/r/n";
$header .= "Host: www.paypal.com/r/n";
$header .= "Content-Length: " . strlen($req) . "/r/n/r/n";
$fp = fsockopen (''ssl://www.paypal.com'', 443, $errno, $errstr, 30);
// 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''];
$custom = $_POST[''custom''];
if (!$fp) {
// HTTP ERROR
} else {
fputs ($fp, $header . $req);
while (!feof($fp)) {
$res = fgets ($fp, 1024);
if (strcmp ($res, "VERIFIED") == 0) {
$get_data = explode(''|'', $custom);
if($site[''paypal_auto''] == 1){
if($payment_status == ''Completed''){
$user = $db->QueryFetchArray("SELECT id,login FROM `users` WHERE `id`=''".$get_data[0]."''");
$check = $db->QueryGetNumRows("SELECT id FROM `transactions` WHERE `gateway`=''paypal'' AND `trans_id`=''".$txn_id."''");
if($check == 0){
$db->Query("INSERT INTO `transactions` (user, user_id, money, gateway, date, user_ip, trans_id) VALUES(''".$user[''login'']."'',''".$user[''id'']."'', ''".$payment_amount."'', ''paypal'', NOW(), ''".$get_data[2]."'', ''".$txn_id."'')");
if($user[''id''] > 0){
$db->Query("UPDATE `users` SET `account_balance`=`account_balance`+''".$payment_amount."'' WHERE `id`=''".$user[''id'']."''");
}
}
}
}else{
$user = $db->QueryFetchArray("SELECT id,login FROM `users` WHERE `id`=''".$get_data[0]."''");
$check = $db->QueryGetNumRows("SELECT id FROM `transactions` WHERE `gateway`=''paypal'' AND `trans_id`=''".$txn_id."''");
if($check == 0){
$db->Query("INSERT INTO `transactions` (user, user_id, money, gateway, date, paid, user_ip, trans_id) VALUES(''".$user[''login'']."'',''".$user[''id'']."'', ''".$payment_amount."'', ''paypal'', NOW(), ''0'', ''".$get_data[2]."'', ''".$txn_id."'')");
}
}
}
}
fclose ($fp);
}
?>
Para resolver este problema, debe editar la configuración de Notificación de pago instantánea en su cuenta comercial de PayPal. Estas instrucciones paso a paso ayudan mucho a habilitar IPN: PayPal IPN / Notify URL no funciona en la cuenta de Sandbox