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

com.securionpay.SecurionPayGateway Maven / Gradle / Ivy

The newest version!
package com.securionpay;

import com.securionpay.connection.Connection;
import com.securionpay.connection.HttpClientConnection;
import com.securionpay.connection.Response;
import com.securionpay.enums.FileUploadPurpose;
import com.securionpay.exception.SecurionPayException;
import com.securionpay.exception.SignException;
import com.securionpay.request.*;
import com.securionpay.response.*;
import com.securionpay.util.Base64;
import com.securionpay.util.ObjectSerializer;
import com.securionpay.util.SecurionPayUtils;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.Closeable;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import static java.lang.String.format;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.apache.commons.codec.binary.Base64.encodeBase64String;
import static org.apache.commons.codec.binary.Hex.encodeHexString;

public class SecurionPayGateway implements Closeable {

	public static final String DEFAULT_ENDPOINT = "https://api.securionpay.com/";
	public static final String UPLOADS_ENDPOINT = "https://uploads.securionpay.com/";

	private static final String CHARGES_PATH = "/charges";
	private static final String TOKENS_PATH = "/tokens";
	private static final String CUSTOMERS_PATH = "/customers";
	private static final String CARDS_PATH = "/customers/%s/cards";
	private static final String PLANS_PATH = "/plans";
	private static final String SUBSCRIPTIONS_PATH = "/subscriptions";
	private static final String EVENTS_PATH = "/events";
	private static final String BLACKLIST_RULE_PATH = "/blacklist";
	private static final String CROSS_SALE_OFFER_PATH = "/cross-sale-offers";
	private static final String CREDIT_PATH = "/credits";
	private static final String FILES_PATH = "/files";
	private static final String DISPUTES_PATH = "/disputes";
	private static final String FRAUD_WARNING_PATH = "/fraud-warnings";
	private static final String REFUND_PATH = "/refunds";

	private final ObjectSerializer objectSerializer = ObjectSerializer.INSTANCE;

	private Connection connection;

	private String secretKey;
	private String endpoint = DEFAULT_ENDPOINT;
	private String uploadsEndpoint = UPLOADS_ENDPOINT;

	public SecurionPayGateway() {
		this(null);
	}

	public SecurionPayGateway(String secretKey) {
		this(secretKey, new HttpClientConnection());
	}

	public SecurionPayGateway(String secretKey, Connection connection) {
		this.secretKey = secretKey;
		this.connection = connection;
	}

	public Charge createCharge(ChargeRequest request) {
		return post(CHARGES_PATH, request, Charge.class);
	}

	public Charge captureCharge(CaptureRequest request) {
		return post(CHARGES_PATH + "/" + request.getChargeId() + "/capture", request, Charge.class);
	}

	public Charge retrieveCharge(String chargeId) {
		return get(CHARGES_PATH + "/" + chargeId, Charge.class);
	}

	public Charge updateCharge(ChargeUpdateRequest request) {
		return post(CHARGES_PATH + "/" + request.getChargeId(), request, Charge.class);
	}

	/**
	 * @deprecated For backward compatibility only. Use {@link SecurionPayGateway#createRefund(RefundRequest)}}.
	 */
	@Deprecated
	public Charge refundCharge(RefundRequest request) {
		return post(CHARGES_PATH + "/" + request.getChargeId() + "/refund", request, Charge.class);
	}

	public ListResponse listCharges() {
		return list(CHARGES_PATH, Charge.class);
	}

	public ListResponse listCharges(ChargeListRequest request) {
		return list(CHARGES_PATH, request, Charge.class);
	}

	public Customer createCustomer(CustomerRequest request) {
		return post(CUSTOMERS_PATH, request, Customer.class);
	}

	public Customer retrieveCustomer(String customerId) {
		return get(CUSTOMERS_PATH + "/" + customerId, Customer.class);
	}

	public Customer updateCustomer(CustomerUpdateRequest request) {
		return post(CUSTOMERS_PATH + "/" + request.getCustomerId(), request, Customer.class);
	}

	public DeleteResponse deleteCustomer(String customerId) {
		return delete(CUSTOMERS_PATH + "/" + customerId, DeleteResponse.class);
	}

	public ListResponse listCustomers() {
		return list(CUSTOMERS_PATH, Customer.class);
	}

	public ListResponse listCustomers(CustomerListRequest request) {
		return list(CUSTOMERS_PATH, request, Customer.class);
	}

