Eu li muitos documentos e códigos que, em teoria, validam um recebimento no aplicativo e / ou pacote.
Dado que meu conhecimento de SSL, certificados, criptografia etc. é quase zero, todas as explicações que li, como essa promissora , foram difíceis de entender.
Eles dizem que as explicações estão incompletas porque todas as pessoas precisam descobrir como fazê-lo, ou os hackers terão um trabalho fácil criando um aplicativo de cracker que pode reconhecer e identificar padrões e corrigir o aplicativo. OK, eu concordo com isso até um certo ponto. Eu acho que eles poderiam explicar completamente como fazê-lo e colocar um aviso dizendo "modificar este método", "modificar este outro método", "ofuscar essa variável", "mudar o nome disso e daquilo", etc.
Alguma alma boa por aí pode ter a gentileza de explicar como validar, agrupar recibos e recibos de compra no aplicativo no iOS 7 quando eu tiver cinco anos (ok, faça 3), de cima para baixo, claramente?
Obrigado!!!
Se você tem uma versão trabalhando em seus aplicativos e tem a preocupação de que os hackers verão como você fez isso, basta alterar seus métodos confidenciais antes de publicar aqui. Ofusque as strings, mude a ordem das linhas, mude a maneira como você faz loops (de usar para para bloquear a enumeração e vice-versa) e coisas assim. Obviamente, toda pessoa que usa o código que pode ser postado aqui deve fazer o mesmo, para não correr o risco de ser facilmente invadida.
Respostas:
Aqui está uma explicação de como eu resolvi isso na minha biblioteca de compras no aplicativo RMStore . Vou explicar como verificar uma transação, que inclui a verificação de todo o recebimento.
Num relance
Obtenha o recibo e verifique a transação. Se falhar, atualize o recibo e tente novamente. Isso torna o processo de verificação assíncrono, pois a atualização do recebimento é assíncrona.
No RMStoreAppReceiptVerifier :
Obtendo os dados do recebimento
O recibo está dentro
[[NSBundle mainBundle] appStoreReceiptURL]
e é realmente um contêiner PCKS7. Eu sou péssima em criptografia, então usei o OpenSSL para abrir este contêiner. Outros aparentemente fizeram isso puramente com estruturas de sistema .Adicionar o OpenSSL ao seu projeto não é trivial. O wiki do RMStore deve ajudar.
Se você optar por usar o OpenSSL para abrir o contêiner PKCS7, seu código poderá ser assim. De RMAppReceipt :
Entraremos em detalhes da verificação posteriormente.
Obtendo os campos de recebimento
O recibo é expresso no formato ASN1. Ele contém informações gerais, alguns campos para fins de verificação (veremos mais adiante) e informações específicas de cada compra no aplicativo aplicável.
Novamente, o OpenSSL vem em socorro quando se trata de ler o ASN1. No RMAppReceipt , usando alguns métodos auxiliares:
Obtendo as compras no aplicativo
Cada compra no aplicativo também está no ASN1. Analisá-lo é muito semelhante ao analisar as informações gerais de recebimento.
No RMAppReceipt , usando os mesmos métodos auxiliares:
Observe que determinadas compras no aplicativo, como consumíveis e assinaturas não renováveis, aparecerão apenas uma vez no recibo. Você deve verificá-las logo após a compra (novamente, o RMStore ajuda você com isso).
Verificação de relance
Agora temos todos os campos do recibo e todas as suas compras no aplicativo. Primeiro, verificamos o recibo em si e, em seguida, simplesmente verificamos se o recibo contém o produto da transação.
Abaixo está o método que chamamos de volta no começo. No RMStoreAppReceiptVerificator :
Verificando o recibo
A verificação do recibo em si se resume a:
As 5 etapas do código em alto nível, no RMStoreAppReceiptVerificator :
Vamos detalhar as etapas 2 e 5.
Verificando a assinatura do recibo
Quando extraímos os dados, examinamos a verificação da assinatura do recibo. O recibo é assinado com o certificado raiz da Apple Inc., que pode ser baixado na autoridade de certificação raiz da Apple . O código a seguir usa o contêiner PKCS7 e o certificado raiz como dados e verifica se eles correspondem:
Isso foi feito no início, antes da análise do recebimento.
Verificando o hash de recebimento
O hash incluído no recebimento é um SHA1 do ID do dispositivo, algum valor opaco incluído no recebimento e o ID do pacote.
É assim que você verificaria o hash de recebimento no iOS. De RMAppReceipt :
E essa é a essência disso. Talvez esteja faltando alguma coisa aqui ou ali, para poder voltar a este post mais tarde. De qualquer forma, recomendo procurar o código completo para obter mais detalhes.
fonte
Estou surpreso que ninguém tenha mencionado Receigen aqui. É uma ferramenta que gera automaticamente código de validação de recibo ofuscado, um diferente a cada vez; suporta operação de GUI e de linha de comando. Altamente recomendado.
(Não afiliado ao Receigen, apenas um usuário satisfeito.)
Eu uso um Rakefile como este para executar novamente o Receigen automaticamente (porque ele precisa ser feito em todas as alterações de versão) quando digito
rake receigen
:fonte
Esta é uma versão do Swift 4 para validação de recibo de compra no aplicativo ...
Vamos criar uma enumeração para representar os possíveis erros da validação de recebimento
Em seguida, vamos criar a função que valida o recebimento; ele gera um erro se não puder validá-lo.
Vamos usar esta função auxiliar para obter a data de validade de um produto específico. A função recebe uma resposta JSON e um ID do produto. A resposta JSON pode conter várias informações de recibos para diferentes produtos, para obter as últimas informações para o parâmetro especificado.
Agora você pode chamar essa função e manipular os possíveis casos de erro
Account tab
Do Sign in
Open iTune Connect
Open My App
Open Feature Tab
Open In App Purchase
Click at the right side on 'View Shared Secret'
At the bottom you will get a secrete key
Espero que isso ajude a todos que desejam isso na versão rápida.
fonte