我正在尝试将adyen api实现到我的项目中,我遇到了以下问题:
首先,我收到来自adyen的通知回调,其中AUTHORIZATION为true且传输状态为1,但在此之后,我没有收到任何其他通知。即使付款流程为CAPTURED为真,通知也不会到达。
我在adyen沙箱中测试了adyen通知,并且通知工作正常。 以下是回调文件的代码示例:
if (($eventCode=="AUTHORISATION") && ($success=="true"))
{
if($paymentRecharge['status']!=0) //Check if status is placed only
{
ReleaseTableLock($orderID);
print('[accepted]');
return;
}
if (($paymentRecharge['adyen_amount']!=$value) || ($paymentRecharge['currency']!=$currency)) //Check to see if the paid value is the same as our value, otherwise this is Fraud
{
SetPaymentStatus($orderID,5);
ReleaseTableLock($orderID);
print('[accepted]');
return;
}
MarkAsAuthorised($orderID); //changes status to 1 - authorised
//check if we need to Capture automatically
if($adyenParams['adyen_capture']==1)
{
$adyen = new AdyenGateway();
$data = array();
$data["params"] = $adyenParams;
$data["userId"] = $paymentRecharge['customerId'];
$response;
$result=$adyen->Capture($data,$pspReference,$response,$paymentRecharge['userId'],$paymentRecharge['adyen_amount'],$paymentRecharge['currency']);
}
}
if (($eventCode=="AUTHORISATION") && ($success=="false"))
{
SetPaymentStatus($orderID,6);
ReleaseTableLock($orderID);
print('[accepted]');
return;
}
if (($eventCode=="CAPTURE") && ($success=="true"))
{
SetPaymentStatus($orderID,2);
ProcessPayment($orderID);
}
//Release the payment order lock
ReleaseTableLock($orderID);
print('[accepted]');
有关为何发生这种情况的任何想法?
答案 0 :(得分:5)
解决方案不在我之前分享的代码示例中。它发生了这样的事情 - 按照惯例,我有一个表锁,考虑到Adyen发送并行通知和修改的事实,也许其中一些是用于付款的其他帐户,如果表锁失败,我发送给他们一个[失败]回复,而不是[接受]。
Adyen不接受[失败]回复。这样做会导致消息队列被阻止重试。 documentation中明确提到了这一点。
他们的系统不理解[失败],只接受[接受]。对于这件事,因为我有一些较旧的付款不断回来作为Adyen的通知,我的系统没有找到它们并且锁定失败所以我一直向他们发送[失败]回复。 Adyen把我放在禁区内,并标记我没有收到通知。
来自adyen文档:
接受通知
在收到通知后的10秒内,将响应“[accepted]”从服务器发送到Adyen服务器。 我们建议您单独接受和回复通知,以便处理它们。
我们的服务器收到此回复后,通知中的所有项目都会标记为已接收。
至少一次投放
如果通知传递失败,或者如果无法从响应中确定邮件是否已成功传递,则会多次发送通知。此至少一次传送规则意味着您可能会多次收到相同的通知。
<强>试强>
每当未明确收到成功的响应时,会定期以不断增加的时间间隔多次发送通知:
2分钟 5分钟 10分钟 15分钟 30分钟 1小时 2小时 4个小时 8小时 在第三次尝试失败后,即在2 + 5 + 10 = 17分钟之后,在Adyen客户区(CA)中显示系统消息。 然后,系统会在接下来的七天内每8小时继续重试一次。
如果您想触发重发尝试,可以向自己发送测试通知:
在客户区中,转到设置&gt;服务器通信。 如果操作成功,则重新发送所有排队通知。 否则,您将了解我们的系统在此之前记录的当前错误。