我正在尝试通过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];
}
对于付款操作,它会变得错误 请帮助解决此问题。
提前致谢。
答案 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