Подтвердить что ты не робот

Ошибка PayPal 580001 HTTP-запрос от iOS

У некоторых трудностей с внедрением адаптивных платежей в iOS и, к сожалению, на веб-сайте или в ответ на PayPal очень мало документов. Это код:

- (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];
}

Здесь ответ:

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";
    };
}
4b9b3361

Ответ 1

Наконец-то он заработал. Заголовки верны, входные данные имеют некоторые проблемы. Это правильная версия кода:

- (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];
}

Эта строка является необязательной:   [PaymentManager readPaymentCode], @ "preapprovalKey", Его использование зависит от того, хотите ли вы использовать предварительное одобрение или нет. Это подробно объясняет использование предварительного одобрения: https://developer.paypal.com/webapps/developer/docs/classic/adaptive-payments/ht_ap-basicPreapproval-curl-etc/. Замените введенные значения в приведенном выше коде, и вы получите ключ предварительной проверки.

Ответ 2

проверьте пожалуйста:

некоторые из них связаны с кодировкой, устанавливаются как JSON, но фактически отправляются как URL -encoded и т.д., другие имеют отношение к используемому формату валюты и валюты (например, отправленные значения не должны включать знак валюты и т.д. )

Ответ 3

Рабочий код. Пожалуйста, проверьте.

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];