
ru.abyss.acquiring.soap.AbstractAcquiringServlet Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of abyss-acquiring Show documentation
Show all versions of abyss-acquiring Show documentation
Internet acquiring Web Service client library
The newest version!
/*
* Copyright Бездна (c) 2017.
*/
package ru.abyss.acquiring.soap;
import java.io.IOException;
import java.net.URL;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Timer;
import java.util.TimerTask;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.paymentgate.engine.webservices.merchant.GetOrderStatusExtendedResponse;
/**
* @author Minu <[email protected]>
* @since 18.07.2017 14:29:47
*/
public abstract class AbstractAcquiringServlet extends HttpServlet {
private static final long serialVersionUID = -2806124344918280705L;
private static Logger logger = LoggerFactory.getLogger(AbstractAcquiringServlet.class.getName());
private static Map timers = Collections.synchronizedMap(new HashMap());
/**
* Создать таймер завершения сессии оплаты. В обычной ситуации, когда пользователь оплачивает заказ до завершения сессии, действие таймера отменяется.
* Иначе, через пять секунд после завершения сессии, на returnUrl отправляется фиктивный запрос, который имитирует возврат пользователя при ошибке
* платежа и запускает связанные с этим процессы
*
* @param timeout - таймаут сессии в секундах
* @param orderId - номер заказа в системе платёжного шлюза
* @param failUrl - адрес возврата пользователя после ошибки оплаты
*/
public static void addSessionTimer(int timeout, String orderId, String failUrl) {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
try (Scanner scanner = new Scanner(new URL(failUrl + "?orderId=" + orderId).openStream(), "UTF-8")) {
scanner.useDelimiter("\\A").hasNext(); // дёргаем наш сервлет чтобы инициировать процесс обработки платежа
} catch (Exception e) {
logger.error("Произошла ошибка", e);
}
}
}, (timeout + 5) * 1000);
timers.put(orderId, timer);
}
/**
* Сформировать ответ
*
* @param resp
* - ответ пользователю
* @param code
* - код HTTP ответа
* @param contentType
* - MIME тип содержимого
* @param content
* - содержимое ответа
*/
public static void response(HttpServletResponse resp, int code, String contentType, String content) {
try {
if ((resp == null) || resp.isCommitted())
return;
resp.reset();
resp.setStatus(code);
resp.setContentType(contentType);
resp.setCharacterEncoding("UTF-8");
resp.setHeader("Pragma", "no-cache");
resp.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
resp.setHeader("Expires", "Sat, 26 Jul 1997 05:00:00 GMT");
if (content != null) {
byte[] bytes = content.getBytes("UTF-8");
resp.setContentLength(bytes.length);
resp.getOutputStream().write(bytes);
}
try {
resp.flushBuffer();
} catch (IOException e) {
logger.warn(e.getClass() + ": " + e.getMessage());
}
} catch (Exception e) {
logger.error("", e);
}
}
/**
* Сформировать ответ
*
* @param resp
* - ответ пользователю
* @param title
* - заголовок
* @param mes
* - текст сообщения в формате HTML
*/
protected void response(HttpServletResponse resp, String title, String mes) {
response(
resp, 200, "text/html",
""
+ title
+ " "
+ title + "
" + mes + " ");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String orderId = req.getParameter("orderId");
if ((orderId != null) && !orderId.isEmpty()) {
GetOrderStatusExtendedResponse status = null;
try {
status = AcquiringUtil.getOrderStatusExtended(orderId, null);
// отменяем и удаляем таймер сессии
Timer timer = timers.remove(orderId);
if (timer != null)
timer.cancel();
} catch (Exception e) {
logger.error("Возникла ошибка при проведении оплаты", e);
onFailure(req, resp, orderId, e.getMessage(), null);
return;
}
if (status != null) {
if (status.getActionCode() == 0)
onSuccess(req, resp, orderId, status);
else
onFailure(req, resp, orderId, status.getActionCodeDescription(), status);
}
}
}
protected abstract void onSuccess(HttpServletRequest req, HttpServletResponse resp, String orderId, GetOrderStatusExtendedResponse status);
protected void onFailure(HttpServletRequest req, HttpServletResponse resp, String orderId, String message, GetOrderStatusExtendedResponse status) {
response(resp, "Возникла ошибка при проведении оплаты", message);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy