PayPal Post IPN处理噩梦

时间:2012-04-02 作者:tr3online

我正在尝试将paypal标准与我的Wordpress网站整合,一切都进展顺利,直到我想做一件简单的事情:

用户提交paypal付款,paypal将IPN发布到我的服务器。Post IPN挂钩添加一个用户元。如果用户重新加载当前页面,它会检查前一个用户元是否设置为1,如果设置为1,则会显示“您已经购买了您的票证”。我想这很简单,但如果我将此添加到我的functions.php 对于后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;

    global $current_user;
    get_currentuserinfo();
    $currUID = $current_user->ID;
    update_user_meta($currUID, \'eventRegistration\', 1);

    return; 
}
绝对什么都没发生。我的想法是,由于IPN从场外反弹,可能用户ID不可用?还是我错了?

考虑到我对用户ID不可用的看法是正确的,我正在考虑另一种获取用户ID的方法。由于我在PayPal插件中使用Gravity表单,所有提交的表单都存储在数据库表中wp_rg_lead &;wp_rg_paypal_transaction. 由于每个IPN都会发布一个事务id,我想我可以使用贝宝发送的事务id在两个表之间进行连接。

所以我试着:

$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\\u user\\u meta更改为1, \'eventRegistration\', $txn_id 并提交paypal请求,元更新良好。

我有点不知所措,我一定错过了什么。

任何帮助都将不胜感激!

谢谢

Tre公司

1 个回复
最合适的回答,由SO网友:tr3online 整理而成

我最后用了一种黑客手段。我创建了一个用用户ID填充的隐藏字段。然后,我使用它来更新metas,以及成功IPN和/或成功付款中没有的内容。Ie:

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 表以查看当前用户是否有付款状态为“待定”或“已批准”的相应表单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 ( $trans_type == \'Pending\' || $trans_type == \'Approved\' ) {
    // If the user has a transaction pending or accepted do this
} else {
    // If not, do this
}
我希望这能帮助处于类似情况的人!

结束

相关推荐

Paypal Integration

我想将贝宝支付集成到我的Wordpress网站,以便发送数字产品。我只想一个简单的重定向到贝宝支付表单,要么通过贝宝支付,要么用信用卡支付(我在那里有一个支付标准帐户)。问题是通知系统。我希望我的客户能够在付款后立即下载我的数字产品。是否有一个插件可以处理这种情况,并确保支付和交付正常进行(使用贝宝通知系统)?我在看Paypal框架,我碰巧是个程序员。如果我仔细看看,它会允许我做我想做的事吗?