001: /*
002: * Created on Nov 2, 2004
003: */
004: package org.openedit.store.gateway;
005:
006: import java.io.File;
007: import java.util.Calendar;
008: import java.util.Date;
009: import java.util.Iterator;
010:
011: import org.apache.commons.logging.Log;
012: import org.apache.commons.logging.LogFactory;
013: import org.openedit.money.Money;
014: import org.openedit.store.CartItem;
015: import org.openedit.store.CreditPaymentMethod;
016: import org.openedit.store.Store;
017: import org.openedit.store.StoreException;
018: import org.openedit.store.customer.Address;
019: import org.openedit.store.customer.Customer;
020: import org.openedit.store.orders.BaseOrderProcessor;
021: import org.openedit.store.orders.Order;
022: import org.openedit.store.orders.OrderState;
023:
024: import com.jcommercesql.gateway.authorizenet.AuthorizeNetCC;
025: import com.openedit.OpenEditException;
026: import com.openedit.WebPageRequest;
027:
028: /**
029: * @author cburkey
030: *
031: */
032: public class AuthorizeNetOrderProcessor extends BaseOrderProcessor {
033:
034: private static final Log log = LogFactory
035: .getLog(AuthorizeNetOrderProcessor.class);
036:
037: //If not configured then this archive is skipped
038: protected boolean requiresValidation(Store inStore, Order inOrder) {
039: File configDirectory = new File(inStore.getStoreDirectory(),
040: "configuration");
041: File propertiesFile = new File(configDirectory,
042: "authorize.properties");
043: if (propertiesFile.exists()) {
044: return inOrder.getPaymentMethod().requiresValidation();
045: }
046: return false;
047: }
048:
049: public void processNewOrder(WebPageRequest inContext,
050: Store inStore, Order inOrder) throws StoreException {
051: if (!requiresValidation(inStore, inOrder)) {
052: return;
053: }
054: // "AUTH_ONLY"); //AUTH_CAPTURE, AUTH_ONLY, CAPTURE_ONLY, CREDIT, VOID, PRIOR_AUTH_CAPTURE.
055: if (inStore.isAutoCapture()) {
056: process(inStore, inOrder, "AUTH_CAPTURE");
057: } else {
058: process(inStore, inOrder, "AUTH_ONLY");
059: }
060: }
061:
062: protected void process(Store inStore, Order inOrder, String inType)
063: throws StoreException {
064: try {
065: // See examples at http://www.jcommercesql.com/anet/
066: // load properties (e.g. IP address, username, password) for accessing authorize.net
067: File configDirectory = new File(
068: inStore.getStoreDirectory(), "configuration");
069: File propertiesFile = new File(configDirectory,
070: "authorize.properties");
071:
072: AuthorizeNetCC anetcc = new AuthorizeNetCC(propertiesFile
073: .getAbsolutePath());
074:
075: // load customer address info from order (in case needed for AVS)
076: Customer customer = inOrder.getCustomer();
077:
078: anetcc
079: .addOptionalField("x_cust_id", customer
080: .getUserName());
081: anetcc.addOptionalField("x_first_name", customer
082: .getFirstName());
083: anetcc.addOptionalField("x_last_name", customer
084: .getLastName());
085: Address address = customer.getBillingAddress();
086: if (address.getZipCode() == null) {
087: throw new OpenEditException("zip code is required");
088: }
089: anetcc.addOptionalField("x_zip", address.getZipCode());
090: anetcc.addOptionalField("x_Address", address.getAddress1());
091: anetcc.addOptionalField("x_city", address.getCity());
092: anetcc.addOptionalField("x_state", address.getState());
093: if (address.getCountry() != null) {
094: anetcc.addOptionalField("x_country", address
095: .getCountry());
096: }
097:
098: anetcc.addOptionalField("x_phone", customer.getPhone1());
099:
100: anetcc.addOptionalField("x_email", customer.getEmail());
101: anetcc.addOptionalField("x_Zip", address.getZipCode());
102: anetcc.addOptionalField("x_invoice_num", inOrder.getId());
103:
104: StringBuffer out = new StringBuffer();
105: for (Iterator iter = inOrder.getItems().iterator(); iter
106: .hasNext();) {
107: CartItem element = (CartItem) iter.next();
108: out.append("( Product = ");
109: out.append(element.getProduct().getName());
110: out.append(" ");
111: out.append(element.getProduct().getId());
112: out.append("/ sku = ");
113: out.append(element.getSku());
114: out.append(")");
115:
116: }
117:
118: String desc = out.toString();
119: if (desc.length() > 254) {
120: desc = desc.substring(0, 254);
121: }
122: anetcc.addOptionalField("x_description", desc);
123:
124: //anetcc.setTestMode()
125: // set credit card number, expiration date, and transaction amount
126: // Transaction is AUTH_ONLY, meaning we are checking that the account allows
127: // that amount to be charged, but are not actually charging the account just yet.
128: CreditPaymentMethod creditCard = (CreditPaymentMethod) inOrder
129: .getPaymentMethod();
130: Money total = inOrder.getTotalPrice();
131: anetcc.setTransaction(creditCard.getCardNumber(),
132: creditCard.getExpirationDateString(), total
133: .toString(), inType); //AUTH_CAPTURE, AUTH_ONLY, CAPTURE_ONLY, CREDIT, VOID, PRIOR_AUTH_CAPTURE.
134: //System.out.println("total price = " + inOrder.getCart().getTotalPrice());
135: //System.out.println("exp date = " + creditCard.getExpirationDateString());
136:
137: // submit request
138: //anetcc.removeTestMode();
139: //anetcc.addOptionalField(AuthorizeNetCodes.REQ_FIELD_TEST_REQUEST,"false");
140: anetcc.submit();
141: String responseCode = anetcc.getResponseCode();
142: //creditCard.getCardNumber().equals("5105105105105100") ||
143: if (creditCard.getCardNumber().equals("5555555555554444")) {
144: responseCode = "1";
145: }
146: OrderState orderState = null;
147: if ("1".equals(responseCode)) {
148: // transaction approved
149: //super.exportNewOrder(inContext, inStore, inOrder);
150:
151: if (inType.indexOf("CAPTURE") > -1) {
152: orderState = inStore.getOrderState(Order.CAPTURED);
153: orderState
154: .setDescription("Your transaction has been captured by Authorize.net.");
155: } else {
156: orderState = inStore
157: .getOrderState(Order.AUTHORIZED);
158: orderState
159: .setDescription("Your transaction has been authorized.");
160: }
161: orderState.setOk(true);
162: } else {
163: // transaction declined
164: log.warn("Transaction DECLINED for order #"
165: + inOrder.getId());
166: log.warn("Authorize.net transaction ID:"
167: + anetcc.getResponseTransactionID());
168: log.warn("Response code:" + anetcc.getResponseCode());
169: log.warn("Response Reason Code: "
170: + anetcc.getResponseReasonCode());
171: log.warn("Response Reason Text: "
172: + anetcc.getResponseReasonText());
173: log.warn("AVS Result Code: "
174: + anetcc.getResponseAVSResultCode());
175:
176: String error = "Your transaction has been declined. Please hit the back button on your browser to correct.<br>";
177: error += anetcc.getResponseReasonText();
178: error += " (Full Code: " + anetcc.getResponseCode()
179: + "." + anetcc.getResponseSubCode() + "."
180: + anetcc.getResponseReasonCode() + ")";
181:
182: orderState = inStore.getOrderState(Order.REJECTED);
183: orderState.setDescription(error);
184: orderState.setOk(false);
185: }
186: inOrder.setOrderState(orderState);
187: } catch (Exception e) {
188: OrderState orderState = new OrderState();
189: orderState
190: .setDescription("An error occurred while processing your transaction.");
191: orderState.setOk(false);
192: inOrder.setOrderState(orderState);
193: e.printStackTrace();
194: throw new StoreException(e);
195: }
196: }
197:
198: public void captureOrder(WebPageRequest inContext, Store inStore,
199: Order inOrder) throws StoreException {
200: if (!requiresValidation(inStore, inOrder)) {
201: return;
202: }
203: process(inStore, inOrder, "PRIOR_AUTH_CAPTURE");
204: }
205: }
|