2015-07-14 4 views
12

Avere qualche difficoltà nell'implementare i pagamenti adattivi in ​​iOS e purtroppo c'è poca documentazione sul sito web o sulla risposta di PayPal. Questo è il codice:Errore PayPal 580001 Richiesta HTTP da iOS

- (void)makePaymentSandbox{ 

    NSError *error; 

    //NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
    //NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil]; 

    NSURL *url = [NSURL URLWithString:@"https://svcs.sandbox.paypal.com/AdaptivePayments/Pay"]; 

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url 
                  cachePolicy:NSURLRequestUseProtocolCachePolicy 
                 timeoutInterval:30.0]; 

    //setting 
    [request setHTTPMethod:@"POST"]; 

    //headers 
    [request addValue:@"alex-facilitator_api1.fastwebnet.it" forHTTPHeaderField:@"X-PAYPAL-SECURITY-USERID"]; 
    [request addValue:@"FW79EZXASW69NE8X" forHTTPHeaderField:@"X-PAYPAL-SECURITY-PASSWORD"]; 
    [request addValue:@"ABZua9nnv9oieyN4MwVt15YdgetaJHcyzqOHjkLbuM-bGRoI7WRS" forHTTPHeaderField:@"X-PAYPAL-SECURITY-SIGNATURE"]; 
    //NV 
    [request addValue:@"JSON" forHTTPHeaderField:@"X-PAYPAL-REQUEST-DATA-FORMAT"]; 
    [request addValue:@"JSON" forHTTPHeaderField:@"X-PAYPAL-RESPONSE-DATA-FORMAT"]; 

    [request addValue:@"APP-80W288712P519543T" forHTTPHeaderField:@"X-PAYPAL-APPLICATION-ID"]; 

    [request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
    [request addValue:@"en_US" forHTTPHeaderField:@"Accept-Language"]; 


    //data 

    /*NSString *userUpdate =[NSString stringWithFormat:@"clientDetails.applicationId=%@&actionType=%@",@"APP-80W284485P519543T", @"PAY",nil]; 
    NSData *data1 = [userUpdate dataUsingEncoding:NSUTF8StringEncoding]; 
    [request setHTTPBody:data1]; 
    [request setValue: [NSString stringWithFormat:@"%lu", (unsigned long)[data1 length]] forHTTPHeaderField:@"Content-Length"];*/ 


    NSDictionary *mapData = [[NSDictionary alloc] initWithObjectsAndKeys: 

          @"PAY", @"actionType", 

          @"USD", @"currencyCode", 

          @"http:\\www.cleverlyapp.com", @"cancelUrl", 
          @"http:\\www.cleverlyapp.com", @"returnUrl", 


          @"ReturnAll", @"requestEnvelope.detailLevel", 
          @"en_US", @"requestEnvelope.errorLanguage", 


          @"[email protected]", @"senderEmail", 

          @"0.1", @"receiverList.receiver(0).amount", 
          @"[email protected]", @"receiverList.receiver(0).email", 

          @"0.1", @"receiverList.receiver(1).amount", 
          @"[email protected]", @"receiverList.receiver(1).email", 


          @"APP-80W284485P519543T", @"clientDetails.applicationId", 


          nil]; 
    NSData *postData = [NSJSONSerialization dataWithJSONObject:mapData options:0 error:&error]; 
    [request setHTTPBody:postData]; 


    [NSURLConnection connectionWithRequest:request delegate:self]; 
} 

Ecco la risposta:

String: { 
    error =  (
       { 
      category = Application; 
      domain = PLATFORM; 
      errorId = 580001; 
      message = "Invalid request: {0}"; 
      severity = Error; 
      subdomain = Application; 
     } 
    ); 
    responseEnvelope =  { 
     ack = Failure; 
     build = 17325060; 
     correlationId = e82ede718b929; 
     timestamp = "2015-07-14T09:50:06.222-07:00"; 
    }; 
} 
+0

eseguire una delle risposte da http://stackoverflow.com/questions/15854931/paypal-implicit-payment-error-580001 aiutarli fuori? –

+0

Se avessi visto quella pagina, non ha aiutato – Alessandro

+0

