Paypal Payment issue of credit card payment - ios

I have integrate the paypal payment but when i entered the credit card detail on live mode it returns the error-
UNAUTHORIZED_PAYMENT - The merchant does not accept payments of this type. (401)
I am using the business account and permissions are enabled.
var payPalConfig = PayPalConfiguration()
var environment:String = PayPalEnvironmentProduction {
willSet(newEnvironment) {
if (newEnvironment != environment) {
PayPalMobile.preconnect(withEnvironment: newEnvironment)
}
}
}
var acceptCreditCards: Bool = true {
didSet {
payPalConfig.acceptCreditCards = acceptCreditCards
}
}
func paypalPaymentGatewaySetup(){
payPalConfig.acceptCreditCards = acceptCreditCards;
payPalConfig.merchantName = "User"
payPalConfig.merchantPrivacyPolicyURL = NSURL(string: "https://www.paypal.com/webapps/mpp/ua/privacy-full") as URL?
payPalConfig.merchantUserAgreementURL = NSURL(string: "https://www.paypal.com/webapps/mpp/ua/useragreement-full") as URL?
payPalConfig.languageOrLocale = NSLocale.preferredLanguages[0]
payPalConfig.payPalShippingAddressOption = .payPal;
PayPalMobile.preconnect(withEnvironment: environment)
}
override func viewDidLoad() {
super.viewDidLoad()
paypalPaymentGatewaySetup()
}
Now i am calling function makingRequestForPayment on click of make payment button and i have import payment status delegate as well. But in paypal delegate method i am getting "The merchant does not accept this type of payment Unauthorized 401". I did app delegate setup with client ID of Production as well
func makingRequestForPayment(){
// let globalPriceInStr = UserDefaults.standard.value(forKey: "PriceForPayment") as? String ?? ""
let globalPriceInStr = "1"
let totalPrice = NSDecimalNumber(string: globalPriceInStr)
let item1 = PayPalItem(name: "Membership", withQuantity: 1, withPrice: totalPrice, withCurrency: "USD", withSku: "SivaGanesh-0001")
print(item1)
let items = [item1]
print(items)
let subtotal = PayPalItem.totalPrice(forItems: items)
let shipping = NSDecimalNumber(string: "0.00")
let tax = NSDecimalNumber(string: "0.00")
let paymentDetails = PayPalPaymentDetails(subtotal: subtotal, withShipping: shipping, withTax: tax)
let total = subtotal.adding(shipping).adding(tax)
let payment = PayPalPayment(amount: total, currencyCode: "USD", shortDescription: "Advertisement Submission", intent: .sale)
payment.items = items
payment.paymentDetails = paymentDetails
if (payment.processable) {
let paymentViewController = PayPalPaymentViewController(payment: payment, configuration: payPalConfig, delegate: self)
present(paymentViewController!, animated: true, completion: nil)
}
else{
print("Payment not processable: \(payment)")
}
}

Related

How to use pkpaymentsummaryitemtype.pending in ApplePay/Swift?

In my app I need to add pending pay (after user have got some service).
I'm implement apple pay and received token. But I don't get how to make payment with item type pkpaymentsummaryitemtype.pending?
Here is my pay method:
func makePay()
{
let request = PKPaymentRequest()
request.merchantIdentifier = ApplePaySwagMerchantID
request.supportedNetworks = SupportedPaymentNetworks
request.merchantCapabilities = PKMerchantCapability.capability3DS
request.countryCode = "US"
request.currencyCode = "USD"
request.paymentSummaryItems = [
PKPaymentSummaryItem(label: "Some service", amount: 0, type: PKPaymentSummaryItemType.pending)]
let applePayController = PKPaymentAuthorizationViewController(paymentRequest: request)!
applePayController.delegate = self
var topVC = UIApplication.shared.keyWindow?.rootViewController
while((topVC!.presentedViewController) != nil) {
topVC = topVC!.presentedViewController
}
topVC?.present(applePayController, animated: true)
}
But when I have to show and debit final amount? I cant find examples of code on swift/IOS.
Or if I understood correct - with that type I just received authorization first and than with received token my bank/payment system will debit final amount after I send it?
Is it correct?

PKPaymentAuthorizationViewController appearing in simulator but not in real device

