Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[PIX Link] - Contribuições técnicas #129

Closed
felipecn opened this issue Jul 15, 2020 · 68 comments
Closed

[PIX Link] - Contribuições técnicas #129

felipecn opened this issue Jul 15, 2020 · 68 comments
Assignees

Comments

@felipecn
Copy link

Descreva sua dúvida ou problema
Pelo que li nas especificações de iniciação do PIX, entendi que o Banco Central irá registrar o aplicativo de cada PSP para ativar App Links (para Android) e Universal Links (para iOS).
A documentação sempre trabalha com a premissa de que o sistema operacional irá permitir ao usuário escolher a aplicação que irá abrir aquele link (ou definir um padrão) dentre as que tem instalado. O que é válido para o Android.
Porém, no iOS, não é possível escolher o aplicativo aberto por um universal link.
Meu entendimento é que o primeiro aplicativo listado no https://pix.bcb.gov.br/.well-known/apple-app-site-association que o usuário tiver instalado será aberto.

Isso dito, tenho duas dúvidas:

  1. Qual será a ordem usada no https://pix.bcb.gov.br/.well-known/apple-app-site-association para listar os aplicativos de cada PSP? Tinha a impressão de ser na ordem alfabética pelo nome de cada instituição mas não achei a especificação.
  2. Existe alguma intenção de mitigar esse caso? Creio um usuário ter mais um aplicativo compatível com PIX Links será um cenário bastante comum.

Sistema ou Área
PIX Link

@ninrod ninrod self-assigned this Jul 15, 2020
@ninrod
Copy link
Member

ninrod commented Jul 15, 2020

Meu entendimento é que o primeiro aplicativo listado no https://pix.bcb.gov.br/.well-known/apple-app-site-association que o usuário tiver instalado será aberto.

@felipecn, estamos interessados nesse elemento que você pontuou. Você poderia citar documentação, se possível, oficial da Apple, que confirme esse entendimento?

@felipecn
Copy link
Author

Há pouca documentação oficial sobre esse ponto, mas em Support Universal Links, há esse trecho

The value of the details key is an array of dictionaries, one dictionary per app that your website supports. The order of the dictionaries in the array determines the order the system follows when looking for a match, so you can specify an app to handle a particular part of your website.

Assim, como o path de todo PIX Link será o mesmo para cada PSP, acho que o iOS usará a ordem no apple-app-site-association para definir qual aplicativo abrir.

@ninrod
Copy link
Member

ninrod commented Jul 15, 2020

Caro @felipecn , apenas para ficar mais claro.

Se o Bacen servir um AASA file assim:

{
    "applinks": {
        "apps": [],
        "details": [
            {
                "appID": "APP1.com.example",
                "paths": [ "qr/"]
            },
            {
                "appID": "APP2.com.example",
                "paths": [ "qr/" ]
            }
        ]
    }
}

Seu entendimento é que o iOS vai abrir a APP1 diretamente, sem permitir que o usuário escolha o APP (assim como acontece com um PDF, por exemplo?)

@felipecn
Copy link
Author

Exato. Na maioria dos casos o app é aberto automaticamente. Em alguns casos, especialmente quando há um redirect, é exibido um prompt apenas para confirmar se deve direcionar para outro app.

BB9C9C73-981F-41CB-9B15-2BD6DC2EA2ED

@ninrod
Copy link
Member

ninrod commented Jul 15, 2020

Certo, e você acredita que o android apresenta um comportamento diferente, que seria o de oferecer ao usuário a possibilidade de escolher o aplicativo?

@felipecn
Copy link
Author

Eu tinha praticamente certeza que sim, mas estava pensando na experiência de deep links.
Lendo a documentação dos App Links, aparentemente o dialogo de desambiguação que eu estava lembrando de ver no Android não é exibido para App Links. (The difference between deep links and app links)

É falado sobre múltiplos apps associados à paths diferentes, mas não o comportamento de múltiplos apps no mesmo path.

@ninrod
Copy link
Member

ninrod commented Jul 16, 2020

É falado sobre múltiplos apps associados à paths diferentes, mas não o comportamento de múltiplos apps no mesmo path.

Sim, é bem difícil obter informações claras sobre esse caso de uso específico nas documentações oficiais.

@ninrod
Copy link
Member

ninrod commented Jul 16, 2020

Eu tinha praticamente certeza que sim, mas estava pensando na experiência de deep links.

Esse trecho indica que o Android trabalharia da maneira como pensávamos, mas de maneira nenhuma deixa clara a experiência do usuário no sentido de poder escolher o app.

@ninrod
Copy link
Member

ninrod commented Jul 22, 2020

@oximer, @felipecn e demais devs que eventualmente cheguem nessa issue, gostaríamos de entender exatamente qual é o comportamento do iOS ao se utilizar universal links. Como exemplo, suponha que o BCB sirva o seguinte arquivo AASA (apple-app-site-association) file em pix.bcb.gov.br/.well-known/apple-app-site-association:

{
    "applinks": {
        "apps": [],
        "details": [
            {
                "appID": "APP1.com.example",
                "paths": [ "qr/"]
            },
            {
                "appID": "APP2.com.example",
                "paths": [ "qr/" ]
            },
           {
                "appID": "APP3.com.example",
                "paths": [ "qr/" ]
            }
        ]
    }
}

