Интеграция страницы Adyen hpp в iOS всегда выдает недопустимую ошибку торговой подписи

#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