All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ru.abyss.acquiring.soap.AbstractAcquiringServlet Maven / Gradle / Ivy

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