Jump to content

MBWAY - IfThenPay - PHP


migueloliveira

Recommended Posts

Olá boa tarde, eu peço a vossa ajuda caso consigam da melhor forma. 

É o seguinte, eu gostaria de configurar o método de pagamento MBWAY da empresa Ifthenpay numa loja online feita à base de PhP.

O Site já tem em funcionamento o método de pagamento em Multibanco da ifthenpay. ( já estava configurada)

Encontrei no GITHUB da ifthenpay um exemplo do código para pagamentos MBWAY que pode ser usado no site.

Analisado os ficheiros do site encontrei o código do de multibanco, e a minha questão é se basta inserir lá este cambo de código para a coisa começar a funcionar.

Julgo que pela lógica ainda tenho de adicionar algo na forma de pagamento para isto aparecer e já o fiz e dei o nome de Mbway, tal e qual como o inicio da "Class".

Se alguém me poder ajudar para fazer esta configuração seria uma grande ajuda, Obrigado.

PS: Eu não sou programador e não tenho muitos conhecimentos de PHP para poder confirmar se basta fazer só isto... (tenho alguns conhecimentos devido a coisas do trabalho que vão acontecendo.)

<?php

/* 
 * Exemplo pagamentos por Mbway
 * 
 */

class MbWay 
{
    // webservice MBWay 
    private $mbwayApi = 'https://mbway.ifthenpay.com/IfthenPayMBW.asmx/';
    // A sua Mbway key fornecida pela ifthepay
    private $mbwaykey = 'AAA-123456';
    // chave anti-phishing definida
    private $chaveAntiPhishing = 'f261aebfa55138c20caf18556e17cd29';
    //  no caso desta API terá de ter sempre o valor constante “03”
    private $canal = '03';
    // se pretende que o formato devolvido seja em JSON 
    private $json;
    //  id gerado automaticamente (SetPedido/SetPedidoJSON), poderá ser guardado para consulta posterior do estado do pedido
    private $idsPagamento;
    //  Identificador do pagamento a definir pelo cliente (ex. número da fatura, encomenda, etc…); Máximo 25 caracteres. 
    private $referencia;
    private $telemovel;
    // tipo de pagamento, que poderá ser guardado na base de dados para identificar o tipo de pagamento.
    private $paymentType = 'ifthenpaymbway';

