gpt4 book ai didi

ios - Braintree - 嵌入式用户界面 - Apple Pay - Swift 3

转载 作者:搜寻专家 更新时间:2023-11-01 07:02:28 25 4
gpt4 key购买 nike

我正在为信用卡、paypal 和 apple pay 支付集成 Braintree Drop-in UI。我遵循了信用卡付款的基本步骤。在沙盒中一切正常。

现在我正在实现苹果支付。

我已经完成这里提到的配置,成功:https://developers.braintreepayments.com/guides/apple-pay/configuration/ios/v4

这是目前在模拟器中的样子:

enter image description here

我写了下面的代码来实现信用卡支付:

import UIKit
import BraintreeDropIn
import Braintree

class DonationPaymentViewController: UIViewController {

let toKinizationKey = "my_tokenization_key"
@IBOutlet weak var amountTextField: UITextField!

override func viewDidLoad() {
super.viewDidLoad()

// Do any additional setup after loading the view.
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

func sendRequestPaymentToServer(nonce: String, amount: String) {
let paymentURL = URL(string: "my_api_url")!
var request = URLRequest(url: paymentURL)
print("paymentMethodNonce=\(nonce)&amount=\(amount)")
//request.httpBody = "paymentMethodNonce=\(nonce)&amount=\(amount)".data(using: String.Encoding.utf8)
request.httpMethod = "POST"

let token = UserDefaults.standard.object(forKey: "Token") as! String

let params = ["paymentMethodNonce":"\(nonce)", "amount":amount] as [String : Any]

let prettyPrinted:Bool = false
let options = prettyPrinted ?
JSONSerialization.WritingOptions.prettyPrinted : JSONSerialization.WritingOptions(rawValue: 0)

request.httpBody = try! JSONSerialization.data(withJSONObject: params, options: options)
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
request.addValue(token, forHTTPHeaderField: "X-API-KEY")

URLSession.shared.dataTask(with: request) { [weak self] (data, response, error) -> Void in
guard let data = data else {
self?.show(message: (error?.localizedDescription)!)
return
}

guard let result = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any], let success = result?["success"] as? Bool, success == true else {
self?.show(message: "Transaction failed. Please try again.")
return
}

self?.show(message: "Successfully charged. Thanks So Much :)")
}.resume()
}

@IBAction func pay(_ sender: Any) {
let request = BTDropInRequest()
let dropIn = BTDropInController(authorization: toKinizationKey, request: request)
{ [unowned self] (controller, result, error) in

if let error = error {
self.show(message: error.localizedDescription)


} else if (result?.isCancelled == true) {
self.show(message: "Transaction Cancelled")

} else if let nonce = result?.paymentMethod?.nonce, let amount = self.amountTextField.text {
self.sendRequestPaymentToServer(nonce: nonce, amount: amount)
}
controller.dismiss(animated: true, completion: nil)
}
self.present(dropIn!, animated: true, completion: nil)
}

func show(message: String) {
DispatchQueue.main.async {
//self.activityIndicator.stopAnimating()

let alertController = UIAlertController(title: message, message: "", preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "OK", style: .cancel, handler: nil))
self.present(alertController, animated: true, completion: nil)
}
}

}

我需要 Apple Pay 编码方面的帮助。 Braintree 文档未提供有关 Braintree Drop-in UI for Apple Pay using Swift 3 的正确信息。这是我应该关注的链接:https://developers.braintreepayments.com/guides/apple-pay/client-side/ios/v4但它似乎不适用于 Drop-in UI。如果您对 Apple Pay 和 Paypal 的 Braintree 嵌入式 UI 有任何帮助,我们将不胜感激。

最佳答案

检查下面的代码,我尽可能地写评论,当用户选择苹果支付时,你必须配置 paymentRequest let paymentRequest = PKPaymentRequest()然后处理PKPaymentAuthorizationViewControllerDelegate获取nonce

