Trabalhar com dinheiro: pagamentos e cobranças
A divisão de responsabilidade
O provedor de pagamento cuida do cartão; você cuida do pedido. Os detalhes são inseridos no formulário do provedor ou em um componente isolado, e do seu lado só se guarda um identificador. Isso te mantém fora da maior parte do mundo pesado de conformidade.
O valor é calculado no servidor a partir dos seus preços. Um valor que veio do cliente é um pedido, não um fato.
Estados, não flags
Um pedido passa por estados definidos: criado, aguardando pagamento, pago, falhou, reembolsado. Cada transição é registrada com horário e motivo. Uma flag booleana 'pago' perde o histórico exatamente quando você precisa.
Notificações do provedor de pagamento chegam fora de ordem e às vezes duas vezes. Trate-as por identificador de evento, de forma segura para repetição.
Conciliação
Construa um processo diário que compare seus registros com o relatório do provedor. Discrepâncias sempre acontecem; a pergunta é se você as encontra ou o cliente.
Indo mais fundo
Armazene valores como inteiros na menor unidade, nunca como decimal de ponto flutuante, e sempre com um código de moeda. Armazene também a taxa de câmbio e o preço realmente exibido — são os dados necessários em qualquer disputa e em qualquer relatório.