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

Posted

技术标签:

【中文标题】将 Paypal SDK 与原生 iOS 应用程序集成【英文标题】:Integrating Paypal SDK with native iOS App 【发布时间】:2016-12-06 09:18:40 【问题描述】:

我指的是 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;

    集成是否成功,还是我缺少某些东西,因为在 paypal 的响应中,我没有找到唯一的订单 ID,而不是从用户那里收取的金额。

编辑 1 这是我从中得到的信息

print("这也是信息 (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'`

请指正,我的不足之处。

【问题讨论】:

您的 JSON 无效。请通过验证您的 JSON here 来发布正确的 JSON 格式。 【参考方案1】:

如果你通过下面的代码

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: "", 贝宝环境沙箱: “哎呀……”])

【讨论】:

以上是关于将 Paypal SDK 与原生 iOS 应用程序集成的主要内容,如果未能解决你的问题,请参考以下文章

将 Paypal ios sdk 与 swift 5 集成时出错

ios sdk 中的付款选项,无需应用内购买和 PayPal

新 PayPal iOS SDK 中的实时凭证

如何使用 PayPal-iOS-SDK?

iOS Facebook SDK 原生分享

如何在IOS SDK中集成多个卖家的paypal?