I have configured Apple Pay for the app and I have written code as follows. PKPaymentAuthorizationViewController appearing in simulator but not in real device.
func makePaymentwithApplePay() {
let paymentItem = PKPaymentSummaryItem.init(label: strRequestedSlot, amount: NSDecimalNumber(value: amountToBePaid))
let paymentNetworks = [PKPaymentNetwork.amex, .discover, .masterCard, .visa, .interac]
if PKPaymentAuthorizationViewController.canMakePayments(usingNetworks: paymentNetworks) {
let request = PKPaymentRequest()
request.currencyCode = "USD" // 1
request.countryCode = "US" // 2
request.merchantIdentifier = "“merchant.com.zipstored"// 3
request.merchantCapabilities = PKMerchantCapability.capability3DS // 4
request.supportedNetworks = paymentNetworks // 5
request.paymentSummaryItems = [paymentItem] // 6
if Stripe.canSubmitPaymentRequest(request),
let paymentAuthorizationViewController = PKPaymentAuthorizationViewController(paymentRequest: request) {
print("Hello I am In")
paymentAuthorizationViewController.delegate = self
present(paymentAuthorizationViewController, animated: true)
} else {
// There is a problem with your Apple Pay configuration
}
}
else {
displayDefaultAlert(title: "Error", message: "Unable to make Apple Pay transaction.")
}
}

Add Shipping charge in Paypal checkout using Braintree SDK

I am implement the Braintree SDK for payment in my E-Commerce application(iOS and Android).but I am not able to and shipping charge in “BTPayPalRequest”.
How to add Shipping charge in this SDK?
My Code is below:
braintreeClient = BTAPIClient(authorization: “Key”)!
let payPalDriver = BTPayPalDriver(apiClient: braintreeClient)
payPalDriver.viewControllerPresentingDelegate = self
payPalDriver.appSwitchDelegate = self // Optional
// Specify the transaction amount here. "2.32" is used in this example.
let request = BTPayPalRequest(amount: strAmmount)
/// Cart Item
var items = [BTPayPalLineItem]()
for Dict in ArrMyCartDetails{
let item = BTPayPalLineItem(quantity: String(Q), unitAmount: String(SP), name: strProductName, kind: .debit)
items.append(item)
}
request.lineItems = items
request.intent = .sale
request.displayName = AppTitle
request.isShippingAddressRequired = false
request.isShippingAddressEditable = false
request.shippingAddressOverride = BTPostalAddress.init()
request.currencyCode = "AUD"
payPalDriver.requestOneTimePayment(request) { (tokenizedPayPalAccount, error) in
if let tokenizedPayPalAccount = tokenizedPayPalAccount {
print("Got a nonce: \(tokenizedPayPalAccount.nonce)")
} else if error != nil {
// Handle error here...
self.ShowMessage(strMsg: "something wrong in payment process.")
} else {
// Buyer canceled payment approval
self.ShowMessage(strMsg: "you cancel payment!")
}
}

Integrating Paypal SDK with native iOS App

