问题
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!
回答1:
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
回答2:
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
回答3:
Well I think that depends.
Although I was sure Apple wouldn't allow anything else than In-App-Purchases, I do know at least one app in the german appstore, which allows you to purchase tickets to a movie theatre within the app. They offer payment via credit card and a number of other services, IAP isn't even available.
They made it to the store somehow, so I'd suggest you go ahead and talk to Apple beforehand and find out whether they'll approve your business model or not.
Maybe they approve other methods of payment if the purchase consists of 100% real-world objects or services and does not change the behaviour or content of the app itself.
回答4:
No, you can't. The Store Review Guidelines, which every iOS app must match in order to get passed by Apple, clearly states that: - you are not allowed to use "a system other than the In-App Purchase API (IAP) to purchase content, functionality, or services" for payment (11.2) - it is not permitted to "us[e] IAP to purchase physical goods or goods and services used outside of the App"
Indeed, there is an API from Paypal for this purpose, but, as stated above, Apps using it will not pass the Review.
回答5:
It is possible, but the Appstore will not allow the use of the PayPal API as far as I know. The way to do this is to send the user to a website wich will handle the payment. Here you can use the PHP API for example.
来源:https://stackoverflow.com/questions/6940985/can-i-use-paypal-in-iphone-ipad-apps