Paypal IPN 检测退款,PHP

4

我正在对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"); 
    }
}

Hudson


不知道调用此脚本的系统规格,很难回答。您从IPN中期望什么输入? - Pekka
预期会发生什么,实际上又发生了什么?您需要提供更具体的信息。 - Stoosh
如果您从PayPal获得这种状态,它是什么意思?每当我收到已完成的状态时,客户是否有可能拿回他的钱? - Jakob Alexander Eichler
如果付款状态显示为已退款,那么顾客的付款已被撤销。但在大多数情况下,您需要批准退款请求,除非顾客提出了退款申诉,那么钱款可能会在未经您批准的情况下被收回。 - atwellpub
2个回答

8

这是我最终成功使用的代码:

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

取消的逆转为什么会是退款? - Volomike
哦,你说得对,我已经修改了代码,将其排除在外。"Canceled_Reversal的状态表示撤销本身被取消..." - atwellpub

6
我目前正在与PayPal协商此事。问题在于有时您会收到以下消息序列:
  • 已完成(销售)
  • 已撤销(买家投诉)
有时您会得到以下内容:
  • 已完成(销售)
  • 已退款(买家向您投诉并且您未进行“官方”投诉时退款)
有时您会得到以下内容:
  • 已完成(销售)
  • 已撤销(买家投诉)
  • 已退款(您在投诉后退款)
因此,除非PayPal同意实施我的解决方案,在后一种情况下始终在发送“已取消的撤消”之前发送“已退款”,就像几年前的情况一样,或提出另一种解决方案以提供有关此事的某些确定性,否则您需要使用自己的机制来避免重复计算退款。
如果您在数据库中存储交易,则从我的角度来看,以下内容可能非常可靠:
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
  }
}

虽然现在很难找到那些电子邮件,但总的来说回复有点含糊不清:“我们正在努力提高一致性,等待下一个版本。”目前没有与PayPal合作,所以无法确定是否有任何变化。 - nssmart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接