Paypal IPN检测退款,PHP

atw*_*pub 4 php paypal paypal-ipn

我正在iDev联盟paypal IPN上做一些自定义工作,我正在尝试为退款项目设置一个补丁.我的数据库工作正常,但我似乎无法获得IF捕获权.

关于我应该改变它的任何建议?

if($_REQUEST["payment_status"] == "refunded"||$testing==1) 
{
    $email = $_REQUEST["payer_email"];
    $sid = $_REQUEST["subscr_id"];
    $tid = $_REQUEST["txn_id"];

    if (!$tid)
    {
        $tid='xxx';
    }

    if ($testing==1)
    {
        echo  "testing on";
        $sid = "I-E5E34E0DTMUS"; 
    }

    $query = "SELECT * FROM idevaff_sales WHERE tid1='$tid'";
    $result = mysql_query($query);
    if (!$result)
    {
        //echo $query; exit;
        mail('***@gmail.com',"1",$query); 
    }

    $arr = mysql_fetch_array($result);
    $aid = $arr['id'];

    $query = "SELECT * FROM idevaff_affiliates WHERE tid1='$tid'";
    $result = mysql_query($query);
    if ($result)
    {
        //echo $query; 
        mail('***@gmail.com',"2","$query"); 
    }

    $arr = mysql_fetch_array($result);
    $email = $arr['email'];
    $f_name = $arr['f_name'];

    mail($email,"Affiliate Message - A refund has granted for recent affiliate commission.","Dear $f_name,  \n\n Message here about refund" );

    $query = "UPDATE idevaff_sales SET approved=3 WHERE tracking='$sid'";
    $result = mysql_query($query);
    if (!$result)
    {
        //echo $query; exit;
        mail('***@gmail.com',"3","$query"); 
    }
}
Run Code Online (Sandbox Code Playgroud)

哈德森

atw*_*pub 7

以下是我最终成功使用的内容:

if($_REQUEST["payment_status"] == "Refunded" || $_REQUEST["payment_status"] == "Reversed"  || $testing==1)  
{
    /*do database work here*/
}
Run Code Online (Sandbox Code Playgroud)


nss*_*art 5

我目前正在与PayPal谈判此事.问题是,有时你会得到这一系列的消息:

  • 完成(销售)
  • 反转(买方投诉)

有时你得到这个:

  • 完成(销售)
  • 退款(买家向您投诉,并且您在没有"正式"投诉的情况下退款)

有时你得到这个:

  • 完成(销售)
  • 反转(买方投诉)
  • 退款(您在投诉后退款)

因此,除非PayPal同意实施我的解决方案,以便在后一个例子(几年前就是这种情况)中的Refunded之前总是发送Canceled_Reversal,或者提出另一个解决方案来提供一些确定性,你需要使用你的自己的机制不会重复计算退款.

如果您将事务存储在数据库中,以下内容可能非常可靠,来自我的POV:

if (($stat == 'Refunded' || $stat == 'Reversed') && !empty($_POST['parent_txn_id'])) 
{
  $sum = $db->query('SELECT SUM(`mc_gross`) FROM `transactions` WHERE `parent_txn_id`= ?', $_POST['parent_txn_id'])->fetchColumn();
  if ($sum && $sum < 0) {
    // already had reversed/refunded call,
    // ignore this one
  }
}
Run Code Online (Sandbox Code Playgroud)