#ios #swift #paypal #braintree
#iOS #swift #paypal #braintree
Вопрос:
Мобильные SDK Paypal устарели, люди предложили использовать 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)amp;amount=(amount)amp;deviceData=(deviceData)")
let paymentURL = URL(string: "http://localhost/newServer/pay.php")!
var request = URLRequest(url: paymentURL)
request.httpBody = "payment_method_nonce=(nonce)amp;amount=(amount)amp;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);
Ответ №1:
self.btClient = BTAPIClient(authorization: tokenizationKey)
Ключ токенизации может использоваться только для полной интеграции Braintree gateway. Такая интеграция требует настройки новой валюты, PHP, в изолированной среде gateway и более поздних производственных учетных записях, которые вы используете для обработки. Если вы хотите использовать Braintree Gateway в производстве, ваш бизнес должен подать заявку и получить одобрение на это.
Итак, по сути, вам нужно настроить PHP в интерфейсе вашего шлюза, если вы собираетесь использовать эту новую валюту с помощью описанного выше метода интеграции.
Чтобы вместо этого использовать Braintree SDK с PayPal более напрямую (без учетной записи шлюза), учетные данные, которые необходимо использовать для аутентификации в первую очередь, — это токен доступа. Используйте токен доступа на вашем сервере, чтобы получить токен клиента, который ваш клиент будет извлекать по мере необходимости: https://developers.braintreepayments.com/guides/authorization/client-token
Токен доступа PayPal Braintree для песочницы можно получить снизу: https://www.paypal.com/signin?intent=developeramp;returnUri=https://developer.paypal.com/developer/application (Для живого режима, через https://www.paypal.com/api )