comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

Controlar pagos de PayPal con php, ClassIPN

  • 4 Respuestas
  • 2060 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado alexander1712

  • *
  • Underc0der
  • Mensajes: 850
  • Actividad:
    0%
  • Reputación -2
    • Ver Perfil
    • El blog del programador
    • Email
« en: Octubre 10, 2013, 11:49:33 am »
Hola, siguiendo con mi rutina de armar clases para manejar ciertas cosas y así no tener que escribirlas una y otra vez en cada sistema, hoy realizé una que controle pagos instantaneos de paypal, los IPN o instant payment notification de paypal, son notificaciones para cuando uno recibe un pago, imaginense que vendo productos chinos en mi página china, cuando alguien realiza un pago, paypal me envía la notificación de pago satisfactorio, y mi php automáticamente le dice al cliente que su pago fue realizado y todas esas boludeces, lo mismo pasa con hosting y etc.

Lo único que tienen que hacer para recibir esas notificaciones es ir a paypal, activar IPN y poner el link del php que controla las notificaciones.

Ese php se puede llamar por ejemplo IPN.php, las siguientes clases te pueden ayudar a controlar los IPN.

creamos un archivo php, que incluya mi property No tienes permisos para ver links. Registrate o Entra con tu cuenta, y la clase ClassIPNInterface.

ipn.php
Código: PHP
  1. <?php
  2. include('Property.php');
  3. include('ClassIPNInterface.php');
  4.  
  5. // creamos el objeto, automáticamente la clase enviará una notificación a paypal de que recibimos la notificación y eso
  6. $ipn = new ClassIPN();
  7. // vemos si ubo un error al realizar el aviso a paypal
  8. if($ipn->error == true)
  9. {
  10.     // mostramos el error
  11.     echo $ipn->error_msg;
  12. } else { // si no ocurrió ningún error
  13.  
  14. // aquí guardamos en la base de datos, y actualizamos la tabla que tenga los pagos y le damos la plata al cliente o le ponemos una notificación de que se realizó el pago.
  15.  
  16. // podemos usar las siguientes variables:
  17.  
  18. $ipn->item_name(); // nombre del producto
  19. $ipn->payment_status(); // el estado del pago cuando se realizó esta notificacion
  20. $ipn->payment_amount(); // el dinero que pagó por el producto
  21. $ipn->transaction_id(); // el numero de transacción único, recomiendo que revisen en la db antes de hacer nada si ya había un pago con este numero de transacción para no tener duplicados.
  22. $ipn->client_email(); // el email de la persona que pagó
  23.  
  24. }
  25.  

para que esto funcione crean un archivo Property.php con el código del link que dejé más arriba, y dos archivos más:

ClassIPNInterface.php
Código: PHP
  1. <?php
  2.  
  3. interface IIPN
  4. {
  5.        
  6.         public function __construct();
  7.        
  8.         public function get_item_name();
  9.         public function set_item_name($value);
  10.        
  11.         public function get_payment_status();
  12.         public function set_payment_status($value);
  13.        
  14.         public function get_payment_amount();
  15.         public function set_payment_amount($value);
  16.        
  17.         public function get_payment_currency();
  18.         public function set_payment_currency($value);
  19.        
  20.         public function get_transaction_id();
  21.         public function set_transaction_id($value);
  22.        
  23.         public function get_receiver_email();
  24.         public function set_receiver_email($value);
  25.        
  26.         public function get_client_email();
  27.         public function set_client_email($value);
  28.        
  29. }
  30.  
  31. include('ClassIPN.php');

y ClassIPN.php:

