package com.braintreegateway;
import com.braintreegateway.exceptions.NotFoundException;
import com.braintreegateway.util.Http;
import com.braintreegateway.util.NodeWrapper;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.TimeZone;
/**
* Provides methods to create, delete, find, and update {@link CreditCard}
* objects. This class does not need to be instantiated directly. Instead, use
* {@link BraintreeGateway#creditCard()} to get an instance of this class:
*
* <pre>
* BraintreeGateway gateway = new BraintreeGateway(...);
* gateway.creditCard().create(...)
* </pre>
*
* For more detailed information on {@link CreditCard CreditCards}, see <a
* href="http://www.braintreepayments.com/gateway/credit-card-api"
* target
* ="_blank">http://www.braintreepayments.com/gateway/credit-card-api
* </a><br />
* For more detailed information on credit card verifications, see <a href=
* "http://www.braintreepayments.com/gateway/credit-card-verification-api"
* target="_blank">http://www.braintreepayments.com/gateway/credit-card-
* verification-api</a>
*/
public class CreditCardGateway {
private Configuration configuration;
private Http http;
public CreditCardGateway(Http http, Configuration configuration) {
this.configuration = configuration;
this.http = http;
}
/**
* Please use gateway.transparentRedirect().confirmCreditCard() instead
*/
@Deprecated
public Result<CreditCard> confirmTransparentRedirect(String queryString) {
TransparentRedirectRequest trRequest = new TransparentRedirectRequest(configuration, queryString);
NodeWrapper node = http.post(configuration.getMerchantPath() + "/payment_methods/all/confirm_transparent_redirect_request", trRequest);
return new Result<CreditCard>(node, CreditCard.class);
}
/**
* Creates an {@link CreditCard}.
*
* @param request
* the request.
* @return a {@link Result}.
*/
public Result<CreditCard> create(CreditCardRequest request) {
NodeWrapper node = http.post(configuration.getMerchantPath() + "/payment_methods", request);
return new Result<CreditCard>(node, CreditCard.class);
}
/**
* Deletes a {@link CreditCard}.
*
* @param token
* the CreditCard's token.
* @return a {@link Result}.
*/
public Result<CreditCard> delete(String token) {
http.delete(configuration.getMerchantPath() + "/payment_methods/credit_card/" + token);
return new Result<CreditCard>();
}
/**
* Finds a {@link CreditCard}.
*
* @param token
* the CreditCard's token.
* @return the {@link CreditCard} or raises a
* {@link com.braintreegateway.exceptions.NotFoundException}.
*/
public CreditCard find(String token) {
if(token == null || token.trim().equals(""))
throw new NotFoundException();
return new CreditCard(http.get(configuration.getMerchantPath() + "/payment_methods/credit_card/" + token));
}
/**
* Exchanges a payment method nonce for a {@link CreditCard}.
*
* @param nonce
* a payment method nonce.
* @return the {@link CreditCard} or raises a
* {@link com.braintreegateway.exceptions.NotFoundException}.
*/
public CreditCard fromNonce(String nonce) {
if(nonce == null || nonce.trim().equals(""))
throw new NotFoundException();
try {
return new CreditCard(http.get(configuration.getMerchantPath() + "/payment_methods/from_nonce/" + nonce));
} catch (NotFoundException e) {
throw new NotFoundException("Payment method with nonce " + nonce + " locked, consumed or not found");
}
}
/**
* Returns a PaymentMethodNonce which can be used by another merchant
*
* @param token
* the token representing the CreditCard to forward
* @param receiving_merchant_id
* the public ID of the merchant to forward to
* @return a {@link Result} containing a PaymentMethodNonce or raises a
* {@link com.braintreegateway.exceptions.NotFoundException}.
*/
public Result<PaymentMethodNonce> forward(PaymentMethodForwardRequest forwardRequest) {
String receivingMerchantId = forwardRequest.getReceivingMerchantId();
String token = forwardRequest.getToken();
if (token == null || token.trim().equals(""))
throw new NotFoundException("Token is required");
if(receivingMerchantId == null || receivingMerchantId.trim().equals(""))
throw new NotFoundException("Receiving merchant ID is required");
try {
NodeWrapper node = http.post(configuration.getMerchantPath() + "/payment_methods/forward", forwardRequest);
return new Result<PaymentMethodNonce>(node, PaymentMethodNonce.class);
} catch (NotFoundException e) {
throw new NotFoundException("Receiving merchant or payment method not found");
}
}
/**
* Please use gateway.transparentRedirect().url() instead
*/
@Deprecated
public String transparentRedirectURLForCreate() {
return configuration.getBaseURL() + configuration.getMerchantPath() + "/payment_methods/all/create_via_transparent_redirect_request";
}
/**
* Please use gateway.transparentRedirect().url() instead
*/
@Deprecated
public String transparentRedirectURLForUpdate() {
return configuration.getBaseURL() + configuration.getMerchantPath() + "/payment_methods/all/update_via_transparent_redirect_request";
}
/**
* Updates a {@link CreditCard}.
*
* @param token
* the CreditCard's token.
* @param request
* the request.
* @return a {@link Result}.
*/
public Result<CreditCard> update(String token, CreditCardRequest request) {
NodeWrapper node = http.put(configuration.getMerchantPath() + "/payment_methods/credit_card/" + token, request);
return new Result<CreditCard>(node, CreditCard.class);
}
/**
* Returns a {@link ResourceCollection} of all expired credit cards.
*
* @return a {@link ResourceCollection}.
*/
public ResourceCollection<CreditCard> expired() {
NodeWrapper response = http.post(configuration.getMerchantPath() + "/payment_methods/all/expired_ids");
return new ResourceCollection<CreditCard>(new ExpiredCreditCardPager(this), response);
}
List<CreditCard> fetchExpiredCreditCards(List<String> ids) {
IdsSearchRequest query = new IdsSearchRequest().ids().in(ids);
NodeWrapper response = http.post(configuration.getMerchantPath() + "/payment_methods/all/expired", query);
List<CreditCard> items = new ArrayList<CreditCard>();
for (NodeWrapper node : response.findAll("credit-card")) {
items.add(new CreditCard(node));
}
return items;
}
/**
* Returns a {@link ResourceCollection} of all credit cards expiring between
* the given calendars.
*
* @return a {@link ResourceCollection}.
*/
public ResourceCollection<CreditCard> expiringBetween(Calendar start, Calendar end) {
String queryString = dateQueryString(start, end);
NodeWrapper response = http.post(configuration.getMerchantPath() + "/payment_methods/all/expiring_ids?" + queryString);
return new ResourceCollection<CreditCard>(new ExpiringCreditCardPager(this, queryString), response);
}
List<CreditCard> fetchExpiringCreditCards(List<String> ids, String queryString) {
IdsSearchRequest query = new IdsSearchRequest().ids().in(ids);
NodeWrapper response = http.post(configuration.getMerchantPath() + "/payment_methods/all/expiring?" + queryString, query);
List<CreditCard> items = new ArrayList<CreditCard>();
for (NodeWrapper node : response.findAll("credit-card")) {
items.add(new CreditCard(node));
}
return items;
}
private String dateQueryString(Calendar start, Calendar end) {
SimpleDateFormat dateFormat = new SimpleDateFormat("MMyyyy");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
String formattedStart = dateFormat.format(start.getTime());
String formattedEnd = dateFormat.format(end.getTime());
return String.format("start=%s&end=%s", formattedStart, formattedEnd);
}
}