Temos as seguintes perguntas:

  1. A ordem de instalação tem algum efeito? Se o usuário instalar na sequência 3 -> 2 -> 1, o iOS adotaria o mesmo comportamento no caso em que o usuário instalasse na ordem 1 -> 2 -> 3? Ou seja, abriria sempre o APP1? É sempre o primeiro elemento do array que "ganha" a precedência? Como funciona, exatamente, essa precedência?

  2. A associação do app ao domínio acontece somente no momento da instalação ou atualização do app, ou o arquivo AASA é checado de tempos em tempos pelo iOS?

  3. Uma vez que o iOS escolha, baseado na ordem de precedência do AASA file, um app para abrir um link pertencente a determinado domínio, essa escolha permanece ou uma nova escolha pode ser feita decorrente de instalações de novos aplicativos e eventuais mudanças na ordem de precedência do arquivo AASA?

  4. Há alguma forma, de repente escondida nas configurações do iOS, que permita o usuário escolher qual dos 3 APPS ele quer utilizar para abrir links com domínio pix, de maneira que o usuário possa ignorar qualquer ordem de precedência estabelecida pelo AASA file?

  5. Essa impossibilidade de escolha está restrita ao iOS ou no Android teríamos o mesmo problema?

  6. Conseguimos citar documentação oficial que comprove esse entendimento?

@ninrod ninrod changed the title [Dúvida] no [PIX Link] - Definição do App padrão no iOS [Dúvida] no [PIX Link] - Possibilidade de escolha do app no iOS (universal links) Jul 22, 2020
@oximer
Copy link

oximer commented Jul 22, 2020

  1. Não faz diferença a ordem de instalação
  2. É checado de tempo em tempo, inclusive é razão de bugs constante. Se o usuário instala o a aplicativo e a ocorre um erro de conexão a internet, muitas vezes não ocorre a associação entre url e app. Não fica claro quando o OS checa novamente, mas eventualmente ele checa. Recebo muitas reclamações no app da minha empresa. Depois de alguns dias, o mesmo app passa a abrir o link. Então, sabemos que o OS faz isso em background em algum momento definido exclusivamente por eles.
    3.No iOS não existe essa escolha de preferencia. A preferencia é feita pela ordem do AASA. Acredito que se um novo aplicativo for instalado, a ordem do AASA passa a ser respeitada. Entretanto, não fiz testes sobre o assunto. Apenas, li a documentação e forums.
    4.Entendo que não. Uma alternativa seria o usuário cair no site do Bacen, escolher o app de preferencia no site do Bacen e o site fazer um redict vira urlscheme para o app do banco escolhido. A experiência ficaria prejudicada, mas teríamos isonomia.
    5.Restrita ao iOS
    6.O @felipecn já colocou o trecho da documentação.

Entendo que esse problema é crítico dado que impediria isonomia entre os bancos e fintechs.

@tfalencar
Copy link

tfalencar commented Jul 22, 2020

https://developer.apple.com/videos/play/wwdc2020/10146/ e https://developer.apple.com/videos/play/wwdc2020/10098/ são relevantes para este tema.

@oximer
Copy link

oximer commented Jul 23, 2020

@tfalencar assisti ao conteúdo. Ambos os vídeos são legais, mas não respondem a algumas das questões levantadas.
Continuamos com problemas para tratar links quando o cliente tiver mais de um banco/fintech instalado no celular.

@felipecn essa experiencia de redirect que você mostro no caso do submarino acontece em um muitos casos por causa de analytics. Muitas empresas contratam soluções de marketing e querem fazer tracking da conversão dos links para calcular CAC e ROI de campanhas.

Como eu disse redirect pode ser um caminho, prejudicaríamos a experiencia em troca de isonomia.
Mas exigiria uma implementação do BACEN, para guardar preferência por usuário (estrutura de cookie), criar database para relacionar banco a um urlscheme....

Alguma outra alternativa?

@oximer
Copy link

oximer commented Jul 28, 2020

Pessoal estive pensando que o modelo atual de iniciação não permite o pagamento por link no mundo WEB.
Dado que o manual de iniciação por link diz que o link será no padrão:

https://pix.bcb.gov.br/qr/MDAwMjAxMDEwMjEyMjY3MjAwMTRici5nb3Yu
YmNiLnBpeDI1NTBieC5jb20uYnIvcGl4LzhiM2RhMmYzLTlhNDEtNDBkMS1h
OTFhLWJkOTMxMTNiZDQ0MTUyMDQwMDAwNTMwMzk4NjU0MDYxMjMuNDU1ODAy
QlI1OTEzRnVsYW5vIGRlIFRhbDYwMDhCUkFTSUxJQTYyMTkwNTE1UlAxMjM0
NTY3OC0yMDE5NjMwNDQ1QzgK

Se eu enviar um link de cobrança por email para você, se você tiver no desktop trabalhando, você não consegue pagar sem utilizar um celular. Esse cenário é muito ruim principalmente para PJs.

Acredito que a alternativa para esse caso seja realmente o BACEN no site pix.bcb.gov.br criar uma estrutura de redirecionando para o internet banking dos player cadastrados no sistema. O usuário salvaria sua preferência e o BACEN faria o redirect. O BACEN teria que manter um banco de dados com CHAVE/VALOR com o endereço/domínio de internet banking de cada banco/fintech no país.

Essa solução trataria até mesmo o problema do PIX link no iOS descrito nessa issue.
Dado que ao fazer o redirect, o usuário mobile poderia ser redirecionado via url-scheme para o app do banco.

Evidentemente a usabilidade no mundo iOS ficaria um levemente pior que a experiência no Android.
O usuário teria esse quebra molas de ao clicar no link, abrir o browser e do browser ser redirecionado app.

Nesse primeiro momento, o BACEN nem precisaria criar um sistema complexo de login ou identificação.
A escolha do usuário poderia ficar salva no cache.
Trocou a máquina ou usou aba anônima, ele tem que selecionar o banco do redirect novamente.

