Ответ 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/. Замените введенные значения в приведенном выше коде, и вы получите ключ предварительной проверки.