web-dev-qa-db-ja.com

ペイパルポストのIPN nde悪夢

私は私のWordpressサイトにPaypal標準を統合しようとしています、そして私が1つの簡単なことをしたいと思うまですべてはうまくいっていました:

  • ユーザーがPaypalの支払いを送信する
  • Paypalは私のサーバーにIPNを投稿します
  • ポストIPNフックはuser_metaを追加します
  • ユーザーが現在のページをリロードすると、前のuser_metaが1に設定されているかどうかを確認し、そうであれば「すでにチケットを購入しました」と表示します。

私はこれはかなり簡単であると思いました、しかし私がポストIPNフックのためにこれを私のfunctions.phpに加えるならば:

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

絶対に何も起こりません。私の考えでは、IPNはオフサイトから跳ね返っているので、ユーザーIDは利用できないのでしょうか。それとも私はここで間違っていますか?

ユーザーIDが有効ではないことが正しいと考えて、ユーザーIDを取得する別の方法を考えていました。私はPaypalアドオンと共に重力フォームを使っているので、提出されたすべてのフォームはデータベーステーブルwp_rg_leadwp_rg_Paypal_transactionに格納されます。すべてのIPNがトランザクションIDを投稿するので、Paypalから送信されたトランザクションIDを使用して2つのテーブル間でJOINを実行できると考えました。

だから私は試してみました:

$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 

;);

これは、トランザクションIDに関連したユーザーIDを戻しました。私は自分自身に考えた、素晴らしい!これはうまくいくでしょう!

しかし、これらすべてを自分のfunctions.phpに組み込もうとすると、その全体がうまくいくようには見えません。

この:

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

有用なものは何も生成されませんでした。

SQLクエリを削除し、update_user_metaを1, 'eventRegistration', $txn_idに変更してPaypalリクエストを送信すると言った場合、メタは正常に更新されます。

私は迷っているようなものです、私は何かが足りないはずです。

任意の助けは大歓迎です!

ありがとうございます。

トレ

1
tr3online

私は一種のハックを使用することになりました。ユーザーIDを入力した隠しフィールドを作りました。それから私はこれを使ってメタを更新し、IPNや支払いが成功しなかったことを更新しました。すなわち:

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

データベースチェックでは、wp_rg_leadテーブルをチェックして、現在のユーザーに、支払いステータスが 'Pending'または 'Approved'の適切なフォームIDのエントリがあるかどうかを確認することで、テンプレートレベルで処理しました。そうであれば、そのアカウントにすでに関連付けられている購入があったことを表示し、エラーがあった場合はサポートに連絡する。 SQLは次のようになります(同じコンピューター上ではないので、頭の上からはみ出します)。

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

それなら私のIF/THENは単にこんな感じでした:

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

私はこれが同じような状況で誰かを助けるのを願っています!

0
tr3online