Me preocupa essa indefinição a poucos dias do lançamento dado que essa questão é bastante estrutural.
Estou a disposição para discussão de outros possíveis soluções.

@ninrod
Copy link
Member

ninrod commented Jul 28, 2020

@oximer , essa situação no desktop está sendo endereçada. Devem sair definições sobre essa questão nas próximas versões do manual de UX.

A respeito da questão de isonomia envolvendo links, também está sendo endereçada. Por isso estou deixando a issue em aberto.

@oximer
Copy link

oximer commented Jul 28, 2020

Tem previsão de data para essa nova versão?

@ninrod
Copy link
Member

ninrod commented Jul 28, 2020

Não posso relatar nada oficial quanto a isso, mas posso adiantar que deve sair em breve. Já se encontra em estágio de revisão.

@oximer
Copy link

oximer commented Jul 29, 2020

@ninrod não seria legal já trazer para discutir na comunidade?
Talvez possamos já antecipar eventuais problemas.

@ninrod
Copy link
Member

ninrod commented Jul 29, 2020

@oximer , nesse sentido, será exposta uma versão para consulta aos participantes em que o mercado terá tempo para apontar problemas e enviar feedbacks, como de praxe.

@oximer
Copy link

oximer commented Aug 5, 2020

@ninrod a especificação final do PIX sai no dia 14 de agosto né?
Vamos ter interações sobre o assunto depois da versão final?
Estamos preocupados com o impacto no desenvolvimento para entrega com prazo estipulado pelo BACEN.

@ninrod
Copy link
Member

ninrod commented Aug 5, 2020

Pessoal, eu gostaria de agradecer por vocês terem levantado essa issue. Ela chegou até os mais altos níveis no BCB e foi seriamente discutida. Entendemos a preocupação com o prazo e isso será levado em consideração.

Muito em breve o mercado será informado quanto a providências nesse contexto.

@oximer
Copy link

oximer commented Aug 12, 2020

Depois do relatório final ficamos sem a opção de pagamento por link até sentarmos e pensar em uma maneira de tratar esse bug apresentado. É isso?

Me coloco a disposição para pensarmos uma solução para o problema.

@ninrod
Copy link
Member

ninrod commented Aug 13, 2020

@oximer , exatamente, o Banco central optou por não apresentar essa funcionalidade no momento devido, em parte, aos problemas apresentados na presente issue. Obrigado a todos que contribuiram aqui.

@ninrod ninrod closed this as completed Aug 13, 2020
@objectivecosta
Copy link

objectivecosta commented Aug 14, 2020

Pessoal, li essa discussão a partir de um tweet.

@ninrod Uma alternativa possível seriam file-types, dado que ambos os OSs oferecem seletores de apps para abertura de arquivos de um mimetype específico e mais de um app pode se registrar para fazer isso. Assim, arquivos .pixtransaction ou qualquer extensão que quiserem podem ser utilizados para esse fim.

@miguelslemos
Copy link

miguelslemos commented Aug 14, 2020

@objectivecosta um extensão nova poderia gerar varios problemas, pois não é comum, servidores e-mails poderia considerar esse arquivo como um virus e a visualização desse arquivo no whatsapp também não teria thumbnail.

@objectivecosta
Copy link

@objectivecosta um extensão nova poderia gerar varios problemas, pois não é comum, servidores e-mails poderia considerar como virus e a visualização desse arquivo no whatsapp também não teria thumbnail.

Servidores de e-mail já fazem filtros por URLs, então o mesmo poderia ser dito de URLs. Quanto a thumbnail no WhatsApp, acho que isso é um problema que o WhatsApp deveria/não deveria consertar de acordo com eles...

@miguelslemos
Copy link

Um solução poderia ser o SDK feito pelo bacen onde todos os PSP implementariam e nele teria a listagem de todos bancos e os respectivos schemas para abertura de deeplink. Então seria um tela comum em todos os Apps que apenas faria routing para o App escolhido, outro ponto é que possivel fazer caching das listas de PSP ficando uma experiencia melhor que abrir uma pagina web.

@oximer
Copy link

oximer commented Aug 14, 2020

SDK esbarraria na tecnologia Webapp e na experiência.
Apesar que o modelo anterior já esbarrava.
Acredito que a melhor alternativa seja algo agnóstico que permita que qualquer empresa se plugar na solução.
Nessa aspecto a web se destaca.

A idéia de redirect para url-schemes específicos por banco com caching da opção salva com é uma opção.
Entretanto, a parte de segurança ficaria comprometida, dado que um ataque de DNS poisoning poderia comprometer a percepção de segurança do usuário.

Na live ontem falaram em compartilhar o QRCode como arquivo PDF para ser aberto pelos aplicativos.
Pode funcionar também apesar de onerar a rede e ter uma usabilidade bem pior que link com redirect.
Exige uma maturidade digital maior.

Temos um problema complexo dado a limitação das plataformas.

@renatofrota
Copy link

@rubenskuhl

https://tools.ietf.org/html/rfc8905 tem formas padronizadas de construção de link de pagamento com o método payto. Há inclusive um utilizado no primo indiano do Pix, o UPI.

Também já tínha sido mapeado. O problema é que qualquer aplicativo pode dizer que abre links do tipo payto. Além disso, esse link não é "renderizado" por padrão nos apps.

@ninrod

Está prevista a obrigatoriedade (ou autorizada a disponibilização pelos PSPs) de suporte à leitura de QR Codes a partir de uma imagem salva no dispositivo ou da área de transferência? Assim os usuários poderiam copiar a imagem do QR Code ou mesmo "tirar um print da tela" e depois abrir essa imagem (ou colar a imagem QR) com o app para enviar um Pix (adicionalmente à possibilidade já prevista de copiar a string do QR Code)?

