Jump to content

Integração com MBWay


Vera Sousa
Go to solution Solved by Vera Sousa,

Recommended Posts

Boa tarde,

É a primeira vez que estou a implementar o método de pagamento por MBWay, já possuo as credenciais de teste e já consigo efetuar pagamentos com sucesso.

Agora chegou à vez de criar o webhook, de forma a receber as notificações de pagamento, nunca fiz nada deste género e estou com dificuldades em entender como funciona esta parte e como avançar a partir daqui.

Já adicionei o webhook, já testei e estou a receber o status 200. Até aqui tudo bem, resta dar a devida continuação...

Alguém entendido nesta matéria que possa dar uma "ajuda"?

Muito obrigada!

Vera Sousa

Link to comment
Share on other sites

Viva, 

Alem do status 200 - Ok, devera estar a ser enviado mais informação, uma referência desse pagamento ou o contacto que fez o pagamento.

Com essa informação, deves conseguir identificar o pagamento, e dar seguimento ao processo do teu lado (alterar o estado da encomenda/passar um documento para os pagos) depende da implementação que estas a fazer.

 

Nunca implementei o MBWay, mas numa implementação com outra gateway de pagamentos, era necessário do meu lado implementar o seguinte para descarregar o corpo do webhook porque a informação detalhada da transferência vem no body via método POST

<?php 
  $body = file_get_contents('php://input');
// codigo de validação e afins

Espero ter ajudado.

Feito é melhor que perfeito

Link to comment
Share on other sites

15 horas atrás, Ivo Vicente disse:

Viva, 

Alem do status 200 - Ok, devera estar a ser enviado mais informação, uma referência desse pagamento ou o contacto que fez o pagamento.

Com essa informação, deves conseguir identificar o pagamento, e dar seguimento ao processo do teu lado (alterar o estado da encomenda/passar um documento para os pagos) depende da implementação que estas a fazer.

 

Nunca implementei o MBWay, mas numa implementação com outra gateway de pagamentos, era necessário do meu lado implementar o seguinte para descarregar o corpo do webhook porque a informação detalhada da transferência vem no body via método POST

<?php 
  $body = file_get_contents('php://input');
// codigo de validação e afins

Espero ter ajudado.

Bom dia,

Acontece que tenho de desencriptar as notificações, o código de exemplo é este:

<?php /* Php 7.1 or later */
$key_from_configuration = "000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f"; 
$iv_from_http_header = "000000000000000000000000"; 
$auth_tag_from_http_header = "CE573FB7A41AB78E743180DC83FF09BD"; 
$http_body = "0A3471C72D9BE49A8520F79C66BBD9A12FF9"; 
$key = hex2bin($key_from_configuration); 
$iv = hex2bin($iv_from_http_header); 
$auth_tag = hex2bin($auth_tag_from_http_header); 
$cipher_text = hex2bin($http_body); 
$result = openssl_decrypt($cipher_text, "aes-256-gcm", $key, OPENSSL_RAW_DATA, $iv, $auth_tag); 
print($result); 
?>

O exemplo de notificação de pagamento é:

{
   "type":"PAYMENT",
   "payload":{
      "id":"8a829449515d198b01517d5601df5584",
      "paymentType":"PA",
      "paymentBrand":"VISA",
      "amount":"92.00",
      "currency":"EUR",
      "presentationAmount":"92.00",
      "presentationCurrency":"EUR",
      "descriptor":"3017.7139.1650 OPP_Channel ",
      "result":{
         "code":"000.100.110",
         "description":"Request successfully processed in 'Merchant in Integrator Test Mode'"
      },
      "authentication":{
         "entityId":"8a8294185282b95b01528382b4940245"
      },
      "card":{
         "bin":"420000",
         "last4Digits":"0000",
         "holder":"Jane Jones",
         "expiryMonth":"05",
         "expiryYear":"2018"
      },
      "customer":{
         "givenName":"Jones",
         "surname":"Jane",
         "merchantCustomerId":"jjones",
         "sex":"F",
         "email":"jane@jones.com"
      },
      "customParameters":{
         "SHOPPER_promoCode":"AT052"
      },
      "risk":{
         "score":"0"
      },
      "buildNumber":"ec3c704170e54f6d7cf86c6f1969b20f6d855ce5@2015-12-01 12:20:39 +0000",
      "timestamp":"2015-12-07 16:46:07+0000",
      "ndc":"8a8294174b7ecb28014b9699220015ca_66b12f658442479c8ca66166c4999e78"
   }
}

As variáveis serão:

$http_body = file_get_contents("php::/unit"); 
$key_from_configuration = "webhook-secret-key";