I am referring and integrating PayPal-iOS-SDK with my native iOS app.
I have successfully integrated the app(this is what I feel )
Please refer the code
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
PayPalMobile .initializeWithClientIdsForEnvironments([PayPalEnvironmentProduction: "YOUR_CLIENT_ID_FOR_PRODUCTION",
PayPalEnvironmentSandbox: "SANDBOX CODE"])
return true
}
View Controller
//
// ViewController.swift
// PaypalDemo
//
import UIKit
class ViewController: UIViewController,PayPalPaymentDelegate {
var environment:String = PayPalEnvironmentNoNetwork {
willSet(newEnvironment) {
if (newEnvironment != environment) {
PayPalMobile.preconnectWithEnvironment(newEnvironment)
}
}
}
#if HAS_CARDIO
// You should use the PayPal-iOS-SDK+card-Sample-App target to enable this setting.
// For your apps, you will need to link to the libCardIO and dependent libraries. Please read the README.md
// for more details.
var acceptCreditCards: Bool = true {
didSet {
payPalConfig.acceptCreditCards = acceptCreditCards
}
}
#else
var acceptCreditCards: Bool = false {
didSet {
payPalConfig.acceptCreditCards = acceptCreditCards
}
}
#endif
var resultText = "" // empty
var payPalConfig = PayPalConfiguration() // default
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
// Do any additional setup after loading the view.
title = "PayPal SDK Demo"
//successView.hidden = true
// Set up payPalConfig
print("this is credit card status \(acceptCreditCards)")
payPalConfig.acceptCreditCards = true;
payPalConfig.merchantName = "Awesome Shirts, Inc."
payPalConfig.merchantPrivacyPolicyURL = NSURL(string: "https://www.paypal.com/webapps/mpp/ua/privacy-full")
payPalConfig.merchantUserAgreementURL = NSURL(string: "https://www.paypal.com/webapps/mpp/ua/useragreement-full")
payPalConfig.languageOrLocale = NSLocale.preferredLanguages()[0]
// Setting the payPalShippingAddressOption property is optional.
//
// See PayPalConfiguration.h for details.
payPalConfig.payPalShippingAddressOption = .PayPal;
print("PayPal iOS SDK Version: \(PayPalMobile.libraryVersion())")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
PayPalMobile.preconnectWithEnvironment(environment)
}
#IBAction func payByPaypal(sender: UIButton) {
print("integrate paypal here")
resultText = ""
// Note: For purposes of illustration, this example shows a payment that includes
// both payment details (subtotal, shipping, tax) and multiple items.
// You would only specify these if appropriate to your situation.
// Otherwise, you can leave payment.items and/or payment.paymentDetails nil,
// and simply set payment.amount to your total charge.
// Optional: include multiple items
let item1 = PayPalItem(name: "Old jeans with holes", withQuantity: 2, withPrice: NSDecimalNumber(string: "84.99"), withCurrency: "USD", withSku: "Hip-0037")
let item2 = PayPalItem(name: "Free rainbow patch", withQuantity: 1, withPrice: NSDecimalNumber(string: "0.00"), withCurrency: "USD", withSku: "Hip-00066")
let item3 = PayPalItem(name: "Long-sleeve plaid shirt (mustache not included)", withQuantity: 1, withPrice: NSDecimalNumber(string: "37.99"), withCurrency: "USD", withSku: "Hip-00291")
let items = [item1, item2, item3]
let subtotal = PayPalItem.totalPriceForItems(items)
// Optional: include payment details
let shipping = NSDecimalNumber(string: "5.99")
let tax = NSDecimalNumber(string: "2.50")
let paymentDetails = PayPalPaymentDetails(subtotal: subtotal, withShipping: shipping, withTax: tax)
let total = subtotal.decimalNumberByAdding(shipping).decimalNumberByAdding(tax)
let payment = PayPalPayment(amount: total, currencyCode: "AUD", shortDescription: "My Shop", intent: .Sale)
payment.items = items
payment.paymentDetails = paymentDetails
if (payment.processable) {
let paymentViewController = PayPalPaymentViewController(payment: payment, configuration: payPalConfig, delegate: self)
presentViewController(paymentViewController!, animated: true, completion: nil)
}
else {
// This particular payment will always be processable. If, for
// example, the amount was negative or the shortDescription was
// empty, this payment wouldn't be processable, and you'd want
// to handle that here.
print("Payment not processalbe: \(payment)")
}
}
func payPalPaymentDidCancel(paymentViewController: PayPalPaymentViewController) {
print("PayPal Payment Cancelled")
resultText = ""
// successView.hidden = true
paymentViewController.dismissViewControllerAnimated(true, completion: nil)
}
func payPalPaymentViewController(paymentViewController: PayPalPaymentViewController, didCompletePayment completedPayment: PayPalPayment) {
print("PayPal Payment Success !")
paymentViewController.dismissViewControllerAnimated(true, completion: { () -> Void in
// send completed confirmaion to your server
// print("Here is your proof of payment:\n\n\(completedPayment.confirmation)\n\nSend this to your server for confirmation and fulfillment.")
self.resultText = completedPayment.description
self.showSuccess(completedPayment.confirmation)
})
}
func showSuccess(inputString: NSObject) {
print("this is done successfully :) ")
print("send this to server \(inputString)")
}
}
My concerns regarding the app is
1.Whatever login I am using I am able to login . I have tried tim#cook.com as email and 1234 as password, still I was able to login.
2.I have tried using credit card as 4242-4242-4242-4242, cvv 123 12/12 and still payment was successful.
3.These are responses I am getting
[client: {
environment = mock;
"paypal_sdk_version" = "2.14.3";
platform = iOS;
"product_name" = "PayPal iOS SDK";
}, response_type: payment, response: {
"create_time" = "2016-08-01T09:16:40Z";
id = "PAY-NONETWORKPAYIDEXAMPLE123";
intent = sale;
state = approved;
}]
for another,
{
client = {
environment = mock;
"paypal_sdk_version" = "2.14.3";
platform = iOS;
"product_name" = "PayPal iOS SDK";
};
response = {
"create_time" = "2016-08-01T09:59:31Z";
id = "API-PAYMENT-ID-1843";
intent = sale;
state = approved;
};
"response_type" = payment;
}
Is the integration successful, or is there something that I am missing, because in response from paypal I don't find unique order id, not amount that has been charged from the user.
EDIT 1
This is info I am getting from
print("this is also info (completedPayment.description)")
from
func payPalPaymentViewController(paymentViewController: PayPalPaymentViewController, didCompletePayment completedPayment: PayPalPayment)
`CurrencyCode: AUD
Amount: 216.46
Short Description: My Shop
Intent: sale
Processable: Already processed
Display: $216.46
Confirmation: {
client = {
environment = mock;
"paypal_sdk_version" = "2.14.3";
platform = iOS;
"product_name" = "PayPal iOS SDK";
};
response = {
"create_time" = "2016-08-01T11:05:51Z";
id = "PAY-NONETWORKPAYIDEXAMPLE123";
intent = sale;
state = approved;
};
"response_type" = payment;
}
Details: Subtotal: 207.97, Shipping: 5.99, Tax: 2.5
Shipping Address: (null)
Invoice Number: (null)
Custom: (null)
Soft Descriptor: (null)
BN code: (null)
Item: '{2|Old jeans with holes|84.99|USD|Hip-0037}'
Item: '{1|Free rainbow patch|0.00|USD|Hip-00066}'
Item: '{1|Long-sleeve plaid shirt (mustache not included)|37.99|USD|Hip-00291}'`
Please correct, me where I am lacking.
If you go through below code
var environment:String = PayPalEnvironmentNoNetwork {
willSet(newEnvironment) {
if (newEnvironment != environment) {
PayPalMobile.preconnectWithEnvironment(newEnvironment)
}
}
}
Which is no network environment it will give you all the time success.
You need to change environment as per your requirement. For e.g. If you have sandbox user registered on PayPal then you need to change like this
var environment:String = PayPalEnvironmentSandbox
{
willSet(newEnvironment) {
if (newEnvironment != environment)
{
PayPalMobile.preconnectWithEnvironment(newEnvironment)
}
}
}
And then if you try with any other user rather than registered sandbox user it will give you error. This will work for only sandbox user.
There is one more environment called Production which is for live purpose that you need to ask credentials from your client.
PayPalEnvironmentProduction
I hope the above information is clear which you was looking for.
Don't forget to change client IDs in AppDelegate as per your respective environment
PayPalMobile.initializeWithClientIdsForEnvironments([PayPalEnvironmentProduction:
"", PayPalEnvironmentSandbox:
"AYP......"])