	public Card createCard(CardRequest request) {
		return post(format(CARDS_PATH, request.getCustomerId()), request, Card.class);
	}

	public Card retrieveCard(String customerId, String cardId) {
		return get(format(CARDS_PATH, customerId) + "/" + cardId, Card.class);
	}

	public Card updateCard(CardUpdateRequest card) {
		return post(format(CARDS_PATH, card.getCustomerId()) + "/" + card.getCardId(), card, Card.class);
	}

	public DeleteResponse deleteCard(String customerId, String cardId) {
		return delete(format(CARDS_PATH, customerId) + "/" + cardId, DeleteResponse.class);
	}

	public ListResponse listCards(String customerId) {
		return listCards(new CardListRequest().customerId(customerId));
	}

	public ListResponse listCards(CardListRequest listCards) {
		return list(format(CARDS_PATH, listCards.getCustomerId()), listCards, Card.class);
	}

	public Subscription createSubscription(SubscriptionRequest request) {
		return post(SUBSCRIPTIONS_PATH, request, Subscription.class);
	}

	public Subscription retrieveSubscription(String subscriptionId) {
		return get(SUBSCRIPTIONS_PATH + "/" + subscriptionId, Subscription.class);
	}

	public Subscription updateSubscription(SubscriptionUpdateRequest request) {
		return post(SUBSCRIPTIONS_PATH + "/" + request.getSubscriptionId(), request, Subscription.class);
	}

	public Subscription cancelSubscription(SubscriptionCancelRequest request) {
		return delete(SUBSCRIPTIONS_PATH + "/" + request.getSubscriptionId(), request, Subscription.class);
	}

	public ListResponse listSubscriptions(String customerId) {
		return listSubscriptions(new SubscriptionListRequest().customerId(customerId));
	}

	public ListResponse listSubscriptions(SubscriptionListRequest request) {
		return list(SUBSCRIPTIONS_PATH, request, Subscription.class);
	}

	public Plan createPlan(PlanRequest request) {
		return post(PLANS_PATH, request, Plan.class);
	}

	public Plan retrievePlan(String planId) {
		return get(PLANS_PATH + "/" + planId, Plan.class);
	}

	public Plan updatePlan(PlanUpdateRequest request) {
		return post(PLANS_PATH + "/" + request.getPlanId(), request, Plan.class);
	}

	public DeleteResponse deletePlan(String planId) {
		return delete(PLANS_PATH + "/" + planId, DeleteResponse.class);
	}

	public ListResponse listPlans() {
		return list(PLANS_PATH, Plan.class);
	}

	public ListResponse listPlans(PlanListRequest request) {
		return list(PLANS_PATH, request, Plan.class);
	}

	public Event retrieveEvent(String eventId) {
		return get(EVENTS_PATH + "/" + eventId, Event.class);
	}

	public ListResponse listEvents() {
		return list(EVENTS_PATH, Event.class);
	}

	public ListResponse listEvents(EventListRequest listEvents) {
		return list(EVENTS_PATH, listEvents, Event.class);
	}

	public Token createToken(TokenRequest request) {
		return post(TOKENS_PATH, request, Token.class);
	}

	public Token retrieveToken(String tokenId) {
		return get(TOKENS_PATH + "/" + tokenId, Token.class);
	}

	public BlacklistRule createBlacklistRule(BlacklistRuleRequest request) {
		return post(BLACKLIST_RULE_PATH, request, BlacklistRule.class);
	}

	public BlacklistRule retrieveBlacklistRule(String blacklistRuleId) {
		return get(BLACKLIST_RULE_PATH + "/" + blacklistRuleId, BlacklistRule.class);
	}

	public DeleteResponse deleteBlacklistRule(String blacklistRuleId) {
		return delete(BLACKLIST_RULE_PATH + "/" + blacklistRuleId, DeleteResponse.class);
	}

	public ListResponse listBlacklistRules() {
		return list(BLACKLIST_RULE_PATH, BlacklistRule.class);
	}

	public ListResponse listBlacklistRules(BlacklistRuleListRequest request) {
		return list(BLACKLIST_RULE_PATH, request, BlacklistRule.class);
	}

	public CrossSaleOffer createCrossSaleOffer(CrossSaleOfferRequest request) {
		return post(CROSS_SALE_OFFER_PATH, request, CrossSaleOffer.class);
	}

	public CrossSaleOffer retrieveCrossSaleOffer(String crossSaleOfferId) {
		return get(CROSS_SALE_OFFER_PATH + "/" + crossSaleOfferId, CrossSaleOffer.class);
	}

	public CrossSaleOffer updateCrossSaleOffer(CrossSaleOfferUpdateRequest request) {
		return post(CROSS_SALE_OFFER_PATH + "/" + request.getCrossSaleOfferId(), request, CrossSaleOffer.class);
	}

	public DeleteResponse deleteCrossSaleOffer(String crossSaleOfferId) {
		return delete(CROSS_SALE_OFFER_PATH + "/" + crossSaleOfferId, DeleteResponse.class);
	}

	public ListResponse listCrossSaleOffers() {
		return list(CROSS_SALE_OFFER_PATH, CrossSaleOffer.class);
	}

	public ListResponse listCrossSaleOffers(CrossSaleOfferListRequest request) {
		return list(CROSS_SALE_OFFER_PATH, request, CrossSaleOffer.class);
	}

	public Credit createCredit(CreditRequest request) {
		return post(CREDIT_PATH, request, Credit.class);
	}

	public Credit retrieveCredit(String creditId) {
		return get(CREDIT_PATH + "/" + creditId, Credit.class);
	}

	public Credit updateCredit(CreditUpdateRequest credit) {
		return post(CREDIT_PATH + "/" + credit.getCreditId(), credit, Credit.class);
	}

	public ListResponse listCredits() {
		return list(CREDIT_PATH, Credit.class);
	}

	public ListResponse listCredits(CreditListRequest request) {
		return list(CREDIT_PATH, request, Credit.class);
	}

	public String signCheckoutRequest(CheckoutRequest checkoutRequest) {
		String data = objectSerializer.serialize(checkoutRequest);

		try {
			String algorithm = "HmacSHA256";

			Mac hmac = Mac.getInstance(algorithm);
			hmac.init(new SecretKeySpec(secretKey.getBytes(UTF_8), algorithm));
			String signature = encodeHexString(hmac.doFinal(data.getBytes(UTF_8)));

			return encodeBase64String((signature + "|" + data).getBytes(UTF_8));
		} catch (Exception ex) {
			throw new SignException(ex);
		}
	}

	public FileUpload createFileUpload(File file, FileUploadPurpose purpose) {
		Map files = new HashMap<>();
		files.put("file", file);

		Map form = new HashMap<>();
		form.put("purpose", purpose.getValue());

		return multipart(FILES_PATH, files, form, FileUpload.class);
	}

	public FileUpload retrieveFileUpload(String id) {
		return get(uploadsEndpoint, FILES_PATH + "/" + id, FileUpload.class);
	}

	public ListResponse listFileUploads() {
		return list(uploadsEndpoint, FILES_PATH, null, FileUpload.class);
	}

	public ListResponse listFileUploads(FileUploadListRequest request) {
		return list(uploadsEndpoint, FILES_PATH, request, FileUpload.class);
	}

	public Dispute retrieveDispute(String id) {
		return get(DISPUTES_PATH + "/" + id, Dispute.class);
	}

	public Dispute updateDispute(DisputeUpdateRequest request) {
		return post(DISPUTES_PATH + "/" + request.getDisputeId(), request, Dispute.class);
	}

	public Dispute closeDispute(String id) {
		return post(DISPUTES_PATH + "/" + id + "/close", null, Dispute.class);
	}

	public ListResponse listDisputes() {
		return list(DISPUTES_PATH, null, Dispute.class);
	}

	public ListResponse listDisputes(DisputeListRequest request) {
		return list(DISPUTES_PATH, request, Dispute.class);
	}

	public ListResponse listFraudWarnings() {
		return list(FRAUD_WARNING_PATH, FraudWarning.class);
	}

	public ListResponse listFraudWarnings(FraudWarningListRequest request) {
		return list(FRAUD_WARNING_PATH, request, FraudWarning.class);
	}

	public FraudWarning retrieveFraudWarning(String id) {
		return get(FRAUD_WARNING_PATH + "/" + id, FraudWarning.class);
	}

	public Refund retrieveRefund(String refundId) {
		return get(REFUND_PATH + "/" + refundId, Refund.class);
	}

	public Refund createRefund(RefundRequest request) {
		return post(REFUND_PATH, request, Refund.class);
	}

	public ListResponse listRefunds(String chargeId) {
		RefundListRequest request = new RefundListRequest();
		request.chargeId(chargeId);
		return listRefunds(request);
	}