/* 
$iv_from_http_header = "000000000000000000000000";
$auth_tag_from_http_header = "CE573FB7A41AB78E743180DC83FF09BD"; 
*/

Da forma como tenho o código implementado será mais lógico pegar a notificação que diz respeito ao payload de ID X.

A questão é que estou sem perceber o que colocar nas variáveis que se encontram dentro do comentário acima.

O webhook tem um ID, será o $auth_tag_from_http_header?

Obrigada!

Link to comment
Share on other sites

O que me está a dificultar é o facto de me aparecer este erro, sempre que tento visualizar a página:

Citação

 

Oops! An Error Occurred

The server returned a "405 Method Not Allowed".

Something is broken. Please let us know what you were doing when this error occurred. We will fix it as soon as possible. Sorry for any inconvenience caused.

 

Só sei que estou a receber a notificação porque ao fazer teste no backoffice da SIBS retorna 200 e a notificação encriptada.

Link to comment
Share on other sites

18 minutos atrás, Vera Sousa disse:

O que me está a dificultar é o facto de me aparecer este erro, sempre que tento visualizar a página:

Só sei que estou a receber a notificação porque ao fazer teste no backoffice da SIBS retorna 200 e a notificação encriptada.

Resolvi isto com: 

Route::match(['get', 'post'], 'payments', PaymentComponent::class)->name('payments');

No entanto, não imprime os resultados, estes só aparecem quando faço teste através do backoffice da sibs..

Link to comment
Share on other sites

Log do teste:

Status code: 200
Headers:

Transfer-Encoding : chunked

X-Frame-Options : SAMEORIGIN

X-RateLimit-Remaining : 59

Server : nginx/1.18.0 (Ubuntu)

Cache-Control : no-cache, private

Access-Control-Allow-Origin : *

X-Content-Type-Options : nosniff

Connection : keep-alive

X-RateLimit-Limit : 60

X-XSS-Protection : 1; mode=block

Date : Mon, 30 Aug 2021 10:30:33 GMT

Content-Type : application/json

Body:

{\"data\":{\"encryptedBody\":\"6FB7EC8CB523DD3790A4B19DE9B3A992E29E12C4CD05D00A15FFE67DDFB3B70FE5E773983A749F46EB7EFB059BC9CD6C2E4301C9B3582FB516DA8232768726EC56DA67380550A22422FDC1483B767BD6C36702D67B1D857A541E8CB1D8E050D6B2DD8A0C728E62D5304A2DECE6D17D3617A85769A233BC53FBFDDAEA6C0F02434959E4C15297AD97B768CB20C513965EC65AA1BE90FE6E3F9B0D09824D1C40E0536CD9E1612CC273F5A4696A202C21C55A4B37952F501B7CBC15B778\"},\"status\":200}

 

No entanto, não aparece se estiver com a página aberta:

{"data":null,"status":200}

O código de momento:

$payload = @file_get_contents('php://input');
$payload = json_decode( $payload, true);
\Log::info(json_encode( $payload));
return response()->json([ 'data' => $payload, 'status' => \Symfony\Component\HttpFoundation\Response::HTTP_OK]);

Já tentei outros códigos, nada resulta.

 
Link to comment
Share on other sites

  • Solution

Finalmente consegui perceber o elo de ligação que me faltava.

Embora não dê para visualizar em www.domainX.com/api/payment o conteúdo é recebido, como se pode verificar no Log.

Aqui segue o código correto:

Route::match(['get', 'post'], 'payment', function (Request $request) {

    $payload = $request->getContent();
    $payload = json_decode( $payload, true);

    $key_from_configuration = "xxxx"; // webhook secret key 
    $iv_from_http_header = $request->header('x-initialization-vector'); // x-initialization-vector
    $auth_tag_from_http_header = $request->header('x-authentication-tag'); // x-authentication-tag	
    $http_body = $payload['encryptedBody']; // encripted body	

    $key = hex2bin($key_from_configuration); 
    $iv = hex2bin($iv_from_http_header); 
    $auth_tag = hex2bin($auth_tag_from_http_header); 
    $cipher_text = hex2bin($http_body); 
    $result = openssl_decrypt($cipher_text, "aes-256-gcm", $key, OPENSSL_RAW_DATA, $iv, $auth_tag); 

    \Log::info(json_encode( $result)); /* Poderás visualizar o resultado em storage/logs/laravel.log */
    
    return print_r($result); /* Dar o devido tratamento.. */
});

Não esquecer de inserir em VerifyCrsfToken:

protected $except = [
  'api/payment'
];

Obrigada!

  • Vote 1
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.