xcode 将 Paypal SDK 与原生 iOS 应用程序集成

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/38696375/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-15 09:06:08  来源:igfitidea点击:

Integrating Paypal SDK with native iOS App

iosswiftxcodepaypalpaypal-sandbox

提问by onkar

I am referring and integrating PayPal-iOS-SDKwith my native iOS app.

我指的是将PayPal-iOS-SDK与我的原生 iOS 应用程序集成。

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

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 [email protected]as email and 1234as password, still I was able to login.

1.无论我使用什么登录,我都可以登录。我已经尝试过[email protected]作为电子邮件和1234密码,但我仍然能够登录。

2.I have tried using credit card as 4242-4242-4242-4242, cvv 123 12/12 and still payment was successful.

2.我尝试使用信用卡为 4242-4242-4242-4242, cvv 123 12/12 并且仍然付款成功。

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; }

3.这些是我得到[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; }] 的另一个回应 , { 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; }

  1. 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.
  1. 集成是否成功,或者我遗漏了什么,因为在 paypal 的回应中,我没有找到唯一的订单 ID,而不是从用户那里收取的金额。

EDIT 1This is info I am getting from

编辑 1这是我得到的信息

print("this is also info (completedPayment.description)") from

打印(“这也是信息(completedPayment.description)”)来自

func payPalPaymentViewController(paymentViewController: PayPalPaymentViewController, didCompletePayment completedPayment: PayPalPayment) 
`CurrencyCode: AUD

Amount: 216.46

Short Description: My Shop

Intent: sale

Processable: Already processed

Display: 6.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.

不足之处请指正。

回答by Shrikant K

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

您需要根据您的要求更改环境。例如,如果您在 PayPal 上注册了沙箱用户,那么您需要像这样更改

 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.

还有一个称为 Production 的环境,用于实时目的,您需要向客户询问凭据。

 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
  • 不要忘记根据您各自的环境更改 AppDelegate 中的客户端 ID

PayPalMobile.initializeWithClientIdsForEnvironments([PayPalEnvironmentProduction: "", PayPalEnvironmentSandbox: "AYP......"])

PayPalMobile.initializeWithClientIdsForEnvironments([PayPalEnvironmentProduction: "", PayPalEnvironmentSandbox: "AYP......"])