pagseguro-assinaturas-rcs icon indicating copy to clipboard operation
pagseguro-assinaturas-rcs copied to clipboard

Cancelamento não está funcionando

Open vitormanfredini opened this issue 4 years ago • 4 comments

Estou integrando o plugin à loja de um cliente e descobri que o post_meta "code_pagseguro" não está sendo salvo, e isso impede que o cancelamento da assinatura funcione. (o método requisicao_cancelar_pagseguro não faz a requisição pois não encontra o post_meta "code_pagseguro")

Depois de debugar, vi que deveria ter um ajax POST sendo feito da página da compra finalizada mas isso não está acontecendo, então o método efetivarPagamento nunca é chamado. E é esse método que salva o post_meta que falei ali em cima.

Preciso de ajuda pra solucionar e me coloco a disposição pra contribuir as correções depois. Obrigado!

vitormanfredini avatar May 14 '20 21:05 vitormanfredini

Não entendi sua pergunta. Abra o Chrome inspect na aba Network e me mostre.

san0suke avatar May 14 '20 21:05 san0suke

Não tem nada lá. Não faz nenhuma chamada AJAX quando eu volto do pagseguro para o site.

Deixa eu explicar melhor: Eu finalizo a compra, vou para o pagseguro, faço o pagamento e retorno ao site. Até aqui tudo certo. Porém quando clico para cancelar o pedido, ele cancela somente o pedido dentro do woocommerce e não cancela a assinatura no pagseguro.

Isso não acontece pq ele não chega a salvar esse post_meta code_pagseguro no banco e, assim, quando vai cancelar, não consegue porque precisa desse campo. Aqui o trecho que faz a requisição:

function requisicao_cancelar_pagseguro($order_id, $cart_item) {
        if(!empty(get_post_meta($order_id,"code_pagseguro"))) {
            $code = get_post_meta($order_id,"code_pagseguro")[0];
            $email = $this->controller->gateway->email;
            $token = $this->controller->gateway->token;
            $response = wp_remote_get( $this->controller->baseUrlAssinatura ."cancel/{$code}?email={$email}&token={$token}" );
        }
}

vitormanfredini avatar May 14 '20 22:05 vitormanfredini

Depois de bater mais a cabeça aqui, eu consegui resolver. Essa action não é executada na página quando volta do pagseguro. add_action('woocommerce_receipt_' . $this->id, array($this, 'receipt_page'));

Adicionando essa aqui faz executar direitinho quando volta do pagseguro. add_action('woocommerce_thankyou', array($this, 'receipt_page'));

O método no arquivo PGA_Gateway.class.php ficou assim:

function add_gateway_actions() {
        // Actions.
        add_action('woocommerce_api_pga_gateway', array($this, 'check_ipn_response'));
        add_action('valid_pga_gateway_ipn_request', array($this, 'successful_request'));
        add_action('woocommerce_receipt_' . $this->id, array($this, 'receipt_page'));
  -->   add_action('woocommerce_thankyou', array($this, 'receipt_page'));
        add_filter('woocommerce_payment_gateways', array($this, 'add_pagseguro_assinaturas_gateway'));
        add_action('woocommerce_update_options_payment_gateways_' . $this->id, array($this, 'process_admin_options'));
        add_action('woocommerce_register_post', array($this, 'pga_wc_custom_validate_register_fields'), 10, 3);
}

Também coloquei uma verificação para que não execute se o método de pagamento for outro (já que a action que eu adicionei vai ser chamada para outros métodos também)

    protected function generate_transparent_checkout($order_id) {
        $order = new WC_Order($order_id);
  -->   if($order->get_payment_method() != 'pagseguroassinaturas'){
  -->     return '';
  -->   }
        $pgaUtils = new PGA_Utils();

Não sei se as minhas modificações podem quebrar com diferentes versões do woocommerce, não tenho condições de testar agora. Mando um pull request?

vitormanfredini avatar May 15 '20 14:05 vitormanfredini

Olá Vitor, bom dia. Parabéns por resolver. Pode mandar o Pull request. Mas por favor, continue trabalhando numa branch só sua por enquanto.

san0suke avatar May 15 '20 14:05 san0suke