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

时间:2016-08-01 10:19:58

标签: ios swift xcode paypal paypal-sandbox

我指的是将PayPal-iOS-SDK与我的原生iOS应用集合在一起。

我已经成功整合了应用程序(这就是我的感受)

请参阅代码

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)")
    }



}

我对该应用的担忧是

1.无论我使用什么登录,我都可以登录。我已尝试tim@cook.com作为电子邮件,1234作为密码,但我仍然可以登录。

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

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. 集成是否成功,或者是否有我遗漏的东西,因为在Paypal的回复中我找不到唯一的订单ID,而不是用户收取的金额。
  2. 编辑1 这是我从

    获得的信息

    打印("这也是信息(completedPayment.description)") 从

    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}'`
    

    请纠正,我缺少的地方。

1 个答案:

答案 0 :(得分:3)

如果您查看以下代码

var environment:String = PayPalEnvironmentNoNetwork {
        willSet(newEnvironment) {
            if (newEnvironment != environment) {
                PayPalMobile.preconnectWithEnvironment(newEnvironment)
            }
        }
    }

这不是网络环境,它会让你一直成功。

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

 var environment:String = PayPalEnvironmentSandbox
        {
        willSet(newEnvironment) {
            if (newEnvironment != environment)
            {
                PayPalMobile.preconnectWithEnvironment(newEnvironment)
            }
        }
    }

然后,如果您尝试与任何其他用户而不是注册的沙盒用户,它将给您错误。这仅适用于沙盒用户。

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

 PayPalEnvironmentProduction 

我希望以上信息清楚您正在寻找。

  • 请勿忘记根据各自的环境更改AppDelegate中的客户端ID
  

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