在iPhone应用程序中使用PayPal实现简单付款?

时间:2013-02-13 08:15:42

标签: iphone ios objective-c paypal

我正在尝试通过IOS应用程序中的PayPal实现简单付款。我尝试了PayPal API。 API提供的示例代码工作正常。我试图在我的应用程序中实现它不会正确它崩溃。有没有最简单的方法来实现这一目标。

我添加了Libray文件。并按照代码:

[PayPal getPayPalInst].feePayer = feePayer;
[PayPal getPayPalInst].shippingEnabled = shippingSwitch.on;
[PayPal getPayPalInst].dynamicAmountUpdateEnabled = dynamicAmountCalculationSwitch.on;

if (isAdvanced) {
    [[PayPal getPayPalInst] advancedCheckoutWithPayment:advancedPayment];
} else {
    [[PayPal getPayPalInst] checkoutWithPayment:payment];
} 

对于付款操作,它会变得错误 请帮助解决此问题。

提前致谢。

1 个答案:

答案 0 :(得分:2)

导入整个paypal库后使用此代码

#import "PayPal.h"


typedef enum PaymentStatuses {
PAYMENTSTATUS_SUCCESS,
PAYMENTSTATUS_FAILED,
PAYMENTSTATUS_CANCELED,
} PaymentStatus;



@interface Paybypal : UIViewController<PayPalPaymentDelegate>{

@private
CGFloat y;
BOOL resetScrollView;
PaymentStatus status;
 }

@property(nonatomic,retain)NSString *details;
@property(nonatomic,retain)NSDecimalNumber *totalvaluemin;





in .m file



#import "Paybypal.h"
#import "PayPalPayment.h"
#import "PayPalAdvancedPayment.h"
#import "PayPalAmounts.h"
#import "PayPalReceiverAmounts.h"
#import "PayPalAddress.h"
#import "PayPalInvoiceItem.h"
#import "SuccessViewController.h"

#define SPACING 3.

@interface Paybypal ()

@end

@implementation Paybypal

 @synthesize details,totalvaluemin;


 -(void)addLabelWithText:(NSString *)text andButtonWithType:(PayPalButtonType)type withAction:(SEL)action {
UIFont *font = [UIFont boldSystemFontOfSize:14.];
CGSize size = [text sizeWithFont:font];


UIButton *button = [[PayPal getPayPalInst] getPayButtonWithTarget:self andAction:action andButtonType:type];
CGRect frame = button.frame;
frame.origin.x = round((self.view.frame.size.width - button.frame.size.width) / 2.);
frame.origin.y = round(y + size.height);
button.frame = frame;
[self.view addSubview:button];

UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(frame.origin.x, y, size.width, size.height)] autorelease];
label.font = font;
label.text = text;
label.backgroundColor = [UIColor clearColor];
[self.view addSubview:label];

y += size.height + frame.size.height + SPACING;
}



- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.