Aggiungendo il mittenteEmail, lo chiami come Pagamento implicito. Questo è permesso solo se quel mittente è il chiamante API. L'indirizzo email che hai ([email protected]) dovrebbe essere aggiunto all'account PayPal allegato alle credenziali API del chiamante API. Se questo non è il caso, si otterrebbe un errore. Non sono sicuro se sarebbe l'errore che stai ricevendo. –

risposta

1

Finalmente ha funzionato. Le intestazioni sono corrette, i dati di input hanno avuto alcuni problemi. Questa è la versione corretta del codice:

- (void)makePaymentSandboxWithPreapprovalToEmail:(NSString *)toEmail withCurrency:(NSString *)currency andAmount:(NSString *)moneyAmount completition:(void (^)(BOOL, NSString *))block{ 

    NSError *error; 

    NSURL *url = [NSURL URLWithString:@"https://svcs.sandbox.paypal.com/AdaptivePayments/Pay"]; 

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url 
                  cachePolicy:NSURLRequestUseProtocolCachePolicy 
                 timeoutInterval:30.0]; 

    //setting 
    [request setHTTPMethod:@"POST"]; 

    //headers 
    [request addValue:@"alex.rietmann-facilitator_api1.fastwebnet.it" forHTTPHeaderField:@"X-PAYPAL-SECURITY-USERID"]; 
    [request addValue:@"FW7ADTYZFP68XE0X" forHTTPHeaderField:@"X-PAYPAL-SECURITY-PASSWORD"]; 
    [request addValue:@"ABSua9nnv9nnkoN4MwVt15YdgetaJHcyzqOHjkLbuM-bGRoI7JRS" forHTTPHeaderField:@"X-PAYPAL-SECURITY-SIGNATURE"]; 
    //NV 
    [request addValue:@"JSON" forHTTPHeaderField:@"X-PAYPAL-REQUEST-DATA-FORMAT"]; 
    [request addValue:@"JSON" forHTTPHeaderField:@"X-PAYPAL-RESPONSE-DATA-FORMAT"]; 

    [request addValue:@"APP-80W284485P519543T" forHTTPHeaderField:@"X-PAYPAL-APPLICATION-ID"]; 

    [request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
    [request addValue:@"en_US" forHTTPHeaderField:@"Accept-Language"]; 

    //other email 
    NSDictionary *receiver0 = [[NSDictionary alloc] initWithObjectsAndKeys: toEmail, @"email", moneyAmount, @"amount", @"true", @"primary", nil]; 

    //my account 
    NSDictionary *receiver1 = [[NSDictionary alloc] initWithObjectsAndKeys: @"[email protected]", @"email", @"2", @"amount", nil]; 

    NSDictionary *options0 = [[NSDictionary alloc] initWithObjectsAndKeys: [NSArray arrayWithObjects:receiver0, receiver1, nil], @"receiver", nil]; 

    NSDictionary *mapData = [[NSDictionary alloc] initWithObjectsAndKeys: 

          @"PAY", @"actionType", 

          @"EACHRECEIVER", @"feesPayer", 

          @"true", @"reverseAllParallelPaymentsOnError", 

          currency, @"currencyCode", 

          [PaymentManager readPaymentCode], @"preapprovalKey", 

          [PaymentManager readPaymentEmail], @"senderEmail", 

          @"http:\\www.apple.com", @"cancelUrl", 
          @"http:\\www.google.com", @"returnUrl", 

          [[NSDictionary alloc] initWithObjectsAndKeys:@"en_US", @"errorLanguage", @"detailLevel", @"ReturnAll", nil], @"requestEnvelope", 

          //[[NSDictionary alloc] initWithObjectsAndKeys: options0, @"0", nil], @"receiverList", 
          options0, @"receiverList", 

          [[NSDictionary alloc] initWithObjectsAndKeys:@"APP-80W284485P519543T", @"applicationId", [self getIPAddress], @"ipAddress", nil], @"clientDetails", 
          //@"APP-80W284485P519543T", @"clientDetails.applicationId", 
          //[self getIPAddress], @"clientDetails.ipAddress", 


          nil]; 
    NSData *postData = [NSJSONSerialization dataWithJSONObject:mapData options:0 error:&error]; 
    [request setHTTPBody:postData]; 


    MyConnection * connection = [[MyConnection alloc]initWithRequest:request]; 
    [connection setCompletitionBlock:^(id obj, NSError *err) { 

     if (!err) { 
      NSError *error = nil; 
      NSDictionary* revDicn =[NSDictionary dictionary]; 
      revDicn = [NSJSONSerialization JSONObjectWithData:obj options:NSJSONReadingMutableContainers error:&error]; 
      NSLog(@"Response: %@", revDicn); 

     if ([[revDicn objectForKey:@"paymentExecStatus"] isEqualToString:@"COMPLETED"]) { 
      block(YES, [revDicn objectForKey:@"payKey"]); 
     }else{ 
      block(NO, @""); 
     } 

     } else { 
      //There was an error 
      block(NO, @""); 
     } 
    }]; 
    [connection start]; 
} 

