Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I use PayPal in iPhone/iPad apps?

I am working on an application that through which I want to sell some event Tickets.

Can I use PayPal for this purpose, and will Apple approve the app using other that StoreKit Framework.

I searched on this topic, but I am not able to find any possible solution.

Some searches say that paypal can be used and the other say that Apple never approves an app using payment gateway other than inAppPurchase.

Please help me!

like image 536
iOS Monster Avatar asked Dec 04 '22 20:12

iOS Monster


2 Answers

Yes, you can use PayPal payment gateway with your application. You can see the complete documentation from the below link:

https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/library_documentation#mobile

Add following code in your .h File

#import "PayPal.h"
#import "PayPalList.h"

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

Implement this delegate method "PayPalPaymentDelegate"

PayPalList *payPalList;
PaymentStatus status;

Add the following code in your .m File

#import "PayPalPayment.h"
#import "PayPalAdvancedPayment.h"
#import "PayPalAmounts.h"
#import "PayPalReceiverAmounts.h"
#import "PayPalAddress.h"
#import "PayPalInvoiceItem.h"
#define SPACING 3.

- (void)ButtonWithType:(PayPalButtonType)type withAction:(SEL)action 
{

    UIButton *btnPayWithPayPal = [[PayPal getInstance] getPayButtonWithTarget:self andAction:action andButtonType:type];

    CGRect frame;
    frame.origin.x = 60;
    frame.origin.y = 315;
    frame.size.width = 304;
    frame.size.height = 40;

    btnPayWithPayPal.frame = frame;
    [self.view addSubview:btnPayWithPayPal];
}

- (void)viewDidLoad
{
     [self ButtonWithType:BUTTON_194x37 withAction:@selector(simplePayment)];
}

#pragma mark -
#pragma mark PayPalPaymentDelegate methods

- (void)paymentSuccessWithKey:(NSString *)payKey andStatus:(PayPalPaymentStatus)paymentStatus 
{
    status = PAYMENTSTATUS_SUCCESS;
}

- (void)paymentFailedWithCorrelationID:(NSString *)correlationID andErrorCode:(NSString *)errorCode andErrorMessage:(NSString *)errorMessage 
{
    status = PAYMENTSTATUS_FAILED;
}

- (void)paymentCanceled 
{
    status = PAYMENTSTATUS_CANCELED;
}

- (void)paymentLibraryExit 
{
    UIAlertView *alert = nil;
    switch (status) {
        case PAYMENTSTATUS_SUCCESS:
            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 = @"USD";
    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_ERROR_OTHER;

    return newAmounts;
}

#pragma mark -
#pragma mark Actions triggered by Pay with PayPal buttons

- (void)simplePayment 
{
        //optional, set shippingEnabled to TRUE if you want to display shipping
    //options to the user, default: TRUE
    [PayPal getInstance].shippingEnabled = TRUE;

    //optional, set dynamicAmountUpdateEnabled to TRUE if you want to compute
    //shipping and tax based on the user's address choice, default: FALSE
    [PayPal getInstance].dynamicAmountUpdateEnabled = TRUE;

    //optional, choose who pays the fee, default: FEEPAYER_EACHRECEIVER
    [PayPal getInstance].feePayer = FEEPAYER_EACHRECEIVER;

    //for a payment with a single recipient, use a PayPalPayment object
    PayPalPayment *payment = [[[PayPalPayment alloc] init] autorelease];

    payment.recipient = [NSString stringWithFormat:@"%@",payPalList.strRecipientPayPalId];
    payment.paymentCurrency = [NSString stringWithFormat:@"%@",e_commerceAppDelegate.strProductCurrency];
    payment.merchantName = [NSString stringWithFormat:@"%@",payPalList.strPayPalMerchantName];
    payment.ipnUrl = [NSString stringWithFormat:@"%@",payPalList.strIpnUrl];

    //subtotal of all items, without tax and shipping
    payment.subTotal = [NSDecimalNumber decimalNumberWithString:stringsubtotal];

    //invoiceData is a PayPalInvoiceData object which contains tax, shipping, and a list of PayPalInvoiceItem objects
    payment.invoiceData = [[[PayPalInvoiceData alloc] init] autorelease];

    //invoiceItems is a list of PayPalInvoiceItem objects
    //NOTE: sum of totalPrice for all items must equal payment.subTotal
    //NOTE: example only shows a single item, but you can have more than one
    payment.invoiceData.invoiceItems = [NSMutableArray array];
    PayPalInvoiceItem *item = [[[PayPalInvoiceItem alloc] init] autorelease];
    item.totalPrice = payment.subTotal;

    //int i=0;

    for(i=0 ; i<[e_commerceAppDelegate.cartList count] ; i++)
    {
        cart = (Cart*)[e_commerceAppDelegate.cartList objectAtIndex:i];

        item.name = cart.proName;

        item.itemCount = [NSNumber numberWithInteger:cart.quantity];

        NSString *itemSingPrice = [NSString stringWithFormat:@"%.2f",cart.price];
        item.itemPrice = [NSDecimalNumber decimalNumberWithString:itemSingPrice];

        NSString *itemSubTotal = [NSString stringWithFormat:@"%.2f",cart.quantity*cart.price];
        item.totalPrice = [NSDecimalNumber decimalNumberWithString:itemSubTotal];

        [payment.invoiceData.invoiceItems addObject:item];

        item = [[[PayPalInvoiceItem alloc] init] autorelease];
    }

    NSScanner* scanner = [NSScanner localizedScannerWithString:e_commerceAppDelegate.strDeliveryCharges];
    NSDecimal decimal;
    [scanner scanDecimal:&decimal];
    NSDecimalNumber *decimalNumber = [NSDecimalNumber decimalNumberWithDecimal:decimal];

    payment.invoiceData.totalShipping = decimalNumber;

    [[PayPal getInstance] checkoutWithPayment:payment];

}

From the below links you can get idea for PayPal

https://www.x.com/community/ppx/xspaces/mobile/mep

https://www.x.com/docs/DOC-2532

https://cms.paypal.com/cms_content/US/en_US/files/developer/IPNGuide.pdf

https://cms.paypal.com/cms_content/US/en_US/files/developer/PP_MPL_Developer_Guide_and_Reference_Android.pdf

https://www.x.com/thread/45094

https://www.x.com/message/193751#193751

http://googlecheckout.blogspot.com/2010/06/pay-on-go-with-android-payment.html

https://chrome.google.com/webstore/detail/omomllobcfbllglbhpmafongpckhdcdn

like image 115
SJS Avatar answered Dec 07 '22 08:12

SJS


Although there is an API existing for Paypal integration in iPhone but as per the Apple guidelines it'll not approve such apps for their AppStore. See Apple guidelines clause 11.3 here https://developer.apple.com/appstore/resources/approval/guidelines.html

like image 30
iOS Monster Avatar answered Dec 07 '22 09:12

iOS Monster