Skip to content

nerzh/WayForPay-Swift-Client

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

WayForPay-Swift-Client

Install with Swift Package Manager

dependencies: [
    .package(name: "WFPClient", url: "https://github.com/nerzh/WayForPay-Swift-Client.git", from: "0.2.3"),
],
targets: [
    .target(
        name: "YourProject",
        dependencies: [
            .product(name: "WFPClient", package: "WFPClient"),
        ]
    )
]

Install with Cocoapods

pod "WFPClient", '0.2.3'

Import

import WFPClient

Usage

  1. Создаем объект request
let request: WFPChargeRequest = .init(transactionType: .CHARGE,
                                      merchantAccount: "мерчант из кабинета WayForPay",
                                      merchantDomainName: "https://адрес вашего сайта",
                                      orderReference: "id заказа с вашей базы",
                                      orderDate: "дата заказа",
                                      currency: .UAH,
                                      clientFirstName: "Имя клиента",
                                      clientLastName: "Фамилия клиента",
                                      clientCountry: "Ukraine",
                                      clientEmail: "почтовый ящик клиента",
                                      clientPhone: "телефон клиента",
                                      merchantTransactionType: .SALE,
                                      merchantTransactionSecureType: .NON3DS)
  1. Создаем объект client, среди необязательных параметров есть httpClient, он наследуется от протокола WFPHttpClientPrtcl и требует реализовать всего один метод с помощью которого отправляется запрос на сервер WayForPay, по умолчанию запрос отправляется с помощью URLSession, если хотите можете реализовать свой и передеать его как параметр клиенту
let client = WFPClient.init(apiURL: URL(string: "https://api.wayforpay.com/api")!,
                            request: request,
                            secretKey: "секретный ключ из кабинета WayForPay для генерации подписи к запросу")
  1. Так как информация о продукте по протоколу добавляется последовательно в три массива и кейс, в котором ими туда сюда надо будет манипулировать выглядит довольно странно, я сделал два метода:
  • собственно добавить продукт к запросу
client.addProduct(name: "Test Product", price: 100.50, count: 2)
client.addProduct(name: "Test Product 2", price: 2.50, count: 1)
  • и на всякий случай метод удаления всех продуктов из запроса
client.deleteProducts()
  1. Сумма считается автоматичекси, но если ваша итоговая сумма отличается, можно задать
client.request.amount = 199.99
  1. Генерируем подпись. Подпись надо генерировать после того, как в запросе будут заполнены все поля
client.generateSignature()
  1. Теперь после того, как в методе делегата вы получили PaymentToken, добавляем его к запросу и можно отправлять запрос на оплату в WayForPay и в зависимости от ответа сервера вызывать handler complete
func paymentAuthorizationViewController(_ controller: PKPaymentAuthorizationViewController,
                                        didAuthorizePayment payment: PKPayment,
                                        handler completion: @escaping (PKPaymentAuthorizationResult) -> Void
) {
    
    client.addApplePaymentData(paymentData: payment.token.paymentData)
    
    do {
        try client.sendPaymentRequest { (result) in
            switch result {
            case let .success(wfpChargeResponse):
                if wfpChargeResponse.reasonCode == WFPReasonCode.Ok {
                    completion(PKPaymentAuthorizationResult(status: .success, errors: nil))
                } else {
                    completion(PKPaymentAuthorizationResult(status: .failure, errors: nil))
                }
            case .failure(error):
                completion(PKPaymentAuthorizationResult(status: .failure, errors: nil))
            }
        }
    } catch {
        completion(PKPaymentAuthorizationResult(status: .failure, errors: nil))
    }
}
  1. В ответ на sendPaymentRequest от WayForPay вы получите структуру WFPChargeResponse в которой гарантированно будут
wfpChargeResponse.reason     /// String
wfpChargeResponse.reasonCode /// WFPReasonCode - enum со всеми кодами ошибок и их описаниями description

в зависимости от которых вы сможете определить какой completion status выбирать и определить ваши дальнейшие действия