iOS Swift PayPal Always In Sandbox

I have successfully integrated PayPal into my app. However, it seems to be stuck in Sandbox mode. Here is my code to initialize it:
PayPalMobile .initializeWithClientIdsForEnvironments([PayPalEnvironmentProduction: "APP-0XU423690N0796541"])
As can been seen, I'm not even specifying a sandbox ID.
My code to initiate the payment is:
let payPalConfig = PayPalConfiguration()
payPalConfig.merchantName = "MacCrafters Software"
let item1 = PayPalItem(name: "Donation", withQuantity: 1, withPrice: NSDecimalNumber(string: amountField.text!), withCurrency: "USD", withSku: "Donation")
let items = [item1]
let subtotal = PayPalItem.totalPriceForItems(items)
// Optional: include payment details
let shipping = NSDecimalNumber(string: "0.00")
let tax = NSDecimalNumber(string: "0.00")
let paymentDetails = PayPalPaymentDetails(subtotal: subtotal, withShipping: shipping, withTax: tax)
let total = subtotal.decimalNumberByAdding(shipping).decimalNumberByAdding(tax)
let payment = PayPalPayment(amount: total, currencyCode: "USD", shortDescription: "Donation", intent: .Sale)
payment.items = items
payment.paymentDetails = paymentDetails
if (payment.processable) {
let paymentViewController = PayPalPaymentViewController(payment: payment, configuration: payPalConfig, delegate: self)
presentViewController(paymentViewController!, animated: true, completion: nil)
}
At the bottom of the PayPal view it always says "Mock Data". I get the same results no matter if I'm in the simulator or on a device. What am I doing wrong?

Resources