php - Paypal IPN 取消成员(member)资格 PHP

标签 php mysql paypal paypal-ipn

因此,当用户购买成员(member)资格时,我获得的代码非常有效。但是我不确定如果用户取消时如何编码。当用户通过它们取消时,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
)

关于php - Paypal IPN 取消成员(member)资格 PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33307592/

相关文章:

php - Facebook API 搜索。

java - 无法显示列表内容/未添加到列表的数据

mysql - 具有多个 DISTINCT 的 SQL 语句

php - 从父子中计算子级 php mysql 5 级深

php与mysql的连接问题 - macbook pro

php - 如何在 zend framework 2 中自动加载 paypal php sdk 的类文件?

node.js - 是否可以使用 authToken 而不是客户端 ID/密码来配置 Paypal 的 Node SDK?

codeigniter - Paypal 沙盒测试买家帐户无法正常工作

php - 从表中排序数据,分配给变量然后从另一个文件调用

php - 如何检查和验证每个用户是否存在某个值并且该值仅包含一次?