self.view = [[[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];
self.view.autoresizesSubviews = FALSE;
UIColor *color = [UIColor groupTableViewBackgroundColor];
if (CGColorGetPattern(color.CGColor) == NULL) {
    color = [UIColor lightGrayColor];
}
self.title = @"";


UIImageView *backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Background.JPG"]];
backgroundView.frame = self.view.bounds;
[[self view] addSubview:backgroundView];

status = PAYMENTSTATUS_CANCELED;

y = 2.;

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake((self.view.frame.size.width - 125), 222, 75, 25);

[button setTitle:@"" forState:UIControlStateNormal];
[button addTarget:self action:@selector(RetryInitialization) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];

[self addLabelWithText:@"" andButtonWithType:BUTTON_294x43 withAction:@selector(simplePayment)];


 }

 - (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
}

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
 {
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
 }

 - (void)simplePayment {

[PayPal getPayPalInst].shippingEnabled = TRUE;

[PayPal getPayPalInst].dynamicAmountUpdateEnabled = TRUE;


[PayPal getPayPalInst].feePayer = FEEPAYER_EACHRECEIVER;


PayPalPayment *payment = [[[PayPalPayment alloc] init] autorelease];
payment.recipient = @"receiver email id";
payment.paymentCurrency = @"USD";
payment.description = [NSString stringWithFormat:@"%@",details];
payment.merchantName = @"receiver name";


payment.subTotal = totalvaluemin;

payment.invoiceData = [[[PayPalInvoiceData alloc] init] autorelease];
payment.invoiceData.totalShipping = [NSDecimalNumber decimalNumberWithString:@"0"];
payment.invoiceData.totalTax = [NSDecimalNumber decimalNumberWithString:@"0.00"];




payment.invoiceData.invoiceItems = [NSMutableArray array];
PayPalInvoiceItem *item = [[[PayPalInvoiceItem alloc] init] autorelease];
item.totalPrice = payment.subTotal;
item.name =[NSString stringWithFormat:@"%@",details];
[payment.invoiceData.invoiceItems addObject:item];

[[PayPal getPayPalInst] checkoutWithPayment:payment];
    }



     #pragma mark -
     #pragma mark PayPalPaymentDelegate methods

    -(void)RetryInitialization
{
//[PayPal initializeWithAppID:@"APP-80W284485P519543T" forEnvironment:ENV_SANDBOX];

//DEVPACKAGE
    //[PayPal initializeWithAppID:@"APPLIVEID" forEnvironment:ENV_LIVE];
//  [PayPal initializeWithAppID:@"anything" forEnvironment:ENV_NONE];
}


- (void)paymentSuccessWithKey:(NSString *)payKey andStatus:(PayPalPaymentStatus)paymentStatus {
NSString *severity = [[PayPal getPayPalInst].responseMessage objectForKey:@"severity"];
NSLog(@"severity: %@", severity);
NSString *category = [[PayPal getPayPalInst].responseMessage objectForKey:@"category"];
NSLog(@"category: %@", category);
NSString *errorId = [[PayPal getPayPalInst].responseMessage objectForKey:@"errorId"];
NSLog(@"errorId: %@", errorId);
NSString *message = [[PayPal getPayPalInst].responseMessage objectForKey:@"message"];
NSLog(@"message: %@", message);

status = PAYMENTSTATUS_SUCCESS;
}


- (void)paymentFailedWithCorrelationID:(NSString *)correlationID {

NSString *severity = [[PayPal getPayPalInst].responseMessage objectForKey:@"severity"];
NSLog(@"severity: %@", severity);
NSString *category = [[PayPal getPayPalInst].responseMessage objectForKey:@"category"];
NSLog(@"category: %@", category);
NSString *errorId = [[PayPal getPayPalInst].responseMessage objectForKey:@"errorId"];
NSLog(@"errorId: %@", errorId);
NSString *message = [[PayPal getPayPalInst].responseMessage objectForKey:@"message"];
NSLog(@"message: %@", message);

status = PAYMENTSTATUS_FAILED;
}


- (void)paymentCanceled {
status = PAYMENTSTATUS_CANCELED;
}


- (void)paymentLibraryExit {
UIAlertView *alert = nil;
switch (status) {
    case PAYMENTSTATUS_SUCCESS:
        [self.navigationController pushViewController:[[[SuccessViewController alloc] init] autorelease] animated:TRUE];
        break;
    case PAYMENTSTATUS_FAILED:
        alert = [[UIAlertView alloc] initWithTitle:@"Order failed"
                                           message:@"Your order failed. Touch \"Pay with PayPal\" to try again."
                                          delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        break;
    case PAYMENTSTATUS_CANCELED:
        alert = [[UIAlertView alloc] initWithTitle:@"Order canceled"
                                           message:@"You canceled your order. Touch \"Pay with PayPal\" to try again."
                                          delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        break;
}
[alert show];
[alert release];
}


- (PayPalAmounts *)adjustAmountsForAddress:(PayPalAddress const *)inAddress andCurrency:(NSString const *)inCurrency andAmount:(NSDecimalNumber const *)inAmount
                                andTax:(NSDecimalNumber const *)inTax andShipping:(NSDecimalNumber const *)inShipping andErrorCode:(PayPalAmountErrorCode *)outErrorCode {
//do any logic here that would adjust the amount based on the shipping address
PayPalAmounts *newAmounts = [[[PayPalAmounts alloc] init] autorelease];
newAmounts.currency = @"SGD";
newAmounts.payment_amount = (NSDecimalNumber *)inAmount;

//change tax based on the address
if ([inAddress.state isEqualToString:@"CA"]) {
    newAmounts.tax = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%.2f",[inAmount floatValue] * .1]];
} else {
    newAmounts.tax = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%.2f",[inAmount floatValue] * .08]];
}
newAmounts.shipping = (NSDecimalNumber *)inShipping;

//if you need to notify the library of an error condition, do one of the following
//*outErrorCode = AMOUNT_ERROR_SERVER;
//*outErrorCode = AMOUNT_CANCEL_TXN;
//*outErrorCode = AMOUNT_ERROR_OTHER;

return newAmounts;
}


 - (NSMutableArray *)adjustAmountsAdvancedForAddress:(PayPalAddress const *)inAddress andCurrency:(NSString const *)inCurrency
                             andReceiverAmounts:(NSMutableArray *)receiverAmounts andErrorCode:(PayPalAmountErrorCode *)outErrorCode {
NSMutableArray *returnArray = [NSMutableArray arrayWithCapacity:[receiverAmounts count]];
for (PayPalReceiverAmounts *amounts in receiverAmounts) {
    //leave the shipping the same, change the tax based on the state
    if ([inAddress.state isEqualToString:@"CA"]) {
        amounts.amounts.tax = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%.2f",[amounts.amounts.payment_amount floatValue] * .1]];
    } else {
        amounts.amounts.tax = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@"%.2f",[amounts.amounts.payment_amount floatValue] * .08]];
    }
    [returnArray addObject:amounts];
}

//if you need to notify the library of an error condition, do one of the following
//*outErrorCode = AMOUNT_ERROR_SERVER;
//*outErrorCode = AMOUNT_CANCEL_TXN;
//*outErrorCode = AMOUNT_ERROR_OTHER;

return returnArray;
}


#pragma mark -
#pragma mark UITextFieldDelegate methods

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
return TRUE;
}

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
resetScrollView = FALSE;
return TRUE;
 }

 - (void)textFieldDidBeginEditing:(UITextField *)textField {
resetScrollView = TRUE;

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:.3];
[UIView setAnimationBeginsFromCurrentState:TRUE];
self.view.frame = CGRectMake(0., -216., self.view.frame.size.width, self.view.frame.size.height);
[UIView commitAnimations];
 }

 - (void)textFieldDidEndEditing:(UITextField *)textField {
if (resetScrollView) {
    resetScrollView = FALSE;

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:.3];
    [UIView setAnimationBeginsFromCurrentState:TRUE];
    self.view.frame = CGRectMake(0., 0., self.view.frame.size.width, self.view.frame.size.height);
    [UIView commitAnimations];
}
 }

 -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
return TRUE;
 }


 @end