Skip to main content

Pesquisa — CRMBonus: Visão Consolidada

Data: 2026-05-15
Contexto: Task #193232 — Análise do fluxo de integração CRMBonus
Sub-arquivos:


O que é o CRM&Bonus

O CRM&Bonus é um serviço de fidelidade de terceiros que gerencia bônus de clientes. No contexto do ZZLink/zzapp, clientes acumulam bônus em compras anteriores e podem utilizá-los como desconto em novas compras. A integração é assíncrona em relação ao cliente, mas linear e sequencial entre a API Checkout e a API CRM&Bonus.


As Três Operações

OperaçãoEndpointQuando
Reservabaixa_bonusCriação do pedido (bonus_resgatado > 0)
Efetivaçãofinaliza_compraApós captura bem-sucedida do pagamento
CancelamentocancelarBonusEcomEstorno, cancelamento, falha de captura

Fluxo Completo (conforme código real)

zzApp consulta CRM&Bonus diretamente
└── Envia dados de bônus no createByZzApp
└── CreatePaymentCommandHandler
└── cart.CrmBonus != null?
├── SIM, bonus_resgatado > 0 → baixa_bonus (reserva)
└── NÃO → nenhuma ação CRM

[Pagamento processado]

Captura bem-sucedida?
├── SIM → PosCaptureService
│ └── cart.CrmBonus != null && IdsBonus != null?
│ └── SIM → finaliza_compra (efetivação)
└── NÃO → Refund / Cancelamento
└── cancelarBonusEcom (libera bônus)

Callers por Operação

baixa_bonus (DebitCrmBonusAsync)

CallerCondição
CreatePaymentCommandHandlercart.CrmBonus != null + bonus_resgatado > 0

finaliza_compra (FinishCrmBonusAsync)

Caller diretoInvocado por
PosCaptureServiceAntiFraudWebhookService, PagarMeCaptureService, OrderCommandHandler, WebhookBraspagService, PagarMeCreditCardService, PagarMePixService, FinishPaymentService

cancelarBonusEcom (CancelCrmBonusAsync)

Callerused_bonusCenário
OrderCommandHandlertrueCancelamento manual do pedido (status Created/Pending)
OrderCommandHandlertrueFalha na captura Braspag
AntiFraudWebhookServicetrueFalha na captura Braspag pós-aprovação antifraude
PosRefundService.ExecutePosRefundfalseEstorno pós-captura confirmada (status Analysis/Paid)
PosRefundService.ExecutePosRefundV2falseEstorno pós-captura confirmada (versão v2)

Semântica de used_bonus

Atenção: a semântica é contraintuitiva. O parâmetro não indica se o bônus foi utilizado pelo cliente — indica qual operação precisa ser desfeita. Confirmado tanto pela documentação oficial do parceiro quanto pela análise do código real.

ValorQuando usarfinaliza_compra já foi chamado?Impacto no CRM&Bonus
trueApenas baixa_bonus foi chamado (bônus ainda reservado)❌ NãoCRM libera a reserva
falsefinaliza_compra já foi chamado (bônus efetivado)✅ SimCRM reverte o consumo efetivado

Ocorrências no código:

Callerused_bonusJustificativa
AntiFraudWebhookService (captura Braspag falhou)trueCaptura falhou → finaliza_compra nunca foi chamado
OrderCommandHandler (cancelamento manual Created/Pending)trueStatus pré-captura → finaliza_compra nunca foi chamado
OrderCommandHandler (falha na captura Braspag)trueCaptura falhou → finaliza_compra nunca foi chamado
PosRefundService.ExecutePosRefund (estorno pós-captura)falseStatus Analysis/Paidfinaliza_compra já foi executado
PosRefundService.ExecutePosRefundV2 (estorno pós-captura)falseEstorno de venda confirmada → finaliza_compra já foi executado

Armadilha no código: PosRefundService.cs contém o comentário // INDICA SE O BONUS FOI USADO na variável usedBonus = false. O comentário induz à leitura errada — naquele contexto o bônus foi efetivado. O valor false está correto; o comentário não.


Autenticação na API CRM&Bonus

  • Header Authorization: valor fixo de configuração (Apis:CrmBonus:Authorization)
  • Header Codempresa: Base64(tokenCrm)tokenCrm lido da tabela de lojas via IStorePaymentsRepository.GetTokenCrmByIdAsync(storeId)
  • Se tokenCrm for null para a loja → objeto crmBonus deve ser nullintegração não é executada

Validação de Resposta

Uma resposta do CRM&Bonus é considerada válida somente se:

  1. HttpStatusCode é 2xx, E
  2. Body JSON contém "status": true

Uma resposta HTTP 200 com "status": false é inválida.


Inconsistência Documentada

A documentação interna docs/crm/crm_analise.md descreve incorretamente o comportamento do AntiFraudWebhookService:

Documentação anteriorCódigo real
AntiFraudWebhookServiceused_bonus = false quando antifraude recusaused_bonus = true apenas em falha de captura Braspag
PagarMe + antifraude reprovadocancelamento direto via AntiFraudWebhookServicecancela via PagarMeRefundService → PosRefundService

Pontos de Atenção

  1. FinishCrmBonusAsync não lança exceção: Captura HttpRequestException internamente e loga — uma falha na efetivação do bônus não interrompe o fluxo de captura.

  2. IdsBonus como condição extra no Finish: O PosCaptureService verifica !string.IsNullOrEmpty(cart.CrmBonus.IdsBonus) além do null check. Um CrmBonus sem IdsBonus não dispara finaliza_compra.

  3. paymentIdComplex: O identificador enviado ao CRM&Bonus não é o ID numérico do pedido — é um código composto gerado por ICreateCodePaymentsForIntegrations.CreateCodePayment(orderId).

  4. Cancelamento manual status 81: Conforme Wiki ZZAPPS, o processo manual para pedidos com status 81 (ErrorAntifraud) não inclui o cancelamento de bônus CRM como etapa automática.

  5. Job de expiração: Conforme Wiki ZZAPPS, o JobExpiredOrders também dispara cancelarBonusEcom para pedidos expirados — esse caller não aparece no código da API Checkout (provavelmente implementado em outro serviço/job).