#ios #adyen
Вопрос:
Я пытаюсь интегрировать оплату Adyen в iOS с помощью метода HPP. Постоянно получая Merchant signature was not valid
ошибку, я подозреваю какую-то проблему с частью кодирования.
Ниже приведен фрагмент кода, который я использую для создания тела запроса
var urlComponents = URLComponents()
urlComponents.queryItems = []
let contentKeys1: [String] = Array(content.keys)
for contentKey in contentKeys1 {
if let contentValue = content[contentKey] {
urlComponents.queryItems?.append(URLQueryItem(name: contentKey, value: contentValue))
}
}
self.httpBody = urlComponents.query?.data(using: .utf8)
В Android все работает нормально, и я использовал созданную Android строку в iOS для тестирования, и страница оплаты запускается без каких-либо ошибок.
Ниже приведен фрагмент кода Android для создания тела запроса
val query = StringBuilder()
if (providerDataset != null) {
for (providerData: ProviderData in providerDataset) {
val key = providerData.key
var value: String? = ""
try {
if (providerData.value != null)
value = URLEncoder.encode(providerData.value, StandardCharsets.UTF_8.toString())
} catch (e: UnsupportedEncodingException) {
e.printStackTrace()
}
val str = "$key=$value"
query.append(str).append("amp;")
}
}
return query.deleteCharAt(query.length - 1).toString()
Есть ли у нас метод кодирования в iOS, который выполняет ту же работу, что и Android в приведенном выше коде?
Много дней боролся, чтобы понять это. Любая помощь очень ценна
Комментарии:
1. Привет. Мой ответ решил ваш вопрос? Если да, пожалуйста, примите это. В противном случае, дайте мне знать, если у вас возникнут какие-либо проблемы с этим.
Ответ №1:
Вы помещаете параметры запроса внутрь httpBody
. Вместо этого вам нужно добавить их в URL
.
Для этого я использую следующий код, сгенерированный Paw:
protocol URLQueryParameterStringConvertible {
var queryParameters: String {get}
}
extension Dictionary : URLQueryParameterStringConvertible {
/**
This computed property returns a query parameters string from the given NSDictionary. For
example, if the input is @{@"day":@"Tuesday", @"month":@"January"}, the output
string will be @"day=Tuesdayamp;month=January".
@return The computed parameters string.
*/
var queryParameters: String {
var parts: [String] = []
for (key, value) in self {
let part = String(format: "%@=%@",
String(describing: key).addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!,
String(describing: value).addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)
parts.append(part as String)
}
return parts.joined(separator: "amp;")
}
}
extension URL {
/**
Creates a new URL by adding the given query parameters.
@param parametersDictionary The query parameter dictionary to add.
@return A new URL.
*/
func appendingQueryParameters(_ parametersDictionary : Dictionary<String, String>) -> URL {
let URLString : String = String(format: "%@?%@", self.absoluteString, parametersDictionary.queryParameters)
return URL(string: URLString)!
}
}
Использование
let url = URL(string: "https://google.com/")!
.appendingQueryParameters([
"key1": "val1",
"key2": "val2",
])
let request = URLRequest(url: url)
// run request