web-dev-qa-db-fra.com

Paypal Post cauchemar de manipulation d'IPN

J'essaie d'intégrer le standard Paypal à mon site Wordpress et tout se passait bien jusqu'à ce que je veuille faire une chose simple:

  • L'utilisateur soumet un paiement Paypal
  • Paypal poste l'IPN sur mon serveur
  • Post IPN Hook ajoute un user_meta
  • Si l'utilisateur recharge la page en cours, il vérifie si user_meta précédent est défini sur 1. Si c'est le cas, affiche "vous avez déjà acheté votre ticket"

Je pensais que ce serait assez simple, mais si j'ajoute ceci à mon functions.php pour le post IPN Hook:

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; 
}

Absolument rien ne se passe. Je pense que puisque l'IPN rebondit hors site, l'ID utilisateur n'est peut-être pas disponible? Ou est-ce que je me trompe ici?

Voyant que j'ai raison de dire que l'ID utilisateur n'est pas disponible, je pensais à un autre moyen de saisir l'ID utilisateur. Depuis que j'utilise Gravity Forms avec l'addon Paypal, tous les formulaires soumis sont stockés dans une base de données tables wp_rg_lead & wp_rg_Paypal_transaction. Étant donné que chaque IPN affiche un identifiant de transaction, j'ai pensé que je pouvais faire une jointure entre les deux tables en utilisant l'identifiant de transaction envoyé par Paypal.

alors j'ai essayé:

$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 

));

qui a renvoyé l'ID utilisateur associé à l'ID de transaction. Je me suis dit, génial! Cela fonctionnera!

Cependant, si j'essaie de combiner tout cela dans mon functions.php, rien ne semble fonctionner dans son intégralité.

Ce:

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)
}

Produit rien d'utile.

Si je supprime la requête SQL et dis que je modifie update_user_meta en 1, 'eventRegistration', $txn_id et que je soumets une demande Paypal, la méta mise à jour est correcte.

Je suis un peu perdue, je dois rater quelque chose.

Toute aide serait très appréciée!

Merci!

Tre

1
tr3online

J'ai fini par utiliser une sorte de bidouille. J'ai créé un champ masqué contenant l'ID utilisateur. J'ai ensuite utilisé cela pour mettre à jour les métas et ce qui ne fonctionne pas avec un IPN réussi ou avec un paiement réussi. C'est à dire:

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; 
}

La base de données vérifiant le contenu du gabarit vérifiée dans la table wp_rg_lead pour voir si l'utilisateur actuel dispose d'une entrée pour l'ID de formulaire approprié avec le statut de paiement 'En attente' ou 'Approuvé'. Si c'est le cas, indiquez qu'un achat a déjà été associé au compte et contactez le support technique en cas d'erreur. Le code SQL ressemble à quelque chose comme ça (pas sur le même ordinateur, alors ça me tombe sur la tête):

 $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 
     ) ); 

Ensuite, mon IF/THEN était simplement quelque chose comme:

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

J'espère que cela aide quelqu'un dans une situation similaire!

0
tr3online