Post excelente, obrigado por escrevê-lo.
Só um ponto sobre o CRC que vale a pena corrigir, porque é o erro que mais custa a diagnosticar.
O texto diz que o CRC é calculado "até o byte anterior ao próprio campo 63". Na verdade a entrada inclui o 6304 — ou seja, o identificador e o tamanho do campo do CRC — e exclui apenas os quatro caracteres do valor. É o que a especificação EMV determina: o cálculo cobre todos os objetos na ordem em que aparecem, mais o ID e o tamanho do próprio CRC.
Dá para confirmar sem discussão. O exemplo do Manual do BR Code do Banco Central termina em 6304AD38. Calculando o CRC-16/CCITT-FALSE sobre esse payload sem os quatro últimos caracteres, mantendo o 6304 no fim da entrada, o resultado é AD38. Cortando o campo 63 inteiro, dá 50D3.
O que torna isto traiçoeiro é que o erro não aparece em nenhum dos sítios onde se costuma testar: o QR é gerado, qualquer leitor decodifica, os campos estão todos lá — e o banco recusa.
Vale também verificar os parâmetros antes de olhar para o Pix: o CRC-16/CCITT-FALSE de 123456789 tem de dar 29B1. Se não der, o problema é reflexão ligada por engano e não o 6304.
Tem este texto em detalhe, com o vetor de teste: https://ntools.xyz/pt-br/crc-pix-brcode — também tem um gerador que faz a conta desta forma.
1