ios - 来自paypal沙箱的消息:“此PayPal交易的货币必须与商户账户的货币匹配”
问题描述
Paypal 移动 SDK 已弃用,人们建议使用 Braintree。我正在创建一个演示 iOS 应用程序。这是我从服务器端收到的错误消息:“此 PayPal 交易的货币必须与商家帐户的货币匹配”。我传递的货币代码是 PHP。Paypal 会自动转换一些货币,而 PHP 不是其中之一。我需要为这种货币转换做任何额外的设置吗?
这是客户端的代码:
class ViewController: UIViewController {
var btClient: BTAPIClient?
var dataCollector: BTDataCollector?
override func viewDidLoad() {
super.viewDidLoad()
self.btClient = BTAPIClient(authorization: tokenizationKey)
self.dataCollector = BTDataCollector(apiClient: btClient!)
}
@IBAction func buttonTouchUpInside(_ sender: Any) {
startCheckout()
}
@objc func startCheckout() {
let payPalDriver = BTPayPalDriver(apiClient: self.btClient!)
payPalDriver.viewControllerPresentingDelegate = self
payPalDriver.appSwitchDelegate = self
let payPalRequest = BTPayPalRequest(amount: "1000.00")
payPalRequest.currencyCode = "PHP"
payPalRequest.lineItems = [.init(quantity: "1", unitAmount: "1000", name: "Item name", kind: .debit)]
payPalRequest.isShippingAddressEditable = true
payPalRequest.isShippingAddressRequired = true
//Shipping address
let postalAddress = BTPostalAddress()
postalAddress.streetAddress = "1234 Main St."
postalAddress.countryCodeAlpha2 = "PH"
postalAddress.extendedAddress = "Unit 1"
postalAddress.locality = "Chicago"
postalAddress.postalCode = "60652"
postalAddress.recipientName = "Jhon doe"
postalAddress.region = "IL"
payPalRequest.shippingAddressOverride = postalAddress
payPalDriver.requestOneTimePayment(payPalRequest) { (tokenizedPayPalAccount, error) -> Void in
if let tokenizedPayPalAccount = tokenizedPayPalAccount {
print("nonce: \(tokenizedPayPalAccount.nonce)")
self.dataCollector?.collectDeviceData() { deviceData in
self.sendRequestPaymentToServer(nonce: tokenizedPayPalAccount.nonce, amount: "1000.00", deviceData: deviceData)
}
} else if let error = error {
print(error.localizedDescription)
} else {
print("cancelled")
}
}
}
func sendRequestPaymentToServer(nonce: String, amount: String, deviceData: String) {
print("payment_method_nonce=\(nonce)&amount=\(amount)&deviceData=\(deviceData)")
let paymentURL = URL(string: "http://localhost/newServer/pay.php")!
var request = URLRequest(url: paymentURL)
request.httpBody = "payment_method_nonce=\(nonce)&amount=\(amount)&deviceData=\(deviceData)".data(using: String.Encoding.utf8)
request.httpMethod = "POST"
URLSession.shared.dataTask(with: request) { [weak self] (data, response, error) -> Void in
guard let data = data else {
print(error!.localizedDescription)
return
}
print(String(decoding: data, as: UTF8.self))
guard let result = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any], let success = result["success"] as? Bool, success == true else {
print("Transaction failed. Please try again.")
return
}
print("Successfully charged. Thanks So Much :)")
}.resume()
}
}
这是服务器端的代码:
$paymentMethodNonce = $_POST['payment_method_nonce'];
$amount = $_POST['amount'];
$deviceData = $_POST['deviceData'];
$result = $gateway->transaction()->sale([
'amount' => $amount,
'paymentMethodNonce' => $paymentMethodNonce,
'options' => [
'submitForSettlement' => true
],
'deviceData' => $deviceData
]);
echo json_encode($result);
解决方案
self.btClient = BTAPIClient(authorization: tokenizationKey)
标记化密钥只能用于完整的 Braintree 网关集成。这种集成需要在网关沙箱和您用于处理的后续生产帐户上设置新货币 PHP。如果您想在生产中使用 Braintree 网关,您的企业需要为此申请并获得批准。
因此,基本上,如果您要通过上述集成方法使用新货币,则需要在网关界面中设置 PHP。
要更直接地将 Braintree SDK 与 PayPal 一起使用(无网关帐户),您首先需要用于身份验证的凭据是访问令牌。使用服务器上的访问令牌获取客户端令牌,您的客户端将根据需要获取该令牌:https ://developers.braintreepayments.com/guides/authorization/client-token
沙盒 PayPal Braintree 访问令牌可以从以下地址获取: https://www.paypal.com/signin?intent=developer&returnUri =https %3A%2F%2Fdeveloper.paypal.com%2Fdeveloper%2Fapplication (对于直播模式,通过https://www.paypal.com/api)
推荐阅读
- apache-kafka - 在微控制器上运行 Kafka 生产者
- python - TensorFlow - ValueError:数组长度 10000 与索引长度 12000 不匹配
- javascript - 如何正确地将功能从 component.ts 移动到服务文件?
- c# - Rest API - 保存搜索结果
- wpf - 动态绑定 DataGridComboBox 列
- c# - 基于条件使用xpath从xml中提取值
- matlab - MATLAB 中两幅图像的 SNR 是否正确?
- html - @media 打印在 Mozilla 中无法正常工作
- django - Django 遗留数据库:如果 managed=false,是否需要 --fake-initial?
- c# - 通过 SqlDataReader 查询数据库