Are*_*una 1 php payment payment-gateway adyen
我正在尝试将adyen api实现到我的项目中,我遇到了以下问题:
首先,我收到来自adyen的通知回调,其中AUTHORIZATION为true且传输状态为1,但在此之后,我没有收到任何其他通知.即使付款流程为CAPTURED为true,通知也不会到达.
我已经在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]');
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况的任何想法?
解决方案不在我之前共享的代码示例中.它发生了这样的事情 - 按照惯例,我有一个表锁,考虑到Adyen发送并行通知和修改的事实,也许其中一些用于付款的其他帐户,如果表锁失败,我发送给他们一个[失败]回复,而不是[接受].
Adyen不接受[失败]回复.这样做会导致消息队列被阻止重试.文档中明确提到了这一点.
他们的系统不理解[失败],只接受[接受].对于这件事,因为我有一些较旧的付款不断回来作为Adyen的通知,我的系统没有找到它们并且锁定失败所以我一直向他们发送[失败]回复.Adyen把我放在禁区内,并标记我没有收到通知.
来自adyen文档:
接受通知
在收到通知后的10秒内,将响应"[accepted]"从服务器发送到Adyen服务器.我们建议您单独接受和回复通知,以便处理它们.
在我们的服务器收到此响应后,通知中的所有项目都标记为已接收.
至少一次交付
如果通知传递失败,或者如果无法从响应中确定邮件是否已成功传递,则会多次发送通知.此至少一次传送规则意味着您可能会多次收到相同的通知.
重试
只要未明确接收到成功的响应,就会定期以不断增加的时间间隔多次发送通知:
2分钟5分钟10分钟15分钟30分钟1小时2小时4小时8小时在第三次尝试失败后,即在2 + 5 + 10 = 17分钟后,在Adyen客户区域(CA)中显示系统消息.然后,系统会在接下来的七天内每8小时继续重试一次.
如果要触发重发尝试,可以向自己发送测试通知:
在"客户区"中,转至"设置">"服务器通信".如果操作成功,则重新发送所有排队通知.否则,您将了解我们的系统在此之前记录的当前错误.
| 归档时间: |
|
| 查看次数: |
2444 次 |
| 最近记录: |