2016-09-24 1 views
0

Je suis en train d'utiliser l'achat in-app dans mon application ... maintenant je veux valider le reçu, et pour valider la signature de réception, j'utilise le code ci-dessous dans l'AppDelegate (afin de savoir si l'utilisateur a déjà acheté ce lors du lancement de l'App)Xcode Validation Reçu Signature Erreur

en fait le code provient de la WWDC 2013 - Session 308 ;-)

NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL]; 
NSData *receiptData = [NSData dataWithContentsOfURL:receiptURL]; 
NSData *certificateData = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"AppleIncRootCertificate" withExtension:@"cer"]]; 

/* The PKCS #7 container (the receipt) and The Apple root certificate. */ 
BIO *b_receipt = BIO_new_mem_buf((void *) [receiptData bytes], (int)[receiptData length]); 
BIO *b_x509 = BIO_new_mem_buf((void *)[certificateData bytes], (int)[certificateData length]); 

// Convert receipt data to PKCS #7 Representation 
PKCS7 *p7 = d2i_PKCS7_bio(b_receipt, NULL); 

/* Create the root certificate */ 
X509_STORE *store = X509_STORE_new(); 
X509 *appleRootCA = d2i_X509_bio(b_x509, NULL); 
X509_STORE_add_cert(store, appleRootCA); 

/* Verify the signature. If the verification is correct, b_receiptPayload will contain the PKCS #7 payload and result will be 1. */ 
BIO *b_receiptPayload = BIO_new(BIO_s_mem()); 
int result = PKCS7_verify(p7, NULL, store, NULL, b_receiptPayload, 0); 
if (result == 1) 
{ 
    NSLog(@"Receipt Signature is valid"); 
} else { 
    unsigned long error = ERR_get_error(); 
    const char* error_str = ERR_error_string(error, NULL); 
    NSLog(@"OpenSSL Error: %s",error_str); 
} 

mais je reçois toujours l'erreur OpenSSL suivante: erreur: 2006F079 : lib (32): func (111): raison (121)

Je déjà googl e mais sans résultat ... une suggestion?

Une autre façon de valider la signature de reçu?

vous remercie à l'avance de votre collaboration ...

+0

J'utilise cette bibliothèque - https://github.com/robotmedia/RMStore. Voici comment utiliser la vérification des reçus https://github.com/robotmedia/RMStore/wiki/Receipt-verification – Traveler

+0

merci, je vais vérifier ... – jankoesp

Répondre

0

SOLVED

deux choses:

1) J'oublié d'ajouter le "AppleIncRootCertificate.cer" au groupe de ressources de mon application , c'est, à mon projet et évidemment c'est obligatoire.

2) La ligne de code ci-dessous est nécessaire aussi:

OpenSSL_add_all_digests(); 

(ou OpenSSL_add_all_algorithms(), maintenant à la place)

et il doit être placé avant

int result = PKCS7_verify(p7, NULL, store, NULL, b_receiptPayload, 0); 

est travailler ...

PS: en passant, c'est une bonne idée d'utiliser cette ligne de code ci-dessous dans le terme inal (afin de savoir à quoi l'erreur fait référence):

openssl errstr "errornumber" (i.e.openssl errstr 2006F079)