从 swift 4 调用贝宝 javascript 函数
Posted
技术标签:
【中文标题】从 swift 4 调用贝宝 javascript 函数【英文标题】:call a paypal javascript function from swift 4 【发布时间】:2018-07-18 14:26:07 【问题描述】:这是 paypal 支付的 java 脚本如何从 swift 4 调用这个以及如何将金额传递给这个脚本,现在支付的金额是硬编码的
paypal.Button.render(
env: 'sandbox', // sandbox | production
// PayPal Client IDs - replace with your own
// Create a PayPal app: https://developer.paypal.com/developer/applications/create
client:
sandbox: 'AZDxjDScFpQtjWTOUtWKbyN_bDt4OgqaF4eYXlewfBP4-8aqX3PiV8e1GWU6liB2CUXlkA59kJXE7M6R',
production: '<insert production client id>'
,
// Show the buyer a 'Pay Now' button in the checkout flow
commit: true,
// payment() is called when the button is clicked
payment: function(data, actions)
// Make a call to the REST api to create the payment
return actions.payment.create(
payment:
transactions: [
amount: total: '0.01', currency: 'USD'
]
);
,
// onAuthorize() is called when the buyer approves the payment
onAuthorize: function(data, actions)
// Make a call to the REST api to execute the payment
return actions.payment.execute().then(function()
window.alert('Payment Complete!');
);
, '#paypal-button-container');
我试过的代码是:
@IBAction func buttonActionPay(_ sender: UIButton)
let htmlPath = Bundle.main.path(forResource: "sampleHTMLCode", ofType: "html")
let url = URL(fileURLWithPath: htmlPath!)
let request = URLRequest(url: url)
webView.load(request)
上面的javascript代码来自paypal开发者网站,是否需要修改代码。
【问题讨论】:
【参考方案1】:只需像这样更改 javascript。
<!DOCTYPE html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="https://www.paypalobjects.com/api/checkout.js"></script>
</head>
<body>
<div id="paypal-button-container"></div>
<script>
// y = 12;
function bar(qq)
var y = qq
paypal.Button.render(
env: 'sandbox', // sandbox | production
// PayPal Client IDs - replace with your own
// Create a PayPal app: https://developer.paypal.com/developer/applications/create
client:
sandbox: 'AZDxjDScFpQtjWTOUtWKbyN_bDt4OgqaF4eYXlewfBP4-8aqX3PiV8e1GWU6liB2CUXlkA59kJXE7M6R',
production: '<insert production client id>'
,
// Show the buyer a 'Pay Now' button in the checkout flow
commit: true,
// payment() is called when the button is clicked
payment: function(data, actions)
// Make a call to the REST api to create the payment
return actions.payment.create(
payment:
transactions: [
amount: total: y, currency: 'USD'
]
);
,
// onAuthorize() is called when the buyer approves the payment
onAuthorize: function(data, actions)
// Make a call to the REST api to execute the payment
return actions.payment.execute().then(function()
window.alert('Payment Complete!');
);
, '#paypal-button-container');
</script>
</body>
Swift 代码是:
import UIKit
import WebKit
import JavaScriptCore
class ViewController:
UIViewController,WKUIDelegate,WKNavigationDelegate
var cont = String()
var jsContext: JSContext!
var webView: WKWebView
required init(coder aDecoder: NSCoder)
self.webView = WKWebView(frame: CGRect.zero)
super.init(coder: aDecoder)!
override func loadView()
super.loadView()
let userContentController = WKUserContentController()
let source = "bar('12');"
let userScript = WKUserScript(source: source, injectionTime:
WKUserScriptInjectionTime.atDocumentEnd, forMainFrameOnly: true)
userContentController.addUserScript(userScript)
let configuration = WKWebViewConfiguration()
configuration.userContentController = userContentController
self.webView = WKWebView(frame: self.view.frame, configuration:
configuration)
override func viewDidLoad()
super.viewDidLoad()
///
view.addSubview(webView)
webView.translatesAutoresizingMaskIntoConstraints = false
let height = NSLayoutConstraint(item: webView, attribute: .height,
relatedBy: .equal, toItem: view, attribute: .height, multiplier: 1,
constant: 0)
let width = NSLayoutConstraint(item: webView, attribute: .width,
relatedBy: .equal, toItem: view, attribute: .width, multiplier: 1,
constant: 0)
view.addConstraints([height, width])
let path = Bundle.main.path(forResource: "sampleHTMLCode", ofType:
"html")!
let url = URL(fileURLWithPath: path)
webView.load(URLRequest(url: url))
webView.allowsBackForwardNavigationGestures = true
///
webView.navigationDelegate = self
@IBAction func buttonActionPay(_ sender: UIButton)
let htmlPath = Bundle.main.path(forResource: "sampleHTMLCode",
ofType: "html")
let url = URL(fileURLWithPath: htmlPath!)
let request = URLRequest(url: url)
webView.load(request)
【讨论】:
以上是关于从 swift 4 调用贝宝 javascript 函数的主要内容,如果未能解决你的问题,请参考以下文章
Swift webview:如何从 javascript 中正确调用 swift 代码?
从使用 wkwebview 返回值的 javascript 调用 swift 函数
如何使用 JavaScriptCore 从 Swift 中的 javascript SDK 调用异步 javascript 函数
将数据从 JavaScript 传递到 Swift。 UserContentController 函数从未调用过问题