Paypal Post IPN handling Albtraum

Ich versuche paypal Standard mit meiner WordPress Seite zu integrieren und alles lief gut, bis ich eine einfache Sache machen wollte:

  • Der Benutzer reicht eine Paypal-Zahlung ein
  • Paypal gibt das IPN an meinen Server weiter
  • Post IPN Hook fügt ein user_meta hinzu
  • Wenn der Benutzer die aktuelle Seite neu lädt, prüft er, ob der vorherige user_meta auf 1 gesetzt ist. Wenn dies der Fall ist, wird “Sie haben Ihr Ticket bereits gekauft” angezeigt.

Ich dachte, das wäre ziemlich einfach, aber wenn ich das zu meiner functions.php für den Post IPN Hook hinzufüge:

 add_filter("gform_paypal_post_ipn", "update_order_status", 10, 4); function update_order_status($ipn_post, $entry, $config, $cancel){ // if the IPN was canceled, don't process if($cancel) return; global $current_user; get_currentuserinfo(); $currUID = $current_user->ID; update_user_meta($currUID, 'eventRegistration', 1); return; } 

Absolut passiert nichts. Mein Gedanke ist, dass, da das IPN von außerhalb der Website springt, die Benutzer-ID möglicherweise nicht verfügbar ist? Oder liege ich hier falsch?

Als ich feststellte, dass die Benutzer-ID nicht in Ordnung ist, dachte ich über eine andere Möglichkeit nach, die Benutzer-ID zu erfassen. Da ich Gravity Forms mit dem PayPal-Addon verwende, werden alle eingereichten Formulare in den databasetabellen wp_rg_lead & wp_rg_paypal_transaction . Da jedes IPN eine Transaktions-ID sendet, dachte ich, dass ich einen JOIN zwischen den beiden Tabellen unter Verwendung der von paypal gesendeten Transaktions-ID machen könnte.

also habe ich es versucht:

 $txn_id = 'aRandomStringOfNumbersAndLetters'; // The transaction ID that paypal POSTs $uid = $wpdb->get_col( $wpdb->prepare( " SELECT wp_rg_lead.created_by FROM wp_rg_lead, wp_rg_paypal_transaction WHERE wp_rg_lead.id = wp_rg_paypal_transaction.entry_id AND wp_rg_paypal_transaction.transaction_id = %s ", $txn_id 

));

die die Benutzer-ID zurückgegeben hat, die der Transaktions-ID zugeordnet ist. Ich dachte mir, großartig! Das wird funktionieren!

Wenn ich jedoch versuche, all das mit meinen functions.php zu kombinieren, scheint nichts in seiner Gesamtheit zu funktionieren.

Dies:

 add_filter("gform_paypal_post_ipn", "update_order_status", 10, 4); function update_order_status($ipn_post, $entry, $config, $cancel){ // if the IPN was canceled, don't process if($cancel) return; $txn_id = $ipn_post["txn_id"]; // transaction ID POSTed by PayPal $uid = $wpdb->get_col( $wpdb->prepare( " SELECT wp_rg_lead.created_by FROM wp_rg_lead, wp_rg_paypal_transaction WHERE wp_rg_lead.id = wp_rg_paypal_transaction.entry_id AND wp_rg_paypal_transaction.transaction_id = %s ", $txn_id ) ); update_user_meta($uid[0], 'eventRegistration', 1) return; } function update_order_status($ipn_post, $entry, $config, $cancel){ $txn_id = $ipn_post["txn_id"]; // transaction ID POSTed by PayPal $uid = $wpdb->get_col( $wpdb->prepare( " SELECT wp_rg_lead.created_by FROM wp_rg_lead, wp_rg_paypal_transaction WHERE wp_rg_lead.id = wp_rg_paypal_transaction.entry_id AND wp_rg_paypal_transaction.transaction_id = %s ", $txn_id ) ); update_user_meta($uid[0], 'eventRegistration', 1) } 

Produziert nichts nützliches.

Wenn ich die SQL-Abfrage entferne und sage update_user_meta auf 1, 'eventRegistration', $txn_id und eine Paypal-Anfrage 1, 'eventRegistration', $txn_id , wird das Meta-Update 1, 'eventRegistration', $txn_id aktualisiert.

Ich bin irgendwie ratlos, ich muss etwas vermissen.

Jede Hilfe würde sehr geschätzt werden!

Vielen Dank!

Tre

Solutions Collecting From Web of "Paypal Post IPN handling Albtraum"

Ich habe am Ende eine Art Hack benutzt. Ich machte ein verstecktes Feld, das mit der Benutzer-ID gefüllt wurde. Ich habe das dann verwendet, um Metas zu aktualisieren und was nicht bei einem erfolgreichen IPN und / oder einer erfolgreichen Zahlung. Dh:

 add_filter("gform_paypal_post_ipn", "update_order_status", 10, 4); function update_order_status($ipn_post, $entry, $config, $cancel){ // if the IPN was canceled, don't process if($cancel) return; $currUID = $entry["8"] // The Input # of your hidden ID field update_user_meta($currUID, 'eventRegistration', 1); return; } 

Die databaseüberprüfung, die ich auf Vorlagenebene gehandhabt habe, indem ich die Tabelle wp_rg_lead überprüft habe, um wp_rg_lead , ob der aktuelle Benutzer einen Eintrag für die entsprechende Formular-ID mit dem Zahlungsstatus ‘Ausstehend’ oder ‘Genehmigt’ hat. Wenn dies der Fall ist, zeigen Sie an, dass bereits ein Kauf mit dem Konto verknüpft wurde, und wenden Sie sich an den Support, falls ein Fehler aufgetreten ist. Das SQL sieht in etwa so aus (nicht auf demselben Computer, also gehe ich von meinem Kopf weg):

  $trans_type = $wpdb->get_col( $wpdb->prepare( " SELECT wp_rg_lead.transaction_status FROM wp_rg_lead WHERE wp_rg_lead.form_id = 1 AND wp_rg_lead.created_by = %s ", $txn_id ) ); 

Dann war mein IF / THEN einfach etwas wie:

 if ( $trans_type == 'Pending' || $trans_type == 'Approved' ) { // If the user has a transaction pending or accepted do this } else { // If not, do this } 

Ich hoffe das hilft jemandem in einer ähnlichen Situation!