iphone - Iphone App 中的 Paypal Checkout Express 和 Web 服务器

原文 标签 iphone mobile paypal checkout

我有一些问题。
我正在研究如何在 iPhone 中使用 Paypal 结账。但是在很多天我无法解决这个问题。
我使用它的示例 MECL Example Non-Web (pizza order) 和 Document。
我创建了一个演示项目。
- 从 FetchDeviceAppID 获取 deviceReferenceToken
- 从 MECL 示例非 Web 项目中获取 [ECNetworkHandler sharedInstance].ecToken。
- 登录 Paypal Sandbox 成功并查看,但 Paynow 错误。

NSLog(@"payWithPayPal");
[ECNetworkHandler sharedInstance].ecToken =@"EC-63R96639DY166915M";// Get from Order Pizza 
[ECNetworkHandler sharedInstance].userAction = ECUSERACTION_COMMIT;
NSLog(@"deviceReferenceToken %@",[ECNetworkHandler sharedInstance].deviceReferenceToken);// Get from fetchDeviceAppId
[[ECNetworkHandler sharedInstance] setDelegate:self];
[self.navigationController pushViewController:[[WebViewController alloc] initWithURL:[ECNetworkHandler sharedInstance].redirectURL returnURL:RETURN_URL cancelURL:CANCEL_URL]
                                     animated:TRUE];

而已! ^^我不知道怎么做。谁有这方面的经验。

支持我!谢谢。

最佳答案

对于简单的付款流程,它对我有用。

导入整个 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

关于iphone - Iphone App 中的 Paypal Checkout Express 和 Web 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15151005/

相关文章:

iphone - 一个 View 中的两个 NSURLConnections

java - 对于J2SE程序员开始学习J2ME来说,最好的网站/书是什么?

iphone - 如何连接 nsstring url

iphone - 无法在 UIButton 中使用自定义字体

android - 我如何设计一个移动应用程序来跟踪其他应用程序

ios - 如何进行延迟深度链接?

paypal - 创建 Paypal 自定义事件注册表单

Magento 1.4 Paypal 错误

php - 从 Paypal 捐赠按钮获取捐赠值(value)?

iphone - 如何按日期获取日历事件?