【发布时间】:2016-01-23 07:12:07
【问题描述】:
因此,当用户购买会员资格时,我获得的代码可以完美运行。但是,如果用户取消,我不确定如何编码。当用户通过它们取消时,教皇会向您抛出哪些字段?
我知道我应该使用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 simulator?
-
因为 IPN 模拟器不考虑定期会员资格。我已经用 IPN 模拟器测试了好几天了! @Alon 它也不考虑取消等。
-
我必须考虑 subscr_id 吗?我真的希望有更多关于定期付款的文档@AndrewAngell
-
我将原始评论移至包含更多详细信息的答案。至于 subscr_id,这取决于你。您可以对发送的 IPN 数据做任何您想做/需要做的事情,但根据处理的交易类型(付款、退款、订阅注册/付款/取消等),您可能有也可能没有特定的参数。
标签: php mysql paypal paypal-ipn