	// método para construir a query para os métodos SetPedido/SetPedidoJSON
    private function buildQuery(array $config)
    {
        return http_build_query($config);
    }
    // método para obter o id de pagamento
    public function getIdPedido()
    {
        return $this->idsPagamento;
    }
    // método para efectuar o envio de pedidos de pagamentos MBWay
    public function setPedido(bool $json, string $referencia, string $valor, string $telemovel, string $email)
    {
        $this->json = $json;
        $this->referencia = $referencia;
        $this->telemovel = $telemovel;
        
		$opts = array('http' =>
			array(
				'method'  => 'POST', // pode ser GET || POST
				'header'  => 'Content-type: application/x-www-form-urlencoded',
				'content' => $this->buildQuery( 
                    array(
                        'MbWayKey' => $this->mbwaykey, // parametro  (Obrigatório)
                        'Canal' =>  $this->canal, // parametro  (Obrigatório)
                        'Referencia' => $referencia, // parametro  (Obrigatório)
                        'valor' => $valor, // parametro  (Obrigatório)
                        'nrtlm' => $telemovel, // parametro  (Obrigatório)
                        'email' => $email,
                        'descricao' => $referencia // parametro  (Obrigatório)
                    )
                ),
			)
		);
        // criar um stream context
        $context  = stream_context_create($opts);
        // construção do url, se $json = true SetPedidoJSON caso contrário SetPedido
		$url = $json ? $this->mbwayApi . 'SetPedidoJSON' : $this->mbwayApi . 'SetPedido';
        // obter o conteúdo do webservice
        $result = file_get_contents($url, false, $context);
        // conversão do resultado
        $result = $json ? json_decode($result) : new SimpleXMLElement($result);
        $this->idsPagamento = $json ? $result->IdPedido : (string) $result->IdPedido;
        // output do resultado no browser
        $this->render($result);
    }
    // método para consultar o estado do(s) pedido(s)
    public function getEstadoPedido(bool $json, string $idsPagamento)
    {
        $this->json = $json;

        $opts = array('http' =>
			array(
				'method'  => 'POST', // pode ser GET || POST
				'header'  => 'Content-type: application/x-www-form-urlencoded',
				'content' => $this->buildQuery( 
                    array(
                        'MbWayKey' => $this->mbwaykey,
                        'Canal' =>  $this->canal,
                        'idspagamento' => $idsPagamento,
                    )
                ),
			)
		);
        // criar um stream context
        $context  = stream_context_create($opts);
        // construção do url, se $json = true EstadoPedidosJSON caso contrário EstadoPedido
		$url = $json ? $this->mbwayApi . 'EstadoPedidosJSON' : $this->mbwayApi . 'EstadoPedido';
        // obter o conteúdo do webservice
        $result = file_get_contents($url, false, $context);
        // conversão do resultado
        $result = $json ? json_decode($result) : new SimpleXMLElement($result);
        // condição que testa se existem erros
        if (empty($result->EstadoPedidos) && $result->Estado === '901') {
            echo $result->MsgDescricao;
        }
        return $result;
    }
    // método que permite apresentar o resultado do método setPedido
    private function render($result)
    {
        if ($result->Estado == '000') {
            // apenas esconde o formulário
            echo '<script type="text/javascript">
                    document.getElementsByTagName("form")[0].style.display = "none";
                </script>';

            echo '<div><table style="width: auto;min-width: 280px;max-width: 320px;padding: 5px;font-size: 11px;color: #374953;border: 1px solid #dddddd; margin-top: 10px;"><tbody><tr><td style="padding: 5px;" colspan="2"><div align="left"><img src="https://ifthenpay.com/img/mbway.png" alt="mbway"></div></td></tr><tr><td align="left" style=" padding:10px; font-weight:bold; text-align:left">Telem&oacute;vel:</td><td align="left" style=" padding:10px; text-align:left">' . $this->telemovel . '</td></tr><tr><td align="left" style=" padding:10px; padding-top:10px; font-weight:bold; text-align:left">Encomenda:</td><td align="left" style=" padding:10px; padding-top:10px; text-align:left">#' . $this->referencia . '</td></tr><tr><td align="left" style="padding:10px; padding-bottom:15px; padding-top:10px; font-weight:bold; text-align:left">Valor:</td><td style="padding:10px; padding-bottom:15px; padding-top:10px; text-align:left">' . number_format($this->json ?$result->Valor : (string) $result->Valor, 2) . ' EUR</td></tr><tr><td style="font-size: x-small; padding:0; border: 0px; text-align:center;" colspan="2">Por favor verifique na App MBWAY e proceda ao pagamento da sua encomenda. <br>Processado por <a href="https://www.ifthenpay.com" target="_blanck">Ifthenpay</a></td></tr></tbody></table></div>';
        } else {
            echo 'Ocorreu um erro: ' . $result->MsgDescricao . '. <br/>Não foi possível concluir o pagamento.';
        }
    }
    // método para o callback
    public function callback(array $http_get)
    {
		//chave=[CHAVE_ANTI_PHISHING]&referencia=[REFERENCIA]&idpedido=[ID_TRANSACAO]&valor=[VALOR]&estado=[ESTADO]
        $chave_ap_ext = $http_get['chave'];
        $idpedido = $http_get['idpedido'];
		$order_id = $http_get['referencia'];
		$valor = $http_get['valor'];
        $estado = $http_get['estado'];
        $orderTotal = '5.00'; // simula o valor da encomenda, este valor noemalmente é retirado da base de dados.

        //verifica se a chave anti-phishing devolvida pela ifthen corresponde � chave definida e se o pagamento é do tipo mbway
		if($this->chaveAntiPhishing === $chave_ap_ext && $this->paymentType == 'ifthenpaymbway') {
            // esconder formulário e tabela do resultado do método setPedido
            echo '<script type="text/javascript">
                    document.getElementsByTagName("table")[0].style.display = "none";
                    document.getElementsByTagName("form")[0].style.display = "none";
                </script>';
            // verifica se o valor no callback corresponde ao valor da encomenda
			if ($valor === $orderTotal) {
                echo "Encomenda PAGA";
                http_response_code(200);
			} else {
                echo "Valor inválido";
                http_response_code(200);
            }
		} else {
            echo "Chave inválida";
            http_response_code(200);
        }
        exit();
	}
}

 

 

Edited by migueloliveira
Link to comment
Share on other sites

Pois, eu bem já tentei que me ajudassem nesse expecto, mas como não sou programador, não sei fazer isto de base.

Gostaria imenso que eles pudessem fazer mas não é fácil, teria que provavelmente pedir a um programador.

Estou um bocado perdido, confesso.

Porque não sei se basta meter este código, e criar só os parâmetros na base de dados 😕

 

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.