pagseguro-assinaturas-rcs
pagseguro-assinaturas-rcs copied to clipboard
Cancelamento não está funcionando
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!
Não entendi sua pergunta. Abra o Chrome inspect na aba Network e me mostre.
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}" );
}
}
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?
Olá Vitor, bom dia. Parabéns por resolver. Pode mandar o Pull request. Mas por favor, continue trabalhando numa branch só sua por enquanto.