Código: PHP
  1. <?php
  2.  
  3. class IPN implements IIPN
  4. {
  5.         // usamos mi trait Property
  6.         use Property;
  7.        
  8.         // atributos privados
  9.         private $notify_validate_request_content = null;
  10.         private $notify_validate_request_header = null;
  11.        
  12.         // variables.
  13.         private $item_name = null; // nombre del producto
  14.         private $payment_status = null; // estado del pago
  15.         private $payment_amount = null; // precio pagado
  16.         private $payment_currency = null; // ?
  17.         private $transaction_id = null; // id de transacción de paypal
  18.         private $receiver_email = null; // nuestro mail
  19.         private $client_email = null; // mail del que compró
  20.        
  21.         private $error = false;
  22.         private $error_msg = null;
  23.        
  24.        
  25.         public function __construct()
  26.         {
  27.                 $this->vars_extract();
  28.                 $this->notify_validate_request_content = $this->request_content_generate();
  29.                 $this->notify_validate_request_header = $this->request_header_generate();
  30.                 $this->notify_validate_request();                      
  31.         }
  32.        
  33.         private function request_content_generate()
  34.         {
  35.                 $req = 'cmd=_notify-validate';
  36.                 foreach ($_POST as $key => $value) {
  37.                         $value = No tienes permisos para ver links. Registrate o Entra con tu cuenta(No tienes permisos para ver links. Registrate o Entra con tu cuenta($value));
  38.                         $req .= "&$key=$value";
  39.                 }
  40.                 return $req;
  41.         }
  42.        
  43.         private function request_header_generate()
  44.         {
  45.                 $header = null;
  46.                 $header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
  47.                 $header .= "Content-Type: application/x-www-form-urlencoded\r\n";
  48.                 $header .= "Content-Length: " . No tienes permisos para ver links. Registrate o Entra con tu cuenta($this->notify_validate_request_content) . "\r\n\r\n";
  49.                 return $header;
  50.         }
  51.        
  52.         private function notify_validate_request()
  53.         {
  54.                 try
  55.                 {
  56.                         $fp = No tienes permisos para ver links. Registrate o Entra con tu cuenta ('www.paypal.com', 80, $errno, $errstr, 30);
  57.                         if(!$fp) throw new exception('No es posible conectar con www.paypal.com');
  58.                         No tienes permisos para ver links. Registrate o Entra con tu cuenta ($fp, $this->notify_validate_request_header . $this->notify_validate_request_content);
  59.                         while (!No tienes permisos para ver links. Registrate o Entra con tu cuenta($fp))
  60.                         {
  61.                                 $res = No tienes permisos para ver links. Registrate o Entra con tu cuenta ($fp, 1024);
  62.                                 if (No tienes permisos para ver links. Registrate o Entra con tu cuenta ($res, "VERIFIED") == 0)
  63.                                 {
  64.                                         return true;
  65.                                 }
  66.                                 else
  67.                                 {
  68.                                         throw new exception('Ocurrió un error con la transaccion');
  69.                                 }
  70.                         }
  71.                 } catch(Exception $e)
  72.                 {
  73.                         $this->error = true;
  74.                         $this->error_msg = $e->getMessage();
  75.                         return false;
  76.                 }              
  77.         }
  78.        
  79.         private function vars_extract()
  80.         {
  81.                 $this->item_name = $_REQUEST['item_name'];
  82.                 $this->payment_status = $_REQUEST['payment_status'];
  83.                 $this->payment_amount = $_REQUEST['mc_gross'];
  84.                 $this->payment_currency = $_REQUEST['mc_currency'];
  85.                 $this->transaction_id = $_REQUEST['txn_id'];
  86.                 $this->receiver_email =  $_REQUEST['receiver_email'];
  87.                 $this->client_email = $_REQUEST['payer_email'];
  88.         }
  89.        
  90.         public function get_item_name() { return $this->item_name; }
  91.         public function set_item_name($value) { ; }
  92.        
  93.         public function get_payment_status() { return $this->payment_status; }
  94.         public function set_payment_status($value) { ; }
  95.        
  96.         public function get_payment_amount() { return $this->payment_amount; }
  97.         public function set_payment_amount($value) { ; }
  98.        
  99.         public function get_payment_currency() { return $this->payment_currency; }
  100.         public function set_payment_currency($value) { ; }
  101.        
  102.         public function get_transaction_id() { return $this->transaction_id; }
  103.         public function set_transaction_id($value) { ; }
  104.        
  105.         public function get_receiver_email() { return $this->receiver_email; }
  106.         public function set_receiver_email($value) { ; }
  107.        
  108.         public function get_client_email() { return $this->client_email; }
  109.         public function set_client_email($value) { ; }
  110. }

bueno eso es todo! saludos!
« Última modificación: Marzo 27, 2014, 05:22:31 pm por Expermicid »

Marcado como mejor respuesta por: en Septiembre 17, 2018, 11:26:55 pm

Desconectado ezephp

  • *
  • Underc0der
  • Mensajes: 46
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #1 en: Octubre 15, 2013, 11:02:22 am »
te hago una consulta aparte...

