我正在尝试将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公司
最合适的回答,由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
}
我希望这能帮助处于类似情况的人!