	public ListResponse listRefunds(RefundListRequest request) {
		return list(REFUND_PATH, request, Refund.class);
	}

	public Payout retrievePayout(String id) {
		return get("/payouts/" + id, Payout.class);
	}

	public Payout createPayout() {
		return post("/payouts", null, Payout.class);
	}

	public ListResponse listPayouts() {
		return list("/payouts", Payout.class);
	}

	public ListResponse listPayouts(PayoutListRequest request) {
		return list("/payouts", request, Payout.class);
	}

	public ListResponse listPayoutTransactions(String payoutId) {
		PayoutTransactionListRequest request = new PayoutTransactionListRequest();
		request.payout(payoutId);
		return list("/payout-transactions", request, PayoutTransaction.class);
	}

	public ListResponse listPayoutTransactions(PayoutTransactionListRequest request) {
		return list("/payout-transactions", request, PayoutTransaction.class);
	}

	@Override
	public void close() throws IOException {
		if (connection != null) {
			connection.close();
		}
	}

	protected  T get(String path, Class responseClass) {
		return get(endpoint, path, responseClass);
	}

	protected  T get(String path, Class responseClass, Expand expand) {
		return get(endpoint, path, responseClass, expand);
	}

	protected  T get(String endpoint, String path, Class responseClass) {
		return get(endpoint, path, responseClass, null);
	}

	protected  T get(String endpoint, String path, Class responseClass, Expand expand) {
		RetrieveRequest request = new RetrieveRequest().expand(expand);
		String url = buildQueryString(endpoint + path, request);
		Response response = connection.get(url, buildHeaders());
		ensureSuccess(response);
		return objectSerializer.deserialize(response.getBody(), responseClass);
	}

	protected  T post(String path, Object request, Class responseClass) {
		String requestBody = objectSerializer.serialize(request);
		Response response = connection.post(endpoint + path, requestBody, buildHeaders());
		ensureSuccess(response);
		return objectSerializer.deserialize(response.getBody(), responseClass);
	}

	protected  T multipart(String path, Map files, Map form, Class responseClass) {
		Response response = connection.multipart(uploadsEndpoint + path, files, form, buildHeaders());
		ensureSuccess(response);
		return objectSerializer.deserialize(response.getBody(), responseClass);
	}

	protected  ListResponse list(String path, Class elementClass) {
		return list(endpoint, path, null, elementClass);
	}

	protected  ListResponse list(String path, Object request, Class elementClass) {
		return list(endpoint, path, request, elementClass);
	}

	protected  ListResponse list(String endpoint, String path, Object request, Class elementClass) {
		String url = buildQueryString(endpoint + path, request);
		Response response = connection.get(url, buildHeaders());
		ensureSuccess(response);
		return objectSerializer.deserializeList(response.getBody(), elementClass);
	}
	protected  T delete(String path, Class responseClass) {
		return delete(path, null, responseClass);
	}

	protected  T delete(String path, Object request, Class responseClass) {
		String url = buildQueryString(endpoint + path, request);
		Response response = connection.delete(url, buildHeaders());
		ensureSuccess(response);
		return objectSerializer.deserialize(response.getBody(), responseClass);
	}

	private void ensureSuccess(Response response) {
		if (response.getStatus() != 200) {
			ErrorResponse error = objectSerializer.deserialize(response.getBody(), ErrorResponse.class);
			throw new SecurionPayException(error);
		}
	}

	private String buildQueryString(String url, Object request) {
		if (request == null) {
			return url;
		}

		return url + objectSerializer.serializeToQueryString(request);
	}

	protected Map buildHeaders() {
		Map headers = new HashMap<>();

		headers.put("Authorization", "Basic " + Base64.encode((secretKey + ":").getBytes()));
		headers.put("Content-Type", "application/json");
		headers.put("User-Agent", "SecurionPay-Java/" + SecurionPayUtils.getBuildVersion()
				+ " (Java/" + SecurionPayUtils.getJavaVersion() + ")");

		return headers;
	}

	public void setSecretKey(String secretKey) {
		this.secretKey = secretKey;
	}

	public void setConnection(Connection connection) {
		this.connection = connection;
	}

	public void setEndpoint(String endpoint) {
		this.endpoint = endpoint;
	}

	public void setUploadsEndpoint(String uploadsEndpoint) {
		this.uploadsEndpoint = uploadsEndpoint;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy