Vera Sousa Posted August 28, 2021 at 05:02 PM Report Share #623505 Posted August 28, 2021 at 05:02 PM 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 More sharing options...
Ivo Vicente Posted August 28, 2021 at 06:29 PM Report Share #623506 Posted August 28, 2021 at 06:29 PM 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 More sharing options...
Vera Sousa Posted August 29, 2021 at 10:31 AM Author Report Share #623512 Posted August 29, 2021 at 10:31 AM 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 More sharing options...
Vera Sousa Posted August 29, 2021 at 10:53 AM Author Report Share #623513 Posted August 29, 2021 at 10:53 AM 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 More sharing options...
Vera Sousa Posted August 29, 2021 at 11:13 AM Author Report Share #623514 Posted August 29, 2021 at 11:13 AM 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 More sharing options...
Vera Sousa Posted August 30, 2021 at 10:34 AM Author Report Share #623522 Posted August 30, 2021 at 10:34 AM 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 More sharing options...
Solution Vera Sousa Posted August 30, 2021 at 12:29 PM Author Solution Report Share #623524 Posted August 30, 2021 at 12:29 PM 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! 1 Report Link to comment Share on other sites More sharing options...
Ivo Vicente Posted September 1, 2021 at 09:02 PM Report Share #623572 Posted September 1, 2021 at 09:02 PM @Vera Sousa Parabéns por teres encontrado a solução, e por teres adicionado todos os pontos de paragem e como resolver. Será de certo útil de futuro, boa continuação. Feito é melhor que perfeito Link to comment Share on other sites More sharing options...
Vera Sousa Posted September 1, 2021 at 09:06 PM Author Report Share #623573 Posted September 1, 2021 at 09:06 PM Agora, Ivo Vicente disse: @Vera Sousa Parabéns por teres encontrado a solução, e por teres adicionado todos os pontos de paragem e como resolver. Será de certo útil de futuro, boa continuação. Obrigada! 🙂 Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now