porque cuando creas una variable siempre le das valor null. En el caso de que no lo hagas y solamente lo cree, no va a tener ningun valor. Ademas de que las variables que usas son privadas, asi que no se va a poder utilizar en otro lado, de cualquier forma, las utilizas en la misma clase obviamente. Pero la pregunta es... les pones un valor nulo por algun motivo o porque te acostumbraste/te gusta asi?.

saludos

Desconectado alexander1712

  • *
  • Underc0der
  • Mensajes: 850
  • Actividad:
    0%
  • Reputación -2
    • Ver Perfil
    • El blog del programador
    • Email
« Respuesta #2 en: Octubre 15, 2013, 12:11:45 pm »
No tienes permisos para ver links. Registrate o Entra con tu cuenta
te hago una consulta aparte...

porque cuando creas una variable siempre le das valor null. En el caso de que no lo hagas y solamente lo cree, no va a tener ningun valor. Ademas de que las variables que usas son privadas, asi que no se va a poder utilizar en otro lado, de cualquier forma, las utilizas en la misma clase obviamente. Pero la pregunta es... les pones un valor nulo por algun motivo o porque te acostumbraste/te gusta asi?.

saludos

es un tema que arrastro desde estructurada, si no definis una variable y la usas para por ejemplo concatenar ($variable .= 'hola';) te tirará un warning informando que la variable no existe (ya que quieres accesar para leer un recurso inexistente), por lo que me acostumbré a definir toda variable que voy a usar, así no hay warnings y está todo aclarado para php, eso por un lado.

en segundo lugar, porque defino el tipo también, si pongo Null es porque en general puede ser un string o un objeto lo que valla a meter en dicha variable, si pongo = 0, es porque voy a poner solo numeros, y si le pongo array(); es porque voy a poner un arreglo :P

en éste caso en específico, son todas null porque estoy trabajando con una api, por lo que no especifico el tipo que la api me retorna.

en otros lenguajes es de suma importancia definir variables, por lo que se me hizo una costumbre definirlas y darles un valor inicial yo mismo.

por lo que en realidad darle un valor inicial no es necesario como mencionas.

y sobre que son todas private, eso depende de la ocación, pero yo no uso public desde hace un tiempo, me limito solo a usar private o protected, no uso public por los principios de encapsulamiento y ocultamiento de información. por lo demas generalmente pongo private salvo que esté trabajando con herencia donde, aquellas cosas que no quiero que puedan ser redeclaradas uso protected (eso en funciones) y en variable si son clases abstractas no tiene sentido pero si son clases comunes me evita incidentes de acceso (o así le llamo yo).

saludos!
« Última modificación: Octubre 15, 2013, 01:15:09 pm por Harkonnen »

Desconectado ezephp

  • *
  • Underc0der
  • Mensajes: 46
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #3 en: Octubre 16, 2013, 09:55:44 am »
Entiendo...

como deciamos no hace falta declararlas, aunque tampoco esta de mas, de cualquier forma hay que estar atento con private, protected y public. Me paso que muchas veces puse private y al usar la clase y a su vez funcion en otro archivo no aparecia nada, no funcionaba, obviamente porque estaba privada, y buen.. hasta que te das cuenta puede pasar 1 segundo como 10 minutos o inclusive mas... si te toca un mal dia xD.

Buena explicacion.

Saludos!

Desconectado alexander1712

  • *
  • Underc0der
  • Mensajes: 850
  • Actividad:
    0%
  • Reputación -2
    • Ver Perfil
    • El blog del programador
    • Email
« Respuesta #4 en: Octubre 16, 2013, 10:48:21 am »
No tienes permisos para ver links. Registrate o Entra con tu cuenta
Entiendo...

como deciamos no hace falta declararlas, aunque tampoco esta de mas, de cualquier forma hay que estar atento con private, protected y public. Me paso que muchas veces puse private y al usar la clase y a su vez funcion en otro archivo no aparecia nada, no funcionaba, obviamente porque estaba privada, y buen.. hasta que te das cuenta puede pasar 1 segundo como 10 minutos o inclusive mas... si te toca un mal dia xD.

Buena explicacion.

Saludos!

si al prin cipio se me complicaba más que nada entre private y protected luego fue bastante intuitivo si seguis la normativa te das cuenta en seguida las cosas que no deberías hacer xD
y si con un mal día te puede pasar cualquier cosa.

saludos!

 

¿Te gustó el post? COMPARTILO!