Questa linea è facoltativo: [PaymentManager readPaymentCode], @ "preapprovalKey", L'uso di esso dipende dal fatto che si desidera utilizzare pre-approvazione o meno. Questo spiega in dettaglio l'uso della pre-approvazione: https://developer.paypal.com/webapps/developer/docs/classic/adaptive-payments/ht_ap-basicPreapproval-curl-etc/. Sostituisci i valori di input nel codice qui sopra e otterrai la chiave di pre-approvazione.

+0

la mia risposta ha aiutato? qual era esattamente il problema? –

+1

@NikosM. la tua risposta ha link utili ma in realtà l'ho immaginata prima che tu scrivessi ... Il problema era la confezione dei dati di input che erano stati fatti sotto forma di [dizionario, @ "chiave"] come [[NSDictionary alloc] initWithObjectsAndKeys: @ "en_US", @ "errorLanguage", nil], @ "requestEnvelope", – Alessandro

0

Codice di lavoro. Si prega di controllare.

int amount = 195; 
// int x = 146; 


NSDictionary *parameters; 
parameters = @{ 
       @"actionType"   : @"PAY", 
       @"currencyCode"  : @"USD", 
       @"receiverList"  : @{@"receiver" : @[@{@"amount": [NSNumber numberWithInt:amount],@"email":@"[email protected]"}]}, 
       @"returnUrl"   : @"https://example.com/return", 
       @"cancelUrl"  : @"https://example.com/cancel", 
       @"requestEnvelope" : @{@"errorLanguage":@"en_US", @"detailLevel":@"ReturnAll"} 
       }; 




NSError *error; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:parameters 
                options:NSJSONWritingPrettyPrinted // Pass 0 if you don't care about the readability of the generated string 
                error:&error]; 



NSURL *url = [NSURL URLWithString:@"https://svcs.sandbox.paypal.com/AdaptivePayments/Pay"]; 

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url 
                 cachePolicy:NSURLRequestUseProtocolCachePolicy 
                timeoutInterval:30.0]; 


[request setHTTPMethod:@"POST"]; 

//headers 
[request addValue:@"testios1_api1.grr.la" forHTTPHeaderField:@"X-PAYPAL-SECURITY-USERID"]; 
[request addValue:@"TP3DRR4WLYAJ5HWR" forHTTPHeaderField:@"X-PAYPAL-SECURITY-PASSWORD"]; 
[request addValue:@"AKiJVI-zRf1GGbfcTE2iPRb31l2ZAdq7HY4WrG6uxNAhc79Vtg7myGk3" forHTTPHeaderField:@"X-PAYPAL-SECURITY-SIGNATURE"]; 
//NV 
[request addValue:@"JSON" forHTTPHeaderField:@"X-PAYPAL-REQUEST-DATA-FORMAT"]; 
[request addValue:@"JSON" forHTTPHeaderField:@"X-PAYPAL-RESPONSE-DATA-FORMAT"]; 

[request addValue:@"APP-80W284485P519543T" forHTTPHeaderField:@"X-PAYPAL-APPLICATION-ID"]; 

[request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
[request addValue:@"en_US" forHTTPHeaderField:@"Accept-Language"]; 


[request setHTTPBody:jsonData]; 

NSURLSession *session = [NSURLSession sharedSession]; 
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request 
              completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) 
            { 
             // do something with the data 
             NSDictionary* revDicn =[NSDictionary dictionary]; 
             revDicn = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error]; 
             NSLog(@"Response: %@", revDicn); 

            }]; 
[dataTask resume];