2016-04-04 11 views
2

Ich versuche, eine Zahlung programmgesteuert über PayPal zu senden, aber es funktioniert nicht. Bitte beraten, danke.Programmatisch senden Sie PayPal Zahlung Ziel C

Mein Code ist unten und darunter ist PayPal cURL Beispiel.

-(void)createPayment { 
    NSString *shortDescription = @"test description"; 
    NSDecimalNumber *paymentDecimal = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%.02f", [Global sharedInstance].currentOrder.itemPrice]]; 
    NSString *sku = [NSString stringWithFormat:@"DBAR-%i", [Global sharedInstance].currentOrder.orderNumber]; 

    NSString *name = [NSString stringWithFormat:@"%@", [Global sharedInstance].currentOrder.boozeBrand]; 
    PayPalItem *item = [PayPalItem itemWithName:name withQuantity:[Global sharedInstance].currentOrder.itemQuantity withPrice:paymentDecimal withCurrency:@"USD" withSku:sku]; 
    float priceFloat = [item.price floatValue]; 
    float totalFloat = priceFloat * item.quantity; 
    NSDecimalNumber *total = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%.02f", totalFloat]]; 

    PayPalPayment *payment = [[PayPalPayment alloc] init]; 
    payment.amount = total; 
    payment.currencyCode = @"USD"; 
    payment.shortDescription = shortDescription; 
    payment.items = nil; 
    payment.paymentDetails = nil; 

    if (!payment.processable) {NSLog(@"Payment not processable.");} 

    NSString *token = [Global sharedInstance].accessToken; 
    NSString *bearerToken = [NSString stringWithFormat:@"Bearer %@", token]; 

    NSDictionary *redirectDict = @{@"return_url":@"http://www.testurl.com", 
            @"cancel_url":@"http://www.testurl.com"}; 
    NSDictionary *payerDict = @{@"payment_method":@"paypal"}; 

    NSMutableDictionary *amountMutableDict = [[NSMutableDictionary alloc] init]; 
    [amountMutableDict setObject:total forKey:@"total"]; 
    [amountMutableDict setObject:@"USD" forKey:@"currency"]; 
    NSDictionary *amountDict = [NSDictionary dictionaryWithDictionary:amountMutableDict]; 

    NSMutableDictionary *transactionsMutableDict = [[NSMutableDictionary alloc] init]; 
    [transactionsMutableDict setObject:amountDict forKey:@"amount"]; 
    [transactionsMutableDict setObject:shortDescription forKey:@"description"]; 
    NSDictionary *transactionsDict = [NSDictionary dictionaryWithDictionary:transactionsMutableDict]; 

    NSMutableArray *transactionsMutableArray = [[NSMutableArray alloc] init]; 
    [transactionsMutableArray addObject:transactionsDict]; 
    NSArray *transactionsArray = [NSArray arrayWithArray:transactionsMutableArray]; 

    NSMutableDictionary *dataMutableDict = [[NSMutableDictionary alloc] init]; 
    [dataMutableDict setObject:@"sale" forKey:@"intent"]; 
    [dataMutableDict setObject:redirectDict forKey:@"redirect_urls"]; 
    [dataMutableDict setObject:payerDict forKey:@"payer"]; 
    [dataMutableDict setObject:transactionsArray forKey:@"transactions"]; 
    NSDictionary *dataDict = [NSDictionary dictionaryWithDictionary:dataMutableDict]; 

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    [request setURL:[NSURL URLWithString:@"https://api.sandbox.paypal.com/v1/payments/payment"]]; 
    [request setHTTPMethod:@"POST"]; 
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
    [request setValue:bearerToken forHTTPHeaderField:@"Authorization"]; 

    NSString *post = [NSString stringWithFormat:@"intent=sale&redirect_urls=%@&payer=%@", redirectDict, payerDict]; 
    NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
    NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long [postData length]]; 
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
    [request setHTTPBody:postData]; 

    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
    NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration]; 
    NSURLSessionUploadTask *task = [session uploadTaskWithRequest:request fromData:postData completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
     if (!error) { 
      NSLog(@"\nPurchase Response:\n\n%@", response.description); 
     } else { 
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Authorization Failed" message:@"Your payment did not go through." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]; 
      [alert show]; 
     } 
    }];  

    [task resume]; 

} 

PayPal cURL Beispiel von ihrer docs:

curl https://api.sandbox.paypal.com/v1/payments/payment \ 
    -v \ 
    -H 'Content-Type: application/json' \ 
    -H 'Authorization: Bearer accessToken' \ 
    -d '{ 
    "intent":"sale", 
    "redirect_urls":{ 
     "return_url":"http://return_URL_here", 
     "cancel_url":"http://cancel_URL_here" 
    }, 
    "payer":{ 
     "payment_method":"paypal" 
    }, 
    "transactions":[ 
     { 
     "amount":{ 
      "total":"7.47", 
      "currency":"USD" 
     }, 
     "description":"This is the payment transaction description." 
     } 
    ] 
    }' 

Hier ist meine Antwort von PayPal über meine oben NSLog-Anweisung:

Kaufaktion:

<NSHTTPURLResponse: 0x1512732d0> { URL: https://api.sandbox.paypal.com/v1/payments/payment } { status code: 400, headers { 
    "CORRELATION-ID" = c0b729159d0c7; 
    Connection = "close, close"; 
    "Content-Language" = "en_US"; 
    "Content-Length" = 200; 
    "Content-Type" = "application/json"; 
    Date = "Mon, 04 Apr 2016 19:48:20 GMT"; 
    "PROXY_SERVER_INFO" = "host=slcsbplatformapiserv3001.slc.paypal.com;threadId=675"; 
    "Paypal-Debug-Id" = "c0b729159d0c7, c0b729159d0c7"; 
    Server = Apache; 
    "Set-Cookie" = "X-PP-SILOVER=name%3DSANDBOX3.API.1%26silo_version%3D1880%26app%3Dplatformapiserv%26TIME%3D80020055; domain=.paypal.com; path=/; Secure; HttpOnly, X-PP-SILOVER=; Expires=Thu, 01 Jan 1970 00:00:01 GMT"; 
    Vary = Authorization; 
} } 

bitte jemand sagen ich, warum die Zahlung nicht durchgeht. Ich erhalte keinen Fehler (oder die Antwort wird nicht gedruckt). Ich weiß, dass der Token gut ist, da ich mich jedes Mal bei PayPal anmelden muss, wenn ich die App verwende, und ich kann es nicht herausfinden. Vielen Dank!

C

Antwort

2

Statt die NSURLResponse Beschreibung des Druckens, sollten Sie die JSON-Daten drucken trösten Sie eine bessere Vorstellung zu geben. Ändern Sie den Code wie folgt aussehen:

NSURLSessionUploadTask *task = [session uploadTaskWithRequest:request fromData:postData completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
if (!error) { 
    NSError* jsonError; 
    NSDictionary* json = [NSJSONSerialization JSONObjectWithData:data 
               options:kNilOptions 
                error:&jsonError]; 
    NSLog(@"\nPurchase Response:\n\n%@", json); //You will have to edit this to use the actual error object returned from the curl request. 
} else { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Authorization Failed" message:@"Your payment did not go through." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]; 
     [alert show]; 
    } 
}]; 

Sobald Sie dies getan haben, können Sie eine viel bessere Vorstellung davon haben sollte, was falsch läuft.

Update:

Ich sehe jetzt, mehr von dem, was vor sich geht. Ihre Anfrage ist in der Tat fehlerhaft: Ihre Post- und Postdatenwerte sind falsch. Sie einen String-Wert zu senden, anstatt json (diese Zeilen unten)

NSString *post = [NSString stringWithFormat:@"intent=sale&redirect_urls=%@&payer=%@", redirectDict, payerDict]; 
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 

Stattdessen ersetzen diese beiden Linien mit diesem (wie Sie über eine URL senden würde):

NSError *jsonError; 
NSData *postData = [NSJSONSerialization dataWithJSONObject:dataDict options:0 error:&error]; 
+0

Dank @jrobe - sollte dies ursprünglich getan haben, bevor ich die Frage gestellt habe. So wie ich dachte, dass etwas mit der JSON-Anfrage nicht stimmt: –

+0

Kaufantwort: { "debug_id" = fbcc3a0134a8; "information_link" = "https://developer.paypal.com/webapps/developer/docs/api/#MALFORMED_REQUEST"; message = "Die Anfrage JSON ist nicht gut gebildet."; name = "MALFORMED_REQUEST"; } –

+0

Mein Freund, du bist ein Heiliger. Danke noch einmal. @jrobe –