10
votes

Abonnement automatiquement Renewing: App-Store complète la transaction malgré la finitionTransaction non appelée

Je simule des achats d'un abonnement automobile renouvelable dans mon application sur un iPhone. Mon problème est que l'achat est considéré comme étant fait par l'App Store lorsqu'il n'est pas.

Voici ce qui se passe: p>

  1. L'utilisateur appuie sur un bouton pour acheter l'abonnement renouvelable li>
  2. L'utilisateur donne son mot de passe iTunes et confirme l'achat LI>
  3. L'application soumet le reçu reçu de l'App Store sur mon serveur pour vérifier la validité LI>
  4. Le serveur renvoie une chaîne "OK" ou "PAS OK". L'application appelle la finitionTransaction uniquement sur "OK" LI> OL>

    J'ai un problème lorsqu'il y a une défaillance réseau à l'étape 3. Je ne peux pas valider le reçu. Mais si l'utilisateur tente d'acheter une seconde fois, l'App Store lui dit qu'il s'est déjà abonné, même si je n'avais pas appelé la méthode code> méthode de Turntransaction Code> pour terminer l'achat! P>

    Est-ce un comportement attendu? L'App-Store ne devrait-il pas traiter les transactions non finies comme non finies, ou est-ce que je manque quelque chose? J'accueillerais toute suggestion pour résoudre ce problème. P>

    -(void) userPurchase:(SKProduct*) product{
        SKPayment *payment = [SKPayment paymentWithProduct:product];
        [[SKPaymentQueue defaultQueue] addPayment:payment];
    }
    
    -(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
        NSLog(@"paymentQueue updatedTransaction");
        for (SKPaymentTransaction * transaction in transactions) {
            switch (transaction.transactionState) {
                case SKPaymentTransactionStatePurchasing:
                    break;
                case SKPaymentTransactionStatePurchased:
                    [self recordSubscription:transaction];
                    break;
                case SKPaymentTransactionStateFailed:
                    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                    break;
                case SKPaymentTransactionStateRestored:
                    [self recordSubscription:transaction];
                    break;
                default: NSLog(@"Default");
                    break;
            }
        };
    }
    
    
    -(void) recordSubscription:(SKPaymentTransaction*)transaction{
        NSString *jsonObjectString = [self encode:(uint8_t *)transaction.transactionReceipt.bytes length:transaction.transactionReceipt.length];
        NSMutableDictionary *params = [[NSMutableDictionary alloc] initWithObjectsAndKeys:jsonObjectString,@"receiptdata", nil];
        [[AFNetworkSubClass sharedClient] postPath:@"myserver" params:params 
        success:^(AFHTTPRequestOperation *operation, id output) {
            /* some code */
            if([valstring isEqualToString:@"ok"]){
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
            }
        }
        }failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                NSLog(@"validation failed");
        }
    


0 commentaires

5 Réponses :


-1
votes

Juste une tête si votre application ne correspond pas à l'instruction suivante, vous ne pourrez pas utiliser les abonnements automatiques de renouvellement automatique. Voici des directives de révision de l'application;

11.15 Les applications ne peuvent utiliser que des abonnements automatiques de renouvellement automatique pour les périodiques (journaux, magazines), les applications commerciales (entreprise, productivité, Création professionnelle, stockage en nuage) et applications multimédia (vidéo, audio, la voix), ou l'application sera rejetée

Si votre application s'intègre dans ce support, alors ce que vous pouviez configurer votre application afin qu'il se considère pour être temporairement "souscrit" et il faut essayer d'authentifier avec le serveur (notifier à l'utilisateur si elle a été trop longue depuis Il a été connecté à Internet).


2 commentaires

Qu'est-ce qui vient sous l'entreprise, la productivité?


Les entreprises sont généralement des applications B2B (Business 2 Business) où une abonnement ou une licence (via abonnement) peut être utilisée. Entreprise peut également être sur des applications internes, mais à moins d'une obligation d'activité pour qu'un abonnement soit dans une application interne, vous ne l'utiliseriez pas. La productivité serait quelque chose comme Evernote, Dropbox, etc. Celles-ci ne rentrent pas dans la définition d'entreprise car elles sont disponibles pour la population en général et ne sont pas exclusives aux entreprises



0
votes

Je pense avant que vous n'appeliez la méthode Recordscription, vous pouvez appeler la méthode Terminer FinitionTransaction pour supprimer le paiement de la file d'attente de paiement, car vous avez terminé l'action d'achat avec Apple Server.

Si l'échec du réseau vous permet de valider le reçu de l'application, enregistrez simplement le reçu et validez à nouveau le reçu sur votre propre serveur ou validez lorsque le réseau est accessible une autre fois.

J'espère que cela peut vous aider.


0 commentaires

0
votes

Les utilisateurs ne peuvent pas acheter le même abonnement avant son expiration. Dans votre cas, la transaction d'achat a été terminée, mais vous n'avez pas fourni le service en raison de la défaillance du réseau. J'avais un problème similaire. Vous devrez peut-être demander aux utilisateurs de restaurer toutes les transactions remplies.

ALORS COMPLÈTEÉTRANSACTION La fonction sera appelée. Bonne chance!


0 commentaires

-1
votes

J'avais des problèmes comme celui-ci avec les achats de l'App Store et le centre de jeu. Et je sais que cela va sembler comme une non réponse, mais cela a fonctionné pour moi.

J'ai supprimé l'application et toutes ses données de mon périphérique, redémarré xcode et nettoyé le projet. Tourné l'appareil et configurez un nouveau déploiement. Et l'application a commencé à recevoir la réponse correcte de l'App Store. Je ne sais pas si c'était parce que quelque chose a été mis en cache sur l'appareil ou si l'App Store ait juste besoin de plus de temps pour travailler correctement, mais les choses sont tombées en place après cela.

Bien que je n'ai jamais travaillé avec des achats basés sur l'abonnement, rien dans votre code ne se distingue comme incorrect autant que je puisse dire.

bonne chance.


0 commentaires

0
votes

Si vous n'avez pas appelé TerminerTransaction qui ne signifiait pas que la transaction n'a pas pris de l'argent de l'utilisateur. Tout cet appel fait, c'est empêcher le magasin de notifier votre application sur la transaction chaque lancement. C'est juste un moyen pour vous de dire à STOPKIT que vous avez terminé avec la transaction, c'est-à-dire déverrouillé le contenu des utilisateurs et enregistré cela à votre backend, etc.

Donc, même avec une erreur de réseau, vous devez réessayer votre appel d'API. Si vous fermez l'application et que vous souhaitez obtenir une mise à jour de transaction pour indiquer qu'il a été «acheté» vous permettant de soumettre à nouveau à votre serveur :)

C'est le comportement attendu, sinon vous seriez des utilisateurs de facturation double / triple.


0 commentaires