贝宝 IPN 取消会员资格 PHP
Paypal IPN Cancel Membership PHP
因此,当用户购买会员资格时,我获得的代码非常有效。但是我不确定如果用户取消时如何编码。当用户通过它们取消时,papal 会向您抛出哪些字段?
我知道我应该使用 subscr_cancelled
但不确定取消背后的正确伪代码和逻辑。
例如:
- 用户取消时的支付状态是什么?
- 我只是忽略付款状态吗?
到目前为止,这是我的代码,它有点笨拙,因为我已经测试了很多:
if (strcmp ($res, "VERIFIED") == 0) {
// check whether the payment_status is Completed
// check that txn_id has not been previously processed
// check that receiver_email is your PayPal email
// check that payment_amount/payment_currency are correct
// process payment and mark item as paid.
// assign posted variables to local variables
$item_name = $_POST['item_name'];
$item_number = $_POST['item_number'];
$txn_type = $_POST['txn_type'];
$payment_status = $_POST['payment_status'];
$payment_amount = $_POST['mc_gross'];
$payment_currency = $_POST['mc_currency'];
$txn_id = $_POST['txn_id'];
$receiver_email = $_POST['receiver_email'];
$payer_email = $_POST['payer_email'];
$id = $_POST['custom'];
$make_premium =1;
$make_loser=0;
if($payment_status=="Completed"){
$user_id_check = $mysqli->query("SELECT `username` FROM `users` WHERE `ID` ='$id'");
if($user_id_check->num_rows > 0){
$txn_id_check = $mysqli->query("SELECT `transaction_id` FROM `payment` WHERE `transaction_id`='$txn_id'");
if($txn_id_check->num_rows != 1) {
$query = "INSERT INTO `payment` (`transaction_id`, `payment_status`, `users_id`, `txn_type`) VALUES(?, ?, ?, ?)";
$statement = $mysqli->prepare($query);
$statement->bind_param('ssis',$txn_id, $payment_status, $id, $txn_type);
if($statement->execute()){
if($txn_type =="subscr_signup"){
$update_user_to_premium =("UPDATE `users` SET `is_member` =? WHERE `ID` =?");
$stmt =$mysqli->prepare($update_user_to_premium);
$stmt->bind_param('ii',$make_premium,$id);
$stmt->execute();
}
}else{
die('Error : ('. $mysqli->errno .') '. $mysqli->error);
}
$statement->close();
}
}
}
}
if($txn_id_check->num_rows == 1){
if($txn_type=="subscr_cancel"){
$update_user_to_loser =("UPDATE `users` SET `is_member` =? WHERE `ID` =?");
$stmt =$mysqli->prepare($update_user_to_loser);
$stmt->bind_param('ii',$make_loser,$id);
$stmt->execute();
}
{
if(DEBUG == true) {
error_log(date('[Y-m-d H:i e] '). "Verified IPN: $req ". PHP_EOL, 3, LOG_FILE);
}
} else if (strcmp ($res, "INVALID") == 0) {
// log for manual investigation
// Add business logic here which deals with invalid IPN messages
if(DEBUG == true) {
error_log(date('[Y-m-d H:i e] '). "Invalid IPN: $req" . PHP_EOL, 3, LOG_FILE);
}
}
我应该使用这样的东西吗
switch ($_POST['txn_type']) {
case 'subscr_signup':
break;
case 'subscr_eot':
//subscription end of term
break;
case 'subscr_cancel':
//subscription canceled
break;
编辑:
if (strcmp ($res, "VERIFIED") == 0) {
// check whether the payment_status is Completed
// check that txn_id has not been previously processed
// check that receiver_email is your PayPal email
// check that payment_amount/payment_currency are correct
// process payment and mark item as paid.
// assign posted variables to local variables
$item_name = $_POST['item_name'];
$item_number = $_POST['item_number'];
$txn_type = $_POST['txn_type'];
$payment_status = $_POST['payment_status'];
$payment_amount = $_POST['mc_gross'];
$payment_currency = $_POST['mc_currency'];
$txn_id = $_POST['txn_id'];
$receiver_email = $_POST['receiver_email'];
$payer_email = $_POST['payer_email'];
$id = $_POST['custom'];
$subscr_id = $_POST['subscr_id'];
$make_premium =1;
$make_loser=0;
if($payment_status=="Completed"){
$user_id_check = $mysqli->query("SELECT `username` FROM `users` WHERE `ID` ='$id'");
if($user_id_check->num_rows > 0){
$txn_id_check = $mysqli->query("SELECT `transaction_id` FROM `payment` WHERE `transaction_id`='$txn_id'");
if($txn_id_check->num_rows != 1) {
$query = "INSERT INTO `payment` (`transaction_id`, `payment_status`, `users_id`, `txn_type`, `subscr_id`) VALUES(?, ?, ?, ?, ?)";
$statement = $mysqli->prepare($query);
$statement->bind_param('ssiss',$txn_id, $payment_status, $id, $txn_type, $subscr_id);
if($statement->execute()){
if($txn_type =="subscr_signup"){
$update_user_to_premium =("UPDATE `users` SET `is_member` =? WHERE `ID` =?");
$stmt =$mysqli->prepare($update_user_to_premium);
$stmt->bind_param('ii',$make_premium,$id);
$stmt->execute();
}
}else{
die('Error : ('. $mysqli->errno .') '. $mysqli->error);
}
$statement->close();
}
}
}
}
if($txn_type=="subscr_cancel"){
// get user id from row with subscription id
$get_user_id = $mysqli->("SELECT `users_id` FROM `payment` WHERE `subscr_id`='$subscr_id'");
$row = $get_user_id->fetch_assoc();
$users_id = $row[`users_id`];
$update_user_to_loser =("UPDATE `users` SET `is_member` =? WHERE `ID` =?");
$stmt =$mysqli->prepare($update_user_to_loser);
$stmt->bind_param('ii',$make_loser,$users_id);
$stmt->execute();
}
{
if(DEBUG == true) {
error_log(date('[Y-m-d H:i e] '). "Verified IPN: $req ". PHP_EOL, 3, LOG_FILE);
}
} else if (strcmp ($res, "INVALID") == 0) {
// log for manual investigation
// Add business logic here which deals with invalid IPN messages
if(DEBUG == true) {
error_log(date('[Y-m-d H:i e] '). "Invalid IPN: $req" . PHP_EOL, 3, LOG_FILE);
}
}
?>
如果个人资料被取消,则不会进行付款。那是一种不同类型的交易。没有付款,所以没有付款状态,所以您不会在那种 IPN 中获得该参数。
您可以在沙盒中轻松测试它。您只需要创建一个卖家账户和一个买家账户,并在您的卖家账户中配置 IPN 来点击您的听众。然后从卖家账户创建一个订阅按钮,从买家账户注册,然后取消。这将触发每个步骤的 IPN,因此您可以看到预期的结果并相应地调整您的 IPN 侦听器。
这是 subscr_cancel 交易的 IPN 示例。
Array
(
[amount3] => 4.99
[address_status] => confirmed
[recur_times] => 2
[subscr_date] => 15:51:33 Jan 19, 2015 PST
[payer_id] => YW66KXBKJRRES
[address_street] => 123 Test Ave
[mc_amount3] => 4.99
[charset] => windows-1252
[address_zip] => 64030
[first_name] => Tester
[reattempt] => 1
[address_country_code] => US
[address_name] => Testers, LLC
[notify_version] => 3.8
[subscr_id] => S-6YS75493RP123324L
[payer_status] => verified
[business] => sandbo_1215254764_biz@angelleye.com
[address_country] => United States
[address_city] => Grandview
[verify_sign] => AI7Wj0s667jdpY.UclGpjUpSpsZNAJzn.UcYbCVhXVG5fO05tyBo36EL
[payer_email] => drew@angelleye.com
[payer_business_name] => Testers, LLC
[last_name] => Testerson
[address_state] => MO
[receiver_email] => sandbo_1215254764_biz@angelleye.com
[recurring] => 1
[txn_type] => subscr_cancel
[item_name] => Test Subscription
[mc_currency] => USD
[item_number] => TEST-123
[residence_country] => US
[test_ipn] => 1
[period3] => 1 M
[ipn_track_id] => f0f2f2be88fd
)
因此,当用户购买会员资格时,我获得的代码非常有效。但是我不确定如果用户取消时如何编码。当用户通过它们取消时,papal 会向您抛出哪些字段?
我知道我应该使用 subscr_cancelled
但不确定取消背后的正确伪代码和逻辑。
例如:
- 用户取消时的支付状态是什么?
- 我只是忽略付款状态吗?
到目前为止,这是我的代码,它有点笨拙,因为我已经测试了很多:
if (strcmp ($res, "VERIFIED") == 0) {
// check whether the payment_status is Completed
// check that txn_id has not been previously processed
// check that receiver_email is your PayPal email
// check that payment_amount/payment_currency are correct
// process payment and mark item as paid.
// assign posted variables to local variables
$item_name = $_POST['item_name'];
$item_number = $_POST['item_number'];
$txn_type = $_POST['txn_type'];
$payment_status = $_POST['payment_status'];
$payment_amount = $_POST['mc_gross'];
$payment_currency = $_POST['mc_currency'];
$txn_id = $_POST['txn_id'];
$receiver_email = $_POST['receiver_email'];
$payer_email = $_POST['payer_email'];
$id = $_POST['custom'];
$make_premium =1;
$make_loser=0;
if($payment_status=="Completed"){
$user_id_check = $mysqli->query("SELECT `username` FROM `users` WHERE `ID` ='$id'");
if($user_id_check->num_rows > 0){
$txn_id_check = $mysqli->query("SELECT `transaction_id` FROM `payment` WHERE `transaction_id`='$txn_id'");
if($txn_id_check->num_rows != 1) {
$query = "INSERT INTO `payment` (`transaction_id`, `payment_status`, `users_id`, `txn_type`) VALUES(?, ?, ?, ?)";
$statement = $mysqli->prepare($query);
$statement->bind_param('ssis',$txn_id, $payment_status, $id, $txn_type);
if($statement->execute()){
if($txn_type =="subscr_signup"){
$update_user_to_premium =("UPDATE `users` SET `is_member` =? WHERE `ID` =?");
$stmt =$mysqli->prepare($update_user_to_premium);
$stmt->bind_param('ii',$make_premium,$id);
$stmt->execute();
}
}else{
die('Error : ('. $mysqli->errno .') '. $mysqli->error);
}
$statement->close();
}
}
}
}
if($txn_id_check->num_rows == 1){
if($txn_type=="subscr_cancel"){
$update_user_to_loser =("UPDATE `users` SET `is_member` =? WHERE `ID` =?");
$stmt =$mysqli->prepare($update_user_to_loser);
$stmt->bind_param('ii',$make_loser,$id);
$stmt->execute();
}
{
if(DEBUG == true) {
error_log(date('[Y-m-d H:i e] '). "Verified IPN: $req ". PHP_EOL, 3, LOG_FILE);
}
} else if (strcmp ($res, "INVALID") == 0) {
// log for manual investigation
// Add business logic here which deals with invalid IPN messages
if(DEBUG == true) {
error_log(date('[Y-m-d H:i e] '). "Invalid IPN: $req" . PHP_EOL, 3, LOG_FILE);
}
}
我应该使用这样的东西吗
switch ($_POST['txn_type']) {
case 'subscr_signup':
break;
case 'subscr_eot':
//subscription end of term
break;
case 'subscr_cancel':
//subscription canceled
break;
编辑:
if (strcmp ($res, "VERIFIED") == 0) {
// check whether the payment_status is Completed
// check that txn_id has not been previously processed
// check that receiver_email is your PayPal email
// check that payment_amount/payment_currency are correct
// process payment and mark item as paid.
// assign posted variables to local variables
$item_name = $_POST['item_name'];
$item_number = $_POST['item_number'];
$txn_type = $_POST['txn_type'];
$payment_status = $_POST['payment_status'];
$payment_amount = $_POST['mc_gross'];
$payment_currency = $_POST['mc_currency'];
$txn_id = $_POST['txn_id'];
$receiver_email = $_POST['receiver_email'];
$payer_email = $_POST['payer_email'];
$id = $_POST['custom'];
$subscr_id = $_POST['subscr_id'];
$make_premium =1;
$make_loser=0;
if($payment_status=="Completed"){
$user_id_check = $mysqli->query("SELECT `username` FROM `users` WHERE `ID` ='$id'");
if($user_id_check->num_rows > 0){
$txn_id_check = $mysqli->query("SELECT `transaction_id` FROM `payment` WHERE `transaction_id`='$txn_id'");
if($txn_id_check->num_rows != 1) {
$query = "INSERT INTO `payment` (`transaction_id`, `payment_status`, `users_id`, `txn_type`, `subscr_id`) VALUES(?, ?, ?, ?, ?)";
$statement = $mysqli->prepare($query);
$statement->bind_param('ssiss',$txn_id, $payment_status, $id, $txn_type, $subscr_id);
if($statement->execute()){
if($txn_type =="subscr_signup"){
$update_user_to_premium =("UPDATE `users` SET `is_member` =? WHERE `ID` =?");
$stmt =$mysqli->prepare($update_user_to_premium);
$stmt->bind_param('ii',$make_premium,$id);
$stmt->execute();
}
}else{
die('Error : ('. $mysqli->errno .') '. $mysqli->error);
}
$statement->close();
}
}
}
}
if($txn_type=="subscr_cancel"){
// get user id from row with subscription id
$get_user_id = $mysqli->("SELECT `users_id` FROM `payment` WHERE `subscr_id`='$subscr_id'");
$row = $get_user_id->fetch_assoc();
$users_id = $row[`users_id`];
$update_user_to_loser =("UPDATE `users` SET `is_member` =? WHERE `ID` =?");
$stmt =$mysqli->prepare($update_user_to_loser);
$stmt->bind_param('ii',$make_loser,$users_id);
$stmt->execute();
}
{
if(DEBUG == true) {
error_log(date('[Y-m-d H:i e] '). "Verified IPN: $req ". PHP_EOL, 3, LOG_FILE);
}
} else if (strcmp ($res, "INVALID") == 0) {
// log for manual investigation
// Add business logic here which deals with invalid IPN messages
if(DEBUG == true) {
error_log(date('[Y-m-d H:i e] '). "Invalid IPN: $req" . PHP_EOL, 3, LOG_FILE);
}
}
?>
如果个人资料被取消,则不会进行付款。那是一种不同类型的交易。没有付款,所以没有付款状态,所以您不会在那种 IPN 中获得该参数。
您可以在沙盒中轻松测试它。您只需要创建一个卖家账户和一个买家账户,并在您的卖家账户中配置 IPN 来点击您的听众。然后从卖家账户创建一个订阅按钮,从买家账户注册,然后取消。这将触发每个步骤的 IPN,因此您可以看到预期的结果并相应地调整您的 IPN 侦听器。
这是 subscr_cancel 交易的 IPN 示例。
Array
(
[amount3] => 4.99
[address_status] => confirmed
[recur_times] => 2
[subscr_date] => 15:51:33 Jan 19, 2015 PST
[payer_id] => YW66KXBKJRRES
[address_street] => 123 Test Ave
[mc_amount3] => 4.99
[charset] => windows-1252
[address_zip] => 64030
[first_name] => Tester
[reattempt] => 1
[address_country_code] => US
[address_name] => Testers, LLC
[notify_version] => 3.8
[subscr_id] => S-6YS75493RP123324L
[payer_status] => verified
[business] => sandbo_1215254764_biz@angelleye.com
[address_country] => United States
[address_city] => Grandview
[verify_sign] => AI7Wj0s667jdpY.UclGpjUpSpsZNAJzn.UcYbCVhXVG5fO05tyBo36EL
[payer_email] => drew@angelleye.com
[payer_business_name] => Testers, LLC
[last_name] => Testerson
[address_state] => MO
[receiver_email] => sandbo_1215254764_biz@angelleye.com
[recurring] => 1
[txn_type] => subscr_cancel
[item_name] => Test Subscription
[mc_currency] => USD
[item_number] => TEST-123
[residence_country] => US
[test_ipn] => 1
[period3] => 1 M
[ipn_track_id] => f0f2f2be88fd
)