# frozen_string_literal: true
#
# Модель для создания запроса об подтверждении оплаты системе Webpay. Перед созданием заказа обязательно создайте клиента.
# Прежде чем доставить товар (оказать услугу), Интернет-ресурс обязан проверить совершенный покупателем платеж.
# Необходимо учитывать, что запрос к тестовой среде необходимо отсылать на адрес https://sandbox.webpay.by, а к реальной среде https://billing.webpay.by
#
# Пример:
#
# Создаем объект и передаем ему номер транзакции
# confirmation = webpay_client.confirmation(transaction_id: 'item-1')
#
# Создаем пост запрос к банку
# confirmation.send
# метод send возвращает объект WebpayBy::ConfirmationResponse, который содержить методы для проверки электронной подписи
# и подтверждения об оплате
#
require 'uri'
require 'net/https'
require 'openssl'
module WebpayBy
class Confirmation
SANDBOX_URL = 'https://sandbox.webpay.by'
BILLING_URL = 'https://billing.webpay.by'
attr_reader :client, :transaction_id
def initialize(client:, transaction_id:)
@client = client
@transaction_id = transaction_id
end
def url_string
@client.debug_mode? ? SANDBOX_URL : BILLING_URL
end
# ОТВЕТ ЗА ЗАПРОС НА ПОДТВЕРЖДЕНИЕ: Возвращаемый XML выглядит примерно так (без переносов строк):
#
#
# 1
# get_transaction
# success
#
# 123456789
# 31231231
# BYN
# 100
# cc
# 4
# 584236984
# 5874129
# 154789648154
# 3021e68df9a7200135725c6331369a22
#
#
def send
xml = clear_xml_string api_request_xml
response = Net::HTTP.post_form(URI.parse(url_string), {'*API': '', 'API_XML_REQUEST': xml}).body
WebpayBy::ConfirmationResponse.new confirmation: self, response: response
end
def clear_xml_string(xml_str)
xml_str.gsub("\n", '').gsub(/\s{2,}/, '').gsub(' <', '<')
end
private
# Для проверки платежа при возврате на страницу Интернет-ресурса, указанному в поле wsb_return_url, необходимо выполнить
# API команду биллинга «get_transaction»
# Сгенерированный XML выглядит примерно так:
#
#
# get_transaction
#
# your_username
# your_md5_password
#
#
# 123456789
#
#
def api_request_xml
xml = Builder::XmlMarkup.new indent: 2
xml.instruct! :xml, encoding: 'ISO-8859-1'
xml.wsb_api_request do |req|
req.command 'get_transaction'
req.authorization do |auth|
auth.username @client.login
auth.password @client.password
end
req.fields do |merch|
merch.transaction_id @transaction_id
end
end
end
end
end