func showDropIn(clientTokenOrTokenizationKey: String) {
let request = BTDropInRequest()
request.applePayDisabled = false // Make sure that applePayDisabled i sfalse

let dropIn = BTDropInController.init(authorization: clientTokenOrTokenizationKey, request: request) { (controller, result, error) in

if (error != nil) {
print("ERROR")
} else if (result?.isCancelled == true) {
print("CANCELLED")

} else if let result = result{

switch result.paymentOptionType {
case .applePay ,.payPal,.masterCard,.discover,.visa:
// Here Result success check paymentMethod not nil if nil then user select applePay
if let paymentMethod = result.paymentMethod{
//paymentMethod.nonce You can use nonce now
controller.dismiss(animated: true, completion: nil)
}else{

controller.dismiss(animated: true, completion: {

self.braintreeClient = BTAPIClient(authorization: clientTokenOrTokenizationKey)

// call apple pay
let paymentRequest = self.paymentRequest()

// Example: Promote PKPaymentAuthorizationViewController to optional so that we can verify
// that our paymentRequest is valid. Otherwise, an invalid paymentRequest would crash our app.

if let vc = PKPaymentAuthorizationViewController(paymentRequest: paymentRequest)
as PKPaymentAuthorizationViewController?
{
vc.delegate = self
self.present(vc, animated: true, completion: nil)
} else {
print("Error: Payment request is invalid.")
}

})




}
default:
print("error")
controller.dismiss(animated: true, completion: nil)
}

// Use the BTDropInResult properties to update your UI
// result.paymentOptionType
// result.paymentMethod
// result.paymentIcon
// result.paymentDescription
}


}

self.present(dropIn!, animated: true, completion: nil)

}



extension ViewController : PKPaymentAuthorizationViewControllerDelegate{

func paymentRequest() -> PKPaymentRequest {
let paymentRequest = PKPaymentRequest()
paymentRequest.merchantIdentifier = "merchant.com.Demo.example";
paymentRequest.supportedNetworks = [PKPaymentNetwork.amex, PKPaymentNetwork.visa, PKPaymentNetwork.masterCard];
paymentRequest.merchantCapabilities = PKMerchantCapability.capability3DS;
paymentRequest.countryCode = "US"; // e.g. US
paymentRequest.currencyCode = "USD"; // e.g. USD
paymentRequest.paymentSummaryItems = [
PKPaymentSummaryItem(label: "Dish", amount: NSDecimalNumber(string: "\(MyOrdersViewController.totalOrderPrice)")),

]
return paymentRequest
}





public func paymentAuthorizationViewController(_ controller: PKPaymentAuthorizationViewController, didAuthorizePayment payment: PKPayment, completion: @escaping (PKPaymentAuthorizationStatus) -> Swift.Void){

// Example: Tokenize the Apple Pay payment
let applePayClient = BTApplePayClient(apiClient: braintreeClient!)
applePayClient.tokenizeApplePay(payment) {
(tokenizedApplePayPayment, error) in
guard let tokenizedApplePayPayment = tokenizedApplePayPayment else {
// Tokenization failed. Check `error` for the cause of the failure.

// Indicate failure via completion callback.
completion(PKPaymentAuthorizationStatus.failure)

return
}

// Received a tokenized Apple Pay payment from Braintree.
// If applicable, address information is accessible in `payment`.

// Send the nonce to your server for processing.
print("nonce = \(tokenizedApplePayPayment.nonce)")

// self.postNonceToServer(paymentMethodNonce: tokenizedApplePayPayment.nonce)
// Then indicate success or failure via the completion callback, e.g.
completion(PKPaymentAuthorizationStatus.success)
}
}

func paymentAuthorizationViewControllerDidFinish(_ controller: PKPaymentAuthorizationViewController) {
dismiss(animated: true, completion: nil)
}


}

关于ios - Braintree - 嵌入式用户界面 - Apple Pay - Swift 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50326833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com