Pensei nisso hoje ao fazer um pagamento de boleto. Copiei a linha digitável e o app do banco reconheceu automaticamente que o conteúdo da área de transferência era uma LD de boleto, sugerindo o pagamento do mesmo.

@ninrod
Copy link
Member

ninrod commented Oct 26, 2020

bom dia @renatofrota ,

Pensei nisso hoje ao fazer um pagamento de boleto. Copiei a linha digitável e o app do banco reconheceu automaticamente que o conteúdo da área de transferência era uma LD de boleto, sugerindo o pagamento do mesmo.

Está prevista sim a obrigatoriedade de implementação, por parte dos PSPs pagadores, da funcionalidade "Pix Copia e Cola". Que seria justamente algo como "a linha digitável". O que é copiado é a string do BR Code.

@renatofrota
Copy link

bom dia @renatofrota ,

Pensei nisso hoje ao fazer um pagamento de boleto. Copiei a linha digitável e o app do banco reconheceu automaticamente que o conteúdo da área de transferência era uma LD de boleto, sugerindo o pagamento do mesmo.

Está prevista sim a obrigatoriedade de implementação, por parte dos PSPs pagadores, da funcionalidade "Pix Copia e Cola". Que seria justamente algo como "a linha digitável". O que é copiado é a string do BR Code.

bom dia, @ninrod

Pois então, na mensagem acima eu citei isso:

adicionalmente à possibilidade já prevista de copiar a string do QR Code

Uma imagem do QR Code, poderia ser lida em formato de arquivo (ou da área de transferência) pela mesma lib que avalia a imagem capturada pela câmera do dispositivo.

É até relativamente simples fazer com que a string do QR Code seja copiada para a área de transferência com um mero clique, em se tratando dos navegadores mobile (só um comandinho JS e pronto).

Mas poder ler diretamente uma imagem em formato de QR Code facilitaria, por exemplo, o pagamento de QR Codes enviados por aplicativos de mensagem ou por e-mail ("mídias" onde a string do QR Code em formato texto vão, muito provavelmente, se quebrar, especialmente quando esta contiver os *** previstos para reserva de campo txid sem conteúdo).

@ninrod ninrod transferred this issue from another repository Oct 26, 2020
@ninrod
Copy link
Member

ninrod commented Oct 26, 2020

Uma imagem do QR Code, poderia ser lida em formato de arquivo (ou da área de transferência) pela mesma lib que avalia a imagem capturada pela câmera do dispositivo.

É até relativamente simples fazer com que a string do QR Code seja copiada para a área de transferência com um mero clique, em se tratando dos navegadores mobile (só um comandinho JS e pronto).

Mas poder ler diretamente uma imagem em formato de QR Code facilitaria, por exemplo, o pagamento de QR Codes enviados por aplicativos de mensagem ou por e-mail ("mídias" onde a string do QR Code em formato texto vão, muito provavelmente, se quebrar, especialmente quando esta contiver os *** previstos para reserva de campo txid sem conteúdo).

@renatofrota , entendo que este fluxo já estaria endereçado agora para o go live; é assim que funcionaria, bastando, é claro, que os aplicativos em questão implementem esta capacidade de "copiar a string do QR para a área de transferência".

Exemplo:

  1. O app de mensagens instantâneas implementa a funcionalidade do "toque e copia string do QR".
  2. O pagador A recebe uma "imagem" de QR Code do usuário Recebedor R via app de mensagens instantâneas.
  3. O pagador A toca no QR e, com isso, a string é copiada para a área de trasnferência.
  4. O pagador A sabe que seu PSP apresentará, em algum lugar, uma funcionalidade para colar essa string.
  5. O pagador A abre seu app de seu PSP preferido e cola a string.

@renatofrota
Copy link

Uma imagem do QR Code, poderia ser lida em formato de arquivo (ou da área de transferência) pela mesma lib que avalia a imagem capturada pela câmera do dispositivo.

É até relativamente simples fazer com que a string do QR Code seja copiada para a área de transferência com um mero clique, em se tratando dos navegadores mobile (só um comandinho JS e pronto).

Mas poder ler diretamente uma imagem em formato de QR Code facilitaria, por exemplo, o pagamento de QR Codes enviados por aplicativos de mensagem ou por e-mail ("mídias" onde a string do QR Code em formato texto vão, muito provavelmente, se quebrar, especialmente quando esta contiver os *** previstos para reserva de campo txid sem conteúdo).

@renatofrota , entendo que este fluxo já estaria endereçado agora para o go live; é assim que funcionaria, bastando, é claro, que os aplicativos em questão implementem esta capacidade de "copiar a string do QR para a área de transferência".

Exemplo:

1. O app de mensagens instantâneas implementa a funcionalidade do "toque e copia string do QR".

2. O pagador `A` recebe uma "imagem" de QR Code do usuário Recebedor `R` via app de mensagens instantâneas.

3. O pagador `A` toca no QR e, com isso, a string é copiada para a área de trasnferência.

4. O pagador `A` sabe que seu PSP apresentará, em algum lugar, uma funcionalidade para colar essa string.

5. O pagador `A` abre seu app de seu PSP preferido e cola a string.

Realmente, faz bastante sentido que os aplicativos passem a oferecer a possibilidade de copiar o conteúdo de um QR. Já demorou muito pra isso acontecer, na verdade.

Obrigado.

@rubenskuhl
Copy link

@rubenskuhl

https://tools.ietf.org/html/rfc8905 tem formas padronizadas de construção de link de pagamento com o método payto. Há inclusive um utilizado no primo indiano do Pix, o UPI.

Também já tínha sido mapeado. O problema é que qualquer aplicativo pode dizer que abre links do tipo payto. Além disso, esse link não é "renderizado" por padrão nos apps.

