test - Identificador único de PayPal IPN
paypal ipn test (5)
Siempre asumí que el txn_id
enviado con IPN es único. Las directrices de PayPal parecen apoyar esta idea: https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_admin_IPNIntro
Evite mensajes IPN duplicados. Compruebe que aún no ha procesado la transacción identificada por el ID de transacción devuelto en el mensaje de IPN. Es posible que deba almacenar los ID de transacción devueltos por los mensajes de IPN en un archivo o base de datos para que pueda verificar si hay duplicados. Si el ID de transacción enviado por PayPal es un duplicado, no debe procesarlo nuevamente.
Sin embargo, encontré que la IPN de pago de eCheck de PayPal se envía dos veces con el mismo ID de transacción. Una vez durante el pago inicial con payment_status
como "Pendiente" y nuevamente después de un par de días cuando eCheck en realidad se procesa con payment_status
como "Completado".
Quiero almacenar ambas transacciones, pero aún así me gustaría evitar almacenar duplicados. Hay otro campo en IPN llamado ipn_track_id
y es diferente para ambas transacciones, pero no puedo encontrar documentación para ello, excepto esta vaga descripción:
Interno; solo para uso de MTS y DTS
¿Alguien más está usando ipn_track_id
para identificar de manera única los mensajes de IPN?
En mi llamada a la API de PHP, uso estos campos y los almaceno en mi base de datos:
custom=xxxx
(o invoice=ZZZZZZ
)
luego, cuando su página recibe IPN, debe verificar (desde la base de datos) si la custom=xxxx
o etc ...
Las transacciones de IPN son únicas, y las transacciones que cambian el pago generarán un nuevo txn_id. Por ejemplo, reembolsos, por lo que es una buena idea almacenar todo txn_id relacionado con una sola compra. Hasta el momento no sé qué otras transacciones además de los reembolsos generan un nuevo txn_id, posiblemente las reversiones también lo hagan.
No todos los mensajes de IPN contienen un $ _POST [''txn_id''], por lo que si solo busca un txn_id, es posible que no registre de forma intermitente los mensajes de IPN donde no contienen esta clave.
ipn_track_id no es único para pagos recurrentes. Al menos para el plan de cuotas no lo es. Cuando el cliente crea el plan de cuotas y si su plan tiene un primer pago en el momento de la compra, recibirá 2 mensajes de IPN con el mismo ipn_track_id (ejemplo de abajo).
Primera notificación "recurring_payment_profile_created" el primer pago "recurring_payment"
Plan creado IPN
[txn_type] => recurring_payment_profile_created
[recurring_payment_id] => I-57UAPHFJ3SBY
[product_name] => Risk-Free Trial
[time_created] => 06:24:39 Aug 15, 2013 PDT
[ipn_track_id] => bdd94fdee935a
Primer pago IPN
[txn_type] => recurring_payment
[mc_gross] => 10.95
[shipping] => 0.00
[product_type] => 1
[time_created] => 06:24:39 Aug 15, 2013 PDT
[ipn_track_id] => bdd94fdee935a
ipn_track_id
no debe utilizarse; principalmente porque esto es para uso interno solo como se indica, y porque es único para cada mensaje de IPN.
El txn_id
es único para cada transacción , no para cada mensaje de IPN.
Lo que esto significa es; Una transacción puede tener múltiples mensajes de IPN. eCheck, por ejemplo, a dónde irá en estado "Pendiente" de forma predeterminada y "Completar" una vez que se haya borrado el eCheck.
Pero también puede ver cancelaciones, cancelaciones canceladas, casos abiertos y reembolsos contra el mismo txn_id
.
Pseudo código:
If not empty txn_id and txn_type = web_accept and payment_status = Completed
// New payment received; completed. May have been a transaction which was pending earlier.
Update database set payment_status = Completed and txn_id = $_POST[''txn_id'']
If not empty txn_id and txn_type = web_accept and payment_status = Pending
// New payment received; completed
Update database set payment_status = Pending and payment_reason = $_POST[''pending_reason''] and txn_id = $_POST[''txn_id'']
Puede encontrar muchas más variables de IPN en https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_html_IPNandPDTVariables#id08CTB0S055Z
Básicamente; PayPal generará un ID de transacción de vendedor único. Esta ID de transacción puede pasar por varias etapas antes de que se complete, por lo que deberá poder manejar estas excepciones.
En cuanto a la nota de PayPal en la documentación: PayPal puede reenviar mensajes de IPN individuales si encuentra errores durante la entrega. Por ejemplo, se requiere que su secuencia de comandos devuelva una respuesta HTTP HTTP HTTP / 1.100 OK correcta cada vez que PayPal POST le envíe los datos de IPN.
Si no devuelve una respuesta HTTP / 1.1 200 OK, PayPal volverá a intentar enviar los mismos datos hasta 16 veces por mensaje de IPN individual.
Nota: la ID de transacción de un vendedor es diferente de la ID de trascendencia del comprador, ya que son dos acciones diferentes (un débito, un crédito).