未收到通知回调

Posted

技术标签:

【中文标题】未收到通知回调【英文标题】:Notification callback is not being received 【发布时间】:2018-10-07 03:12:13 【问题描述】:

我正在使用这个 laravel 包“https://github.com/kanazaca/easypay”使用 Easypay API 创建一个 MB 引用。

我有这个方法来创建引用:

public function generateReference()


    $amount = Session::get('total');

    $payment_info = [
        't_value' => $amount,
        'o_obs' => '',
        't_key' => 1
    ];

    $easypay = new EasyPay($payment_info);

    $reference = $easypay->createReference();

    Session::put('entity', $reference['ep_entity']);
    Session::put('reference', $reference['ep_reference']);
    Session::put('value', $reference['ep_value']);


这个代码可以正常工作,我得到了一些可以使用 MB 或信用卡支付的参考代码。

然后,当付款时,easypay 将调用“通知 URL”。 我们应该在easypay后台的“URL配置”下进行配置。 因为当easypay 服务收到付款时,他们会调用我们提供的URL。所以我在easypay的后台定义了一个url,并在项目中创建了一个路由:

Route::get('/easypay/notification-callback', [
    'uses' => 'PaymentController@receiveNotifications',
    'as'   =>'mb.notifications'
]);

在 api 后台有一个模拟付款的按钮,单击此按钮后没有任何反应,如果我手动访问“http://....ngrok.io/easypay/notification-callback”,它会出现一个空数组:

[]

但在文档 (https://docs.easypay.pt/workflow/payment-notification) 中说,当 Easypay 调用此端点时,它带有几个参数:“ep_cin”、“ep_user”和“ep_doc”,这些参数在此过程中是必需的。所以它不应该出现一个空数组。

您知道可能是什么问题吗?我是使用 API 的初学者,所以我不了解问题可能是什么。

PaymentController receiveNotifications() 方法:

 public function receiveNotifications(Request $request)
    
        dd($request->all());

         //$easypay = new EasyPay($payment_info);

        //$xml = $easypay->processPaymentInfo();

        //return \Response::make($xml, '200')->header('Content-Type', 'text/xml'); //must return in text/xml for easypay
    

带有日志的receiveNotifications() 方法:

public function receiveNotifications(Request $request)
    

        //dd($request->all());
        Log::info('Showing info: ' .var_export($request->all(),true));

        $payment_info = [
            'ep_cin' => $request->ep_cin,
            'ep_user' => $request->ep_user,
            'ep_doc'  => $request->ep_doc
        ];

        Log::info('Showing info: ' .var_export($payment_info,true));

        //dd($payment_info);

        $easypay = new EasyPay($payment_info);

        $xml = $easypay->processPaymentInfo();

        return \Response::make($xml, '200')->header('Content-Type', 'text/xml'); //must return in text/xml for easypay
    

【问题讨论】:

【参考方案1】:

会话保存在访问您的网站并发起付款的用户的会话文件中。

如果您在那里执行任何操作,receiveNotifications 将从属于支付网关服务器的会话文件中调用数据。数据不匹配,因为两者互不了解。

此外,您的请求处理中可能没有Session::save() 将会话数据写入文件。

将引用存储在数据库中。创建一个模型来存储这些数据,这样您就可以查询该模型以获取正确的参考 ID 来验证/执行操作。

当请求从支付网关返回时,使用变量 ep_cin、ep_user 和 ep_doc 从模型中获取数据。

当您手动请求该数据时,您是通过 GET 请求请求该数据,该请求不会同时发送上述数据。

支付提供商发出的请求将获得 DD 的结果,但没有记录在任何地方,所以什么也没有发生。

Log your data 用于远程 api 触发的请求,看看会发生什么。

【讨论】:

谢谢,但我没有正确理解。 generateReference() 生成参考,我可以将结果信息(您的订单记录上的 ep_reference 和 ep_entity)存储在数据库中,我只是存储在会话中,因为只需要向用户显示该参考代码一次。并且 tihs 正在创建引用,我将其呈现给从会话中获取值的用户。因此,第一部分工作正常,无需在数据库上记录任何内容。 让我们continue this discussion in chat.

以上是关于未收到通知回调的主要内容,如果未能解决你的问题,请参考以下文章

通话期间未调用远程通知回调

PushWoosh 通知回调未触发

未调用 PHP 流通知回调

一个通知的多个回调 Pushsharp

iOS 本地通知 - 在后台时回调

Cordova 推送通知 (PhoneGap PushPlugin) 未触发 ecb 回调 (onNotificationAPN)