A questão de linkificação é de Universal Acceptance, problema que foi enfrentado também no programa de novos gTLDs (vide https://uasg.tech/). Como há outros meios de pagamento usando, a tendência é isso se resolver graças a esses outros ao longo do tempo. Mas isso vem depois de que já está sendo usado, se colocar como condicionante, nunca será adotado por plataformas. Por exemplo, se fosse adotado algo como "pix://", ia levar algum tempo até ver isso linkificado... o payto pode ter esse caminho mais curto, mas pela data da RFC ele acabou de ser iniciado.

@ninrod
Copy link
Member

ninrod commented Oct 26, 2020

Mas isso vem depois de que já está sendo usado, se colocar como condicionante, nunca será adotado por plataformas.

Ponto interessante. Novamente, nada impede que o payto ou o pix sejam incorporados no roadmap.

@rubenskuhl
Copy link

Mas isso vem depois de que já está sendo usado, se colocar como condicionante, nunca será adotado por plataformas.

Ponto interessante. Novamente, nada impede que o payto ou o pix sejam incorporados no roadmap.

Dada a RFC, sugiro o payto mesmo, inclusive colocando o pix como meio de pagamento no IANA registry. A RFC tem apenas a lista inicial do IANA registry de meios de pagamento.

@renatofrota
Copy link

bom dia @renatofrota ,

Pensei nisso hoje ao fazer um pagamento de boleto. Copiei a linha digitável e o app do banco reconheceu automaticamente que o conteúdo da área de transferência era uma LD de boleto, sugerindo o pagamento do mesmo.

Está prevista sim a obrigatoriedade de implementação, por parte dos PSPs pagadores, da funcionalidade "Pix Copia e Cola". Que seria justamente algo como "a linha digitável". O que é copiado é a string do BR Code.

bom dia, @ninrod

Pois então, na mensagem acima eu citei isso:

adicionalmente à possibilidade já prevista de copiar a string do QR Code

Uma imagem do QR Code, poderia ser lida em formato de arquivo (ou da área de transferência) pela mesma lib que avalia a imagem capturada pela câmera do dispositivo.

É até relativamente simples fazer com que a string do QR Code seja copiada para a área de transferência com um mero clique, em se tratando dos navegadores mobile (só um comandinho JS e pronto).

Mas poder ler diretamente uma imagem em formato de QR Code facilitaria, por exemplo, o pagamento de QR Codes enviados por aplicativos de mensagem ou por e-mail ("mídias" onde a string do QR Code em formato texto vão, muito provavelmente, se quebrar, especialmente quando esta contiver os *** previstos para reserva de campo txid sem conteúdo).

O Banco Inter tá de olho aqui e implantou minha sugestão de ler imagem salva na galeria e detectar QR Code na imagem.

Por outro lado... foi um dos poucos que não implantou o envio de Pix via chave aleatória (que era um método não exigido pelo manual de UX, mas achei relaxo... é basicamente ctrl+c ctrl+v dos demais métodos de envio via chave, muito mais fácil do que implantar a leitura de imagem da galeria).

@gustavorps
Copy link

https://tools.ietf.org/html/rfc8905 tem formas padronizadas de construção de link de pagamento com o método payto. Há inclusive um utilizado no primo indiano do Pix, o UPI.

O do Pix poderia ser algo payto://pix/chave?amount=BRL:200&TxID=TxID (Estático) ou payto://pix/?link=https://{fdqnPSPRecebedor}/{pixEndpoint}/v2/{pixUrlAcessToken} (Dinâmico)

Hat tip to @rturk.

Gostei muito da sugestão do @rubenskuhl extender um RFC é dos caminhos mais adeguados na minha opnião
Atualmente um padrão de deep link está fazendo muita falta.

Também gosto do padrão HTTP, seguindo dominio do Banco Central https://pix.bcb.gov.br?code=<PIX_CODE>, pode colocar um SPA (index.html) para renderizar o básico das informações em um CDN, praticamente não agrega custo.

@brazilianbytes
Copy link

Url-scheme payto://pix/ seria perfeito. Na minha humilde opinião, seria só o BCB definir o padrão e os apps de banco iriam correr para implementar. se a pessoa tiver mais de um banco, tem de ter o cuidado para não deixar como default. Cópia e Cola em celular alternando aplicativo é nível hard para muitas pessoas.

Estou implementando aqui na minha plataforma de telemedicina, e sempre nossa preocupação é facilitar a interface para pessoas mais velhas/humildes.

Estou acompanhando essa discussão agora.

@rubenskuhl
Copy link

Eu tenho a sensação de que o mercado e o BC estão apostando no ITP (Iniciador de Transação de Pagamento) para reduzir a necessidade do Copia e Cola, e por isso teriam deixado o PixLink no fundo da pilha do backlog... porque o app link seria do aplicativo do ITP (ex: Mercado Livre), e a conexão via OpenBanking garantiria que foi um ITP autorizado que fez um redirecionamento para o site do banco (onde a senha da conta confirma a transação).

Eu gosto mais do payto://pix/, pq é mais Web "raiz"... mas vamos ver no que vai dar o ITP para que o caso de uso possa ser reavaliado.

@renatofrota
Copy link

renatofrota commented Jun 8, 2022 via email

@geekley
Copy link

geekley commented Jul 22, 2022

@ninrod

Adicionalmente, há uma questão de segurança envolvendo app links, falando especificamente de Android. É mais flexível e menos seguro do que Universal Links.

No app links, qualquer app consegue dizer que gerencia um pix link e funciona. Não adianta o BCB estabelecer uma lista restrita em um arquivo https://pix.bcb.gov.br/.well-known/assetlinks.json. Essa questão habilita alguns cenários de fraude que merecem uma discussão mais detida.

Não entendo muito disso (só li essa thread por alto), mas se o problema é qualquer app poder abrir o link e a intenção é permitir só apps autorizados pelo BCB, não seria só quem gerar o link criptografar a informação usando algum tipo de chave pública do BCB, de modo que só os apps permitidos conseguem de alguma forma descriptografar e entender a informação contida no link?

Ex.: payto://pix/encrypted?type=rsa4096&bits=<string em base64>
Só os apps autorizados conseguem descriptografar essa string, por exemplo um JSON:
{"amount": 123.45, "currency": "BRL", "receiver": ... }
Mesmo se um app fraudulento consegue interceptar o link (assim como qualquer outro link payto), não conseguiria tirar nenhum proveito das informações contidas nele.

@felipecn
Copy link
Author

O problema é que não é garantido que o usuário possa escolher o PSP para efetuar o pagamento, seja com app links ou com o payto://

No iOS certamente não pode, e no Android depende de inúmeros fatores (versão do OS, customizações da fabricante etc)

@rubenskuhl
Copy link

@ninrod

Adicionalmente, há uma questão de segurança envolvendo app links, falando especificamente de Android. É mais flexível e menos seguro do que Universal Links.
No app links, qualquer app consegue dizer que gerencia um pix link e funciona. Não adianta o BCB estabelecer uma lista restrita em um arquivo https://pix.bcb.gov.br/.well-known/assetlinks.json. Essa questão habilita alguns cenários de fraude que merecem uma discussão mais detida.

Não entendo muito disso (só li essa thread por alto), mas se o problema é qualquer app poder abrir o link e a intenção é permitir só apps autorizados pelo BCB, não seria só quem gerar o link criptografar a informação usando algum tipo de chave pública do BCB, de modo que só os apps permitidos conseguem de alguma forma descriptografar e entender a informação contida no link?

Ex.: payto://pix/encrypted?type=rsa4096&bits=<string em base64> Só os apps autorizados conseguem descriptografar essa string, por exemplo um JSON: {"amount": 123.45, "currency": "BRL", "receiver": ... } Mesmo se um app fraudulento consegue interceptar o link (assim como qualquer outro link payto), não conseguiria tirar nenhum proveito das informações contidas nele.

Se a questão é integridade e não sigilo, poderia ser usada assinatura ao invés de criptografia. Mas o problema dessa idéia é que tanto os merchants quanto os PSPs precisariam de uma API exposta diretamente pelo Banco Central para geração e consumo dos links payto://pix, o que parece não ser o modelo desejado pelo BACEN.

@geekley
Copy link

geekley commented Jul 22, 2022

Se a questão é integridade e não sigilo, poderia ser usada assinatura ao invés de criptografia. Mas o problema dessa idéia é que tanto os merchants quanto os PSPs precisariam de uma API exposta diretamente pelo Banco Central para geração e consumo dos links payto://pix, o que parece não ser o modelo desejado pelo BACEN.

@rubenskuhl Usando chaves assimétricas, não precisaria de API para geração. Só precisaria saber a chave pública, que não é algo que muda o tempo todo. Ela seria pública mesmo, qualquer um poderia ver na especificação.
No lado do app do banco, aí sim, o app precisaria de uma API se ele não tem acesso a essa chave privada correspondente.

E imaginei que a criptografia é necessária, pois um app fraudulento que interceptasse o link poderia alterar o recebedor e gerar outro link válido, exatamente por a chave ser pública. Mas como disse, não entendo muito disso e não sei se ajudaria muito a dificultar fraudes - talvez só ele interceptar o link já seja um problema de qualquer forma.

@geekley
Copy link

geekley commented Jul 22, 2022

O problema é que não é garantido que o usuário possa escolher o PSP para efetuar o pagamento, seja com app links ou com o payto://
No iOS certamente não pode, e no Android depende de inúmeros fatores (versão do OS, customizações da fabricante etc)

Considerando que Android tem a maior fatia de mercado (~85.35%) no Brasil, que versões novas do Android são bem mais comuns que antigas (além de que nem todo mundo se encaixa no caso de mais de um PSP), será que requerer o "app redirecionador central" apenas nesses casos não seria uma solução aceitável?
Ou seja, tanto os PSPs quanto esse app redirecionador usariam payto://pix ou pix://. Daria pra especificar que quando um PSP responde a esse Pix Link e se encaixa nesses casos onde o usuário não tem a opção de escolher outro app, ele deve mostrar uma opção permitindo a instalação desse app central do BCB. Ex.:

Queria pagar por outro app? Use o app do BACEN para escolher.

O link vai pra store se ele já não estiver instalado; se está (e não for o padrão) redireciona para ele. Se for o padrão (ex. parâmetro no payto link diz que veio por redirecionamento) não precisa mostrar esse texto.

@rubenskuhl
Copy link

Se a questão é integridade e não sigilo, poderia ser usada assinatura ao invés de criptografia. Mas o problema dessa idéia é que tanto os merchants quanto os PSPs precisariam de uma API exposta diretamente pelo Banco Central para geração e consumo dos links payto://pix, o que parece não ser o modelo desejado pelo BACEN.

@rubenskuhl Usando chaves assimétricas, não precisaria de API para geração. Só precisaria saber a chave pública, que não é algo que muda o tempo todo. Ela seria pública mesmo, qualquer um poderia ver na especificação. No lado do app do banco, aí sim, o app precisaria de uma API se ele não tem acesso a essa chave privada correspondente.

E imaginei que a criptografia é necessária, pois um app fraudulento que interceptasse o link poderia alterar o recebedor e gerar outro link válido, exatamente por a chave ser pública. Mas como disse, não entendo muito disso e não sei se ajudaria muito a dificultar fraudes - talvez só ele interceptar o link já seja um problema de qualquer forma.

Mesmo com chave assimétrica, para gerar algo digitalmente assinado precisa da chave privada.
Senão não tem contra o que validar.

E a interceptação do link depende apenas do método (payto: ou pix:) não depende de nada do conteúdo.

@rubenskuhl
Copy link

O problema é que não é garantido que o usuário possa escolher o PSP para efetuar o pagamento, seja com app links ou com o payto://
No iOS certamente não pode, e no Android depende de inúmeros fatores (versão do OS, customizações da fabricante etc)

Considerando que Android tem a maior fatia de mercado (~85.35%) no Brasil, que versões novas do Android são bem mais comuns que antigas (além de que nem todo mundo se encaixa no caso de mais de um PSP), será que requerer o "app redirecionador central" apenas nesses casos não seria uma solução aceitável? Ou seja, tanto os PSPs quanto esse app redirecionador usariam payto://pix ou pix://. Daria pra especificar que quando um PSP responde a esse Pix Link e se encaixa nesses casos onde o usuário não tem a opção de escolher outro app, ele deve mostrar uma opção permitindo a instalação desse app central do BCB. Ex.:

O BACEN já gongou essa idéia de app central dele. Tem tanto no histórico deste issue quanto nas apresentações do Fórum Pix.

@geekley
Copy link

geekley commented Jul 22, 2022

Mesmo com chave assimétrica, para gerar algo digitalmente assinado precisa da chave privada.
Senão não tem contra o que validar.

A intenção não era assinar digitalmente, apenas proteger a info dentro do link de outros apps não reconhecidos pelo BCB. Ao criptografar com a chave pública, apenas a privada pode descriptografar. Apenas os apps PSP reconhecidos poderiam chamar a API do BCB para descriptografar no caso (isso seria só para obter os dados para a transferência, não para realizar, claro).

E a interceptação do link depende apenas do método (payto: ou pix:) não depende de nada do conteúdo.

Sei. Por isso acho que seria mesmo um problema quanto a fraudes.

O BACEN já gongou essa idéia de app central dele. Tem tanto no histórico deste issue quanto nas apresentações do Fórum Pix.

Isso inclui a solução de link https para um domínio oficial do BCB que redireciona? Me parece a solução que faz mais sentido.

@rubenskuhl
Copy link

Mesmo com chave assimétrica, para gerar algo digitalmente assinado precisa da chave privada.
Senão não tem contra o que validar.

A intenção não era assinar digitalmente, apenas proteger a info dentro do link de outros apps não reconhecidos pelo BCB. Ao criptografar com a chave pública, apenas a privada pode descriptografar. Apenas os apps PSP reconhecidos poderiam chamar a API do BCB para descriptografar no caso (isso seria só para obter os dados para a transferência, não para realizar, claro).

https://pt.wikipedia.org/wiki/Criptografia_de_chave_p%C3%BAblica

E a interceptação do link depende apenas do método (payto: ou pix:) não depende de nada do conteúdo.

Sei. Por isso acho que seria mesmo um problema quanto a fraudes.

O que iria mais para o lado de não ter PixLink nenhum, que foi a decisão do BACEN até o momento.

O BACEN já gongou essa idéia de app central dele. Tem tanto no histórico deste issue quanto nas apresentações do Fórum Pix.

Isso inclui a solução de link https para um domínio oficial do BCB que redireciona? Me parece a solução que faz
mais sentido.

Não, essa eu não lembro de já ter sido gongada. Não significa porém que seja bem-vista, apenas que não me recordo de objeção clara. Mas agora imagine o necessário para fazer isso: sabendo o CPF do pagador, o BACEN precisaria fazer pesquisa reversa na base do Registrato para mostrar apenas as instituições onde o pagador tem conta, aleatorizar a ordem e gerar os links para os respectivos apps. Ou então mostrar uma lista de 800 instituições para todo mundo...

@geekley
Copy link

geekley commented Jul 23, 2022

Pois é, no próprio link da Wikipédia faz essa distinção que eu falei; eu me referia ao 1o uso e não ao 2o:

Dois dos usos mais conhecidos de criptografia de chave pública são:

  • Encriptação de chave pública, na qual a mensagem é encriptada com a chave pública do destinatário. A mensagem não pode ser decriptada por ninguém que não possua a chave privada correspondente, o qual é presumidamente o proprietário da chave e a pessoa associada com a chave pública. Isto é utilizado numa tentativa de assegurar confidencialidade.
  • Assinaturas digitais, nas quais a mensagem é assinada com a chave privada do emissor e pode ser verificada por qualquer um que tenha acesso à chave pública do emissor. [...]

Mas, enfim.

BACEN precisaria fazer pesquisa reversa na base do Registrato para mostrar apenas as instituições onde o pagador tem conta, aleatorizar a ordem e gerar os links para os respectivos apps. Ou então mostrar uma lista de 800 instituições para todo mundo...

Sim, eu penso que seria OK carregar todas as 800 instituições, porém mostrar só uma barrinha pesquisável localmente, e, como já foi sugerido acima, salvar apenas em cache local a(s) escolha(s) do usuário. Basicamente tudo feito no frontend mesmo, sem salvar ou processar nada no backend. Daria até pra permitir o usuário reordenar como quisesse.

@rubenskuhl
Copy link

Pois é, no próprio link da Wikipédia faz essa distinção que eu falei; eu me referia ao 1o uso e não ao 2o:

Mas independente de encriptação ou assinatura, pense quem tem a custódia da chave privada e como ela precisaria ser usada, para ver pq isso não dá certo.

BACEN precisaria fazer pesquisa reversa na base do Registrato para mostrar apenas as instituições onde o pagador tem conta, aleatorizar a ordem e gerar os links para os respectivos apps. Ou então mostrar uma lista de 800 instituições para todo mundo...

Sim, eu penso que seria OK carregar todas as 800 instituições, porém mostrar só uma barrinha pesquisável localmente, e, como já foi sugerido acima, salvar apenas em cache local a(s) escolha(s) do usuário. Basicamente tudo feito no frontend mesmo, sem salvar ou processar nada no backend. Daria até pra permitir o usuário reordenar como quisesse.

Aí necessariamente a apresentação precisaria ser em ordem alfabética, o que quebraria um requisito que o BACEN já comentou sobre o processo de não privilegiar um banco em detrimento de outro. Aí o passo seguinte é alguém abrir o AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Banco.

@renatofrota
Copy link

É meio discutível essa questão de que aparecer primeiro numa lista que é alfabética seria um privilégio...

@felipecn
Copy link
Author

Quanto menos esforço o usuário precisa pra escolher uma instituição, maior é a probabilidade dela ser escolhida.

@geekley
Copy link

geekley commented Jul 24, 2022

Aí necessariamente a apresentação precisaria ser em ordem alfabética

Quando eu disse "mostrar uma barrinha pesquisável" eu quis dizer que nenhum resultado apareceria até que o usuário comece a pesquisar. Quando começar a digitar, aí sim lista em uma ordem qualquer, pode até ser alfabética. Já vi várias UX fazendo isso, é normal. Pense "autocompletar tipo o da barra de pesquisa do Google". Se o usuário quiser listar todas (sem digitar nada) em ordem alfabética ou outra ordem qualquer, não tem problema botar um botão pra isso também. Mas não haveria privilégio porque nenhum aparece por padrão, a não ser a lista dos que o user já escolheu anteriormente, salvo em cookie.

pense quem tem a custódia da chave privada e como ela precisaria ser usada, para ver pq isso não dá certo.

Se isso foi gongado, não importa.
Mas pra explicar o que eu queria dizer, seria algum servidor do BCB que decripta. Talvez não ficou claro o fluxo:

  1. Site/app geraria o link payto/pix, encriptando com chave pública do BCB
  2. Ao clicar, nenhum app consegue decifrar a info, pois só o server do BCB tem a chave privada. Um app só consegue saber que é payto e pix (o que como mencionado antes ainda talvez seja um problema, etc, enfim)
  3. Apenas apps de PSP reconhecidos poderiam mandar o link encriptado por uma API do BCB (usando autenticação normal HTTPS, algum token de API, o que for) e ele responde com as informações decriptadas via HTTPS.
  4. App apresenta as informações (igual se user tivesse usado QR ou Copia/Cola) e user altera ou não o que precisar
  5. Usuário confirma a transação, etc

@rubenskuhl
Copy link

Aí necessariamente a apresentação precisaria ser em ordem alfabética

Quando eu disse "mostrar uma barrinha pesquisável" eu quis dizer que nenhum resultado apareceria até que o usuário comece a pesquisar. Quando começar a digitar, aí sim lista em uma ordem qualquer, pode até ser alfabética. Já vi várias UX fazendo isso, é normal. Pense "autocompletar tipo o da barra de pesquisa do Google". Se o usuário quiser listar todas (sem digitar nada) em ordem alfabética ou outra ordem qualquer, não tem problema botar um botão pra isso também. Mas não haveria privilégio porque nenhum aparece por padrão, a não ser a lista dos que o user já escolheu anteriormente, salvo em cookie.

Nesse caso o efeito de ordem alfabética, apesar de existente, é bem menor. Se menor o suficiente para o BACEN, só o BACEN pode dizer... mas já é menos impactante. E tem precedente, o OpenFinance, onde também há uma tela dessas.

Se isso foi gongado, não importa.

O que foi gongado é um API exposta publicamente fora da RSFN. Tem como adaptar sua proposta para rodar dentro da RSFN, e vou citar como abaixo.

Mas pra explicar o que eu queria dizer, seria algum servidor do BCB que decripta. Talvez não ficou claro o fluxo:

  1. Site/app geraria o link payto/pix, encriptando com chave pública do BCB

Ok, chave poderia ficar publicada no site do BACEN. Isso pode ter alguma letargia nos roll-over de chave, mas dá para publicar duas chaves iniciando vigência em anos alternados e ir fazendo phase-out das antigas.

  1. Ao clicar, nenhum app consegue decifrar a info, pois só o server do BCB tem a chave privada. Um app só consegue saber que é payto e pix (o que como mencionado antes ainda talvez seja um problema, etc, enfim)
  2. Apenas apps de PSP reconhecidos poderiam mandar o link encriptado por uma API do BCB (usando autenticação normal HTTPS, algum token de API, o que for) e ele responde com as informações decriptadas via HTTPS.

Uma adaptação aqui seria a consulta ao DICT, que já é feita via RSFN, ser esse mecanismo. O banco envia via RSFN para o BACEN esse blob criptografado e um e2eid, e o BACEN já na mesma tacada decriptografa, faz look-up da chave no DICT e devolve os dados bancários correspondentes e o BRCode(EMV) do pagamento. Então o app do PSP continua falando apenas com o back-end do PSP, e o back-end do PSP falando com o BACEN. E nem precisaria de uma nova interface no arranjo.

  1. App apresenta as informações (igual se user tivesse usado QR ou Copia/Cola) e user altera ou não o que precisar
  2. Usuário confirma a transação, etc

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests