- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在为信用卡、paypal 和 apple pay 支付集成 Braintree Drop-in UI。我遵循了信用卡付款的基本步骤。在沙盒中一切正常。
现在我正在实现苹果支付。
我已经完成这里提到的配置,成功:https://developers.braintreepayments.com/guides/apple-pay/configuration/ios/v4
这是目前在模拟器中的样子:
我写了下面的代码来实现信用卡支付:
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/
一直以来中国版Apple Watch心不支持心电图功能,不过近日Apple Watch心电图终于在国行版上线了!那么Apple Watch心国内版心电图要如何使用呢?下面一起来看看吧! App
我正在尝试将“使用 Apple 登录”添加到我现有的 App ID。检查启用它的选项后,显示以下弹出窗口:带有此消息: If you're enabling an App ID for the fir
我有一个并发症,可能需要每 5 分钟更新一次。这很容易总结为每天 120 次更新。有没有办法只在用户唤醒 watch 时更新? 最佳答案 我认为您的问题的答案是否,目前没有办法只在用户唤醒 watch
我们正在测试新 Sign in with Apple我们的应用程序的功能,并且在初始请求时,我们会提供用户的全名和电子邮件地址(如果用户启用了这些选项)。 但是在随后的请求中,此数据不仅提供 iden
在我的苹果 watch 扩展中,我想使用长按手势功能。是否有任何 api 等效于 UILongPressGestureRecognizer。我的要求是,在 watch 扩展上,我有表格想要长按单元格,
有没有办法以编程方式显示苹果 map 中多个点之间的路线,如谷歌地图? 最佳答案 正如 MKMapItem 文档所述: If you specify the MKLaunchOptionsDirect
我一直在互联网上关注很多教程来学习如何设置并发症。按预期设置并发症我没有问题。 直到初始时间线条目过期。 12 小时后,我不知道如何更新它以保持并发症的存在。我将在下面分享我拥有的所有内容,希望有人可
我看到一本书的描述...... 书上说 /^Apple/ 会匹配字符串开头有一个 Apple 的字符串。所以它将匹配 Apple Apple1 AppleApple AppleABC ...... 书
众所周知,您可以禁止从允许接收 Apple 通知的应用程序接收通知。但是有谁知道禁用是在本地进行的(忽略 Apple 发送到应用程序的通知),还是 Apple 停止从它的服务器向您发送通知? 最佳答案
我有一个 Apple id,我正在构建一个使用 Apple 推送通知服务的应用程序,但我对此有点困惑。 Apple 执行此过程是否收费?它可以在安装了我的应用程序的特定数量的设备上运行是否有任何限制?
我正在制作一个音频播放器应用。 在苹果的音乐应用中,如果音乐专辑或播客没有插图,则显示音符图像或播客图标图像而不是插图。 我想做同样的事情。 我可以在我的应用程序中使用苹果音乐应用程序中的图像吗? 苹
我有一个自定义框架,我正在归档以在另一个项目中使用。更新到 Xcode11 后,我在使用该框架的项目中收到以下错误。 找不到目标“x86_64-apple-ios-simulator”的模块“MyCu
我有一个在 iOS 上运行良好的应用程序,但是当使用催化剂运行时,如果我在 macOS 上滑动到另一个虚拟桌面,然后再返回大约 10 次,它会间歇性地崩溃。它主要发生在 UICollectionVie
我正在使用 Xcode 开发 Apple Watch 应用程序。我想在屏幕的左上角放置一些文本,与列出时间的位置相邻。 当我将标签向上拖动到屏幕的一部分时,它会自动向下对齐。 我看到大多数 Apple
我似乎找不到在哪里设置我的 Apple Watch 应用程序的产品名称。我确实看到了产品名称选项,但更新它没有任何作用。也看不到文档中的任何内容 最佳答案 为了让您的应用程序名称在 iPhone 上的
问题:如何在我的服务器产品的安装程序中安全地包含推送通知所需的 SSL 证书? 背景:Apple 推送通知要求客户端 SSL 证书位于向 Apple 发出调用的服务器上。 我的产品采用传统的客户端/服
我已经在我的网站上实现了 Sign In with Apple。但问题是它只适用于我开发者的 Apple ID。 我尝试在同一环境中使用我的个人 Apple ID,并且登录过程也运行良好。 但是,当真
我的苹果触摸图标中的白色背景变黑了??我的白色背景不透明。该图标有一个白色三角形、红色圆圈和黑色文本。我唯一能辨认出来的是白色三角形和红色圆圈。知道是什么导致了这种情况以及如何使图标保持白色背景吗?
我正在考虑制作一个使用加速度计的 watchOS2 应用程序。如果应用程序在后台运行,它是否仍然能够接收来自加速度计或 CMMotionManager 的输入? 最佳答案 只有当 watchOS2 应
我想切换 Apple App Loader 使用的 Apple ID。 我找不到更改应用程序本身使用的帐户的方法。谷歌搜索没有带来任何有用的信息。当我启动加载程序应用程序时,它给我一个错误:“...您
我是一名优秀的程序员,十分优秀!