KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > ofbiz > accounting > thirdparty > clearcommerce > CCPaymentServices


1 /*
2  * $Id: CCPaymentServices.java 5462 2005-08-05 18:35:48Z jonesde $
3  *
4  * Copyright (c) 2004 The Open For Business Project - www.ofbiz.org
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a
7  * copy of this software and associated documentation files (the "Software"),
8  * to deal in the Software without restriction, including without limitation
9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10  * and/or sell copies of the Software, and to permit persons to whom the
11  * Software is furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included
14  * in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
21  * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
22  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  */

24
25 package org.ofbiz.accounting.thirdparty.clearcommerce;
26
27 import java.util.Map JavaDoc;
28 import java.util.List JavaDoc;
29 import java.util.Iterator JavaDoc;
30 import java.util.ArrayList JavaDoc;
31 import java.text.DecimalFormat JavaDoc;
32 import java.io.OutputStream JavaDoc;
33 import java.io.ByteArrayOutputStream JavaDoc;
34 import java.io.IOException JavaDoc;
35
36 import javax.xml.parsers.ParserConfigurationException JavaDoc;
37
38 import org.ofbiz.base.util.*;
39 import org.ofbiz.entity.GenericValue;
40 import org.ofbiz.entity.GenericEntityException;
41 import org.ofbiz.service.DispatchContext;
42 import org.ofbiz.service.ServiceUtil;
43 import org.ofbiz.accounting.payment.PaymentGatewayServices;
44 import org.w3c.dom.Document JavaDoc;
45 import org.w3c.dom.Element JavaDoc;
46 import org.xml.sax.SAXException JavaDoc;
47 import org.apache.xml.serialize.XMLSerializer;
48 import org.apache.xml.serialize.OutputFormat;
49
50
51 /**
52  * ClearCommerce Payment Services (CCE 5.4)
53  *
54  * @author <a HREF="mailto:eckardjf@pobox.com">J. Eckard</a>
55  * @version $Rev: 5462 $
56  */

57 public class CCPaymentServices {
58
59     public final static String JavaDoc module = CCPaymentServices.class.getName();
60
61
62     public static Map JavaDoc ccAuth(DispatchContext dctx, Map JavaDoc context) {
63
64         Document JavaDoc authRequestDoc = buildPrimaryTxRequest(context, "PreAuth", (Double JavaDoc) context.get("processAmount"),
65                 (String JavaDoc) context.get("orderId"));
66
67         Document JavaDoc authResponseDoc = null;
68         try {
69             authResponseDoc = sendRequest(authRequestDoc, (String JavaDoc) context.get("paymentConfig"));
70         } catch (ClearCommerceException cce) {
71             return ServiceUtil.returnError(cce.getMessage());
72         }
73
74         if (getMessageListMaxSev(authResponseDoc) > 4) {
75             Map JavaDoc result = ServiceUtil.returnSuccess();
76             result.put("authResult", new Boolean JavaDoc(false));
77             result.put("processAmount", new Double JavaDoc(0.00));
78             result.put("authRefNum", getReferenceNum(authResponseDoc));
79             List JavaDoc messages = getMessageList(authResponseDoc);
80             if (UtilValidate.isNotEmpty(messages)) {
81                 result.put("internalRespMsgs", messages);
82             }
83             return result;
84         }
85
86         return processAuthResponse(authResponseDoc);
87     }
88
89     public static Map JavaDoc ccCredit(DispatchContext dctx, Map JavaDoc context) {
90
91         Document JavaDoc creditRequestDoc = buildPrimaryTxRequest(context, "Credit", (Double JavaDoc) context.get("creditAmount"),
92                 (String JavaDoc) context.get("referenceCode"));
93
94         Document JavaDoc creditResponseDoc = null;
95         try {
96             creditResponseDoc = sendRequest(creditRequestDoc, (String JavaDoc) context.get("paymentConfig"));
97         } catch (ClearCommerceException cce) {
98             return ServiceUtil.returnError(cce.getMessage());
99         }
100
101         if (getMessageListMaxSev(creditResponseDoc) > 4) {
102             Map JavaDoc result = ServiceUtil.returnSuccess();
103             result.put("creditResult", new Boolean JavaDoc(false));
104             result.put("creditAmount", new Double JavaDoc(0.00));
105             result.put("creditRefNum", getReferenceNum(creditResponseDoc));
106             List JavaDoc messages = getMessageList(creditResponseDoc);
107             if (UtilValidate.isNotEmpty(messages)) {
108                 result.put("internalRespMsgs", messages);
109             }
110             return result;
111         }
112
113         return processCreditResponse(creditResponseDoc);
114     }
115
116     public static Map JavaDoc ccCapture(DispatchContext dctx, Map JavaDoc context) {
117
118         GenericValue orderPaymentPreference = (GenericValue) context.get("orderPaymentPreference");
119         GenericValue authTransaction = PaymentGatewayServices.getAuthTransaction(orderPaymentPreference);
120         if (authTransaction == null) {
121             return ServiceUtil.returnError("No authorization transaction found; cannot capture");
122         }
123
124         Document JavaDoc captureRequestDoc = buildSecondaryTxRequest(context, authTransaction.getString("referenceNum"),
125                 "PostAuth", (Double JavaDoc) context.get("captureAmount"));
126
127         Document JavaDoc captureResponseDoc = null;
128         try {
129             captureResponseDoc = sendRequest(captureRequestDoc, (String JavaDoc) context.get("paymentConfig"));
130         } catch (ClearCommerceException cce) {
131             return ServiceUtil.returnError(cce.getMessage());
132         }
133
134         if (getMessageListMaxSev(captureResponseDoc) > 4) {
135             Map JavaDoc result = ServiceUtil.returnSuccess();
136             result.put("captureResult", new Boolean JavaDoc(false));
137             result.put("captureAmount", new Double JavaDoc(0.00));
138             result.put("captureRefNum", getReferenceNum(captureResponseDoc));
139             List JavaDoc messages = getMessageList(captureResponseDoc);
140             if (UtilValidate.isNotEmpty(messages)) {
141                 result.put("internalRespMsgs", messages);
142             }
143             return result;
144         }
145
146         return processCaptureResponse(captureResponseDoc);
147     }
148
149     public static Map JavaDoc ccRelease(DispatchContext dctx, Map JavaDoc context) {
150
151         GenericValue orderPaymentPreference = (GenericValue) context.get("orderPaymentPreference");
152         GenericValue authTransaction = PaymentGatewayServices.getAuthTransaction(orderPaymentPreference);
153         if (authTransaction == null) {
154             return ServiceUtil.returnError("No authorization transaction found; cannot release");
155         }
156
157         Document JavaDoc releaseRequestDoc = buildSecondaryTxRequest(context, authTransaction.getString("referenceNum"), "Void", null);
158
159         Document JavaDoc releaseResponseDoc = null;
160         try {
161             releaseResponseDoc = sendRequest(releaseRequestDoc, (String JavaDoc) context.get("paymentConfig"));
162         } catch (ClearCommerceException cce) {
163             return ServiceUtil.returnError(cce.getMessage());
164         }
165
166         if (getMessageListMaxSev(releaseResponseDoc) > 4) {
167             Map JavaDoc result = ServiceUtil.returnSuccess();
168             result.put("releaseResult", new Boolean JavaDoc(false));
169             result.put("releaseAmount", new Double JavaDoc(0.00));
170             result.put("releaseRefNum", getReferenceNum(releaseResponseDoc));
171             List JavaDoc messages = getMessageList(releaseResponseDoc);
172             if (UtilValidate.isNotEmpty(messages)) {
173                 result.put("internalRespMsgs", messages);
174             }
175             return result;
176         }
177
178         return processReleaseResponse(releaseResponseDoc);
179     }
180
181     public static Map JavaDoc ccReleaseNoop(DispatchContext dctx, Map JavaDoc context) {
182
183         GenericValue orderPaymentPreference = (GenericValue) context.get("orderPaymentPreference");
184         GenericValue authTransaction = PaymentGatewayServices.getAuthTransaction(orderPaymentPreference);
185         if (authTransaction == null) {
186             return ServiceUtil.returnError("No authorization transaction found; cannot release");
187         }
188
189         Map JavaDoc result = ServiceUtil.returnSuccess();
190         result.put("releaseResult", Boolean.valueOf(true));
191         result.put("releaseCode", authTransaction.getString("gatewayCode"));
192         result.put("releaseAmount", authTransaction.getDouble("amount"));
193         result.put("releaseRefNum", authTransaction.getString("referenceNum"));
194         result.put("releaseFlag", authTransaction.getString("gatewayFlag"));
195         result.put("releaseMessage", "Approved.");
196
197         return result;
198     }
199
200     public static Map JavaDoc ccRefund(DispatchContext dctx, Map JavaDoc context) {
201
202         GenericValue orderPaymentPreference = (GenericValue) context.get("orderPaymentPreference");
203         GenericValue authTransaction = PaymentGatewayServices.getAuthTransaction(orderPaymentPreference);
204         if (authTransaction == null) {
205             return ServiceUtil.returnError("No authorization transaction found; cannot refund");
206         }
207
208         // Although refunds are applied to captured transactions, using the auth reference number is ok here
209
// Related auth and capture transactions will always have the same reference number
210
Document JavaDoc refundRequestDoc = buildSecondaryTxRequest(context, authTransaction.getString("referenceNum"),
211                 "Credit", (Double JavaDoc) context.get("refundAmount"));
212
213         Document JavaDoc refundResponseDoc = null;
214         try {
215             refundResponseDoc = sendRequest(refundRequestDoc, (String JavaDoc) context.get("paymentConfig"));
216         } catch (ClearCommerceException cce) {
217             return ServiceUtil.returnError(cce.getMessage());
218         }
219
220         if (getMessageListMaxSev(refundResponseDoc) > 4) {
221             Map JavaDoc result = ServiceUtil.returnSuccess();
222             result.put("refundResult", new Boolean JavaDoc(false));
223             result.put("refundAmount", new Double JavaDoc(0.00));
224             result.put("refundRefNum", getReferenceNum(refundResponseDoc));
225             List JavaDoc messages = getMessageList(refundResponseDoc);
226             if (UtilValidate.isNotEmpty(messages)) {
227                 result.put("internalRespMsgs", messages);
228             }
229             return result;
230         }
231
232         return processRefundResponse(refundResponseDoc);
233     }
234
235     public static Map JavaDoc ccReAuth(DispatchContext dctx, Map JavaDoc context) {
236
237         GenericValue orderPaymentPreference = (GenericValue) context.get("orderPaymentPreference");
238         GenericValue authTransaction = PaymentGatewayServices.getAuthTransaction(orderPaymentPreference);
239         if (authTransaction == null) {
240             return ServiceUtil.returnError("No authorization transaction found; cannot re-auth.");
241         }
242
243         Document JavaDoc reauthRequestDoc = buildSecondaryTxRequest(context, authTransaction.getString("referenceNum"),
244                 "RePreAuth", (Double JavaDoc) context.get("reauthAmount"));
245
246         Document JavaDoc reauthResponseDoc = null;
247         try {
248             reauthResponseDoc = sendRequest(reauthRequestDoc, (String JavaDoc) context.get("paymentConfig"));
249         } catch (ClearCommerceException cce) {
250             return ServiceUtil.returnError(cce.getMessage());
251         }
252
253         if (getMessageListMaxSev(reauthResponseDoc) > 4) {
254             Map JavaDoc result = ServiceUtil.returnSuccess();
255             result.put("reauthResult", new Boolean JavaDoc(false));
256             result.put("reauthAmount", new Double JavaDoc(0.00));
257             result.put("reauthRefNum", getReferenceNum(reauthResponseDoc));
258             List JavaDoc messages = getMessageList(reauthResponseDoc);
259             if (UtilValidate.isNotEmpty(messages)) {
260                 result.put("internalRespMsgs", messages);
261             }
262             return result;
263         }
264
265         return processReAuthResponse(reauthResponseDoc);
266
267     }
268
269     private static Map JavaDoc processAuthResponse(Document JavaDoc responseDocument) {
270
271         Element JavaDoc engineDocElement = UtilXml.firstChildElement(responseDocument.getDocumentElement(), "EngineDoc");
272         Element JavaDoc orderFormElement = UtilXml.firstChildElement(engineDocElement, "OrderFormDoc");
273         Element JavaDoc transactionElement = UtilXml.firstChildElement(orderFormElement, "Transaction");
274         Element JavaDoc procResponseElement = UtilXml.firstChildElement(transactionElement, "CardProcResp");
275
276         Map JavaDoc result = ServiceUtil.returnSuccess();
277
278         String JavaDoc errorCode = UtilXml.childElementValue(procResponseElement, "CcErrCode");
279         if ("1".equals(errorCode)) {
280             result.put("authResult", Boolean.valueOf(true));
281             result.put("authCode", UtilXml.childElementValue(transactionElement, "AuthCode"));
282
283             Element JavaDoc currentTotalsElement = UtilXml.firstChildElement(transactionElement, "CurrentTotals");
284             Element JavaDoc totalsElement = UtilXml.firstChildElement(currentTotalsElement, "Totals");
285             String JavaDoc authAmountStr = UtilXml.childElementValue(totalsElement, "Total");
286             result.put("processAmount", new Double JavaDoc(Double.parseDouble(authAmountStr) / 100));
287         } else {
288             result.put("authResult", Boolean.valueOf(false));
289             result.put("processAmount", Double.valueOf("0.00"));
290         }
291
292         result.put("authRefNum", UtilXml.childElementValue(orderFormElement, "Id"));
293         result.put("authFlag", UtilXml.childElementValue(procResponseElement, "Status"));
294         result.put("authMessage", UtilXml.childElementValue(procResponseElement, "CcReturnMsg"));
295
296         // AVS
297
String JavaDoc avsCode = UtilXml.childElementValue(procResponseElement, "AvsDisplay");
298         if (UtilValidate.isNotEmpty(avsCode)) {
299             result.put("avsCode", avsCode);
300         }
301
302         // Fraud score
303
Element JavaDoc fraudInfoElement = UtilXml.firstChildElement(orderFormElement, "FraudInfo");
304         if (fraudInfoElement != null) {
305             result.put("scoreCode", UtilXml.childElementValue(fraudInfoElement, "TotalScore"));
306         }
307
308         List JavaDoc messages = getMessageList(responseDocument);
309         if (UtilValidate.isNotEmpty(messages)) {
310             result.put("internalRespMsgs", messages);
311         }
312         return result;
313     }
314
315     private static Map JavaDoc processCreditResponse(Document JavaDoc responseDocument) {
316
317         Element JavaDoc engineDocElement = UtilXml.firstChildElement(responseDocument.getDocumentElement(), "EngineDoc");
318         Element JavaDoc orderFormElement = UtilXml.firstChildElement(engineDocElement, "OrderFormDoc");
319         Element JavaDoc transactionElement = UtilXml.firstChildElement(orderFormElement, "Transaction");
320         Element JavaDoc procResponseElement = UtilXml.firstChildElement(transactionElement, "CardProcResp");
321
322         Map JavaDoc result = ServiceUtil.returnSuccess();
323
324         String JavaDoc errorCode = UtilXml.childElementValue(procResponseElement, "CcErrCode");
325         if ("1".equals(errorCode)) {
326             result.put("creditResult", Boolean.valueOf(true));
327             result.put("creditCode", UtilXml.childElementValue(transactionElement, "AuthCode"));
328
329             Element JavaDoc currentTotalsElement = UtilXml.firstChildElement(transactionElement, "CurrentTotals");
330             Element JavaDoc totalsElement = UtilXml.firstChildElement(currentTotalsElement, "Totals");
331             String JavaDoc creditAmountStr = UtilXml.childElementValue(totalsElement, "Total");
332             result.put("creditAmount", new Double JavaDoc(Double.parseDouble(creditAmountStr) / 100));
333         } else {
334             result.put("creditResult", Boolean.valueOf(false));
335             result.put("creditAmount", Double.valueOf("0.00"));
336         }
337
338         result.put("creditRefNum", UtilXml.childElementValue(orderFormElement, "Id"));
339         result.put("creditFlag", UtilXml.childElementValue(procResponseElement, "Status"));
340         result.put("creditMessage", UtilXml.childElementValue(procResponseElement, "CcReturnMsg"));
341
342         List JavaDoc messages = getMessageList(responseDocument);
343         if (UtilValidate.isNotEmpty(messages)) {
344             result.put("internalRespMsgs", messages);
345         }
346         return result;
347     }
348
349     private static Map JavaDoc processCaptureResponse(Document JavaDoc responseDocument) {
350
351         Element JavaDoc engineDocElement = UtilXml.firstChildElement(responseDocument.getDocumentElement(), "EngineDoc");
352         Element JavaDoc orderFormElement = UtilXml.firstChildElement(engineDocElement, "OrderFormDoc");
353         Element JavaDoc transactionElement = UtilXml.firstChildElement(orderFormElement, "Transaction");
354         Element JavaDoc procResponseElement = UtilXml.firstChildElement(transactionElement, "CardProcResp");
355
356         Map JavaDoc result = ServiceUtil.returnSuccess();
357
358         String JavaDoc errorCode = UtilXml.childElementValue(procResponseElement, "CcErrCode");
359         if ("1".equals(errorCode)) {
360             result.put("captureResult", Boolean.valueOf(true));
361             result.put("captureCode", UtilXml.childElementValue(transactionElement, "AuthCode"));
362
363             Element JavaDoc currentTotalsElement = UtilXml.firstChildElement(transactionElement, "CurrentTotals");
364             Element JavaDoc totalsElement = UtilXml.firstChildElement(currentTotalsElement, "Totals");
365             String JavaDoc captureAmountStr = UtilXml.childElementValue(totalsElement, "Total");
366             result.put("captureAmount", new Double JavaDoc(Double.parseDouble(captureAmountStr) / 100));
367         } else {
368             result.put("captureResult", Boolean.valueOf(false));
369             result.put("captureAmount", Double.valueOf("0.00"));
370         }
371
372         result.put("captureRefNum", UtilXml.childElementValue(orderFormElement, "Id"));
373         result.put("captureFlag", UtilXml.childElementValue(procResponseElement, "Status"));
374         result.put("captureMessage", UtilXml.childElementValue(procResponseElement, "CcReturnMsg"));
375
376         List JavaDoc messages = getMessageList(responseDocument);
377         if (UtilValidate.isNotEmpty(messages)) {
378             result.put("internalRespMsgs", messages);
379         }
380         return result;
381     }
382
383     private static Map JavaDoc processReleaseResponse(Document JavaDoc responseDocument) {
384
385         Element JavaDoc engineDocElement = UtilXml.firstChildElement(responseDocument.getDocumentElement(), "EngineDoc");
386         Element JavaDoc orderFormElement = UtilXml.firstChildElement(engineDocElement, "OrderFormDoc");
387         Element JavaDoc transactionElement = UtilXml.firstChildElement(orderFormElement, "Transaction");
388         Element JavaDoc procResponseElement = UtilXml.firstChildElement(transactionElement, "CardProcResp");
389
390         Map JavaDoc result = ServiceUtil.returnSuccess();
391
392         String JavaDoc errorCode = UtilXml.childElementValue(procResponseElement, "CcErrCode");
393         if ("1".equals(errorCode)) {
394             result.put("releaseResult", Boolean.valueOf(true));
395             result.put("releaseCode", UtilXml.childElementValue(transactionElement, "AuthCode"));
396
397             Element JavaDoc currentTotalsElement = UtilXml.firstChildElement(transactionElement, "CurrentTotals");
398             Element JavaDoc totalsElement = UtilXml.firstChildElement(currentTotalsElement, "Totals");
399             String JavaDoc releaseAmountStr = UtilXml.childElementValue(totalsElement, "Total");
400             result.put("releaseAmount", new Double JavaDoc(Double.parseDouble(releaseAmountStr) / 100));
401         } else {
402             result.put("releaseResult", Boolean.valueOf(false));
403             result.put("releaseAmount", Double.valueOf("0.00"));
404         }
405
406         result.put("releaseRefNum", UtilXml.childElementValue(orderFormElement, "Id"));
407         result.put("releaseFlag", UtilXml.childElementValue(procResponseElement, "Status"));
408         result.put("releaseMessage", UtilXml.childElementValue(procResponseElement, "CcReturnMsg"));
409
410         List JavaDoc messages = getMessageList(responseDocument);
411         if (UtilValidate.isNotEmpty(messages)) {
412             result.put("internalRespMsgs", messages);
413         }
414         return result;
415     }
416
417     private static Map JavaDoc processRefundResponse(Document JavaDoc responseDocument) {
418
419         Element JavaDoc engineDocElement = UtilXml.firstChildElement(responseDocument.getDocumentElement(), "EngineDoc");
420         Element JavaDoc orderFormElement = UtilXml.firstChildElement(engineDocElement, "OrderFormDoc");
421         Element JavaDoc transactionElement = UtilXml.firstChildElement(orderFormElement, "Transaction");
422         Element JavaDoc procResponseElement = UtilXml.firstChildElement(transactionElement, "CardProcResp");
423
424         Map JavaDoc result = ServiceUtil.returnSuccess();
425
426         String JavaDoc errorCode = UtilXml.childElementValue(procResponseElement, "CcErrCode");
427         if ("1".equals(errorCode)) {
428             result.put("refundResult", Boolean.valueOf(true));
429             result.put("refundCode", UtilXml.childElementValue(transactionElement, "AuthCode"));
430
431             Element JavaDoc currentTotalsElement = UtilXml.firstChildElement(transactionElement, "CurrentTotals");
432             Element JavaDoc totalsElement = UtilXml.firstChildElement(currentTotalsElement, "Totals");
433             String JavaDoc refundAmountStr = UtilXml.childElementValue(totalsElement, "Total");
434             result.put("refundAmount", new Double JavaDoc(Double.parseDouble(refundAmountStr) / 100));
435         } else {
436             result.put("refundResult", Boolean.valueOf(false));
437             result.put("refundAmount", Double.valueOf("0.00"));
438         }
439
440         result.put("refundRefNum", UtilXml.childElementValue(orderFormElement, "Id"));
441         result.put("refundFlag", UtilXml.childElementValue(procResponseElement, "Status"));
442         result.put("refundMessage", UtilXml.childElementValue(procResponseElement, "CcReturnMsg"));
443
444         List JavaDoc messages = getMessageList(responseDocument);
445         if (UtilValidate.isNotEmpty(messages)) {
446             result.put("internalRespMsgs", messages);
447         }
448         return result;
449     }
450
451     private static Map JavaDoc processReAuthResponse(Document JavaDoc responseDocument) {
452
453         Element JavaDoc engineDocElement = UtilXml.firstChildElement(responseDocument.getDocumentElement(), "EngineDoc");
454         Element JavaDoc orderFormElement = UtilXml.firstChildElement(engineDocElement, "OrderFormDoc");
455         Element JavaDoc transactionElement = UtilXml.firstChildElement(orderFormElement, "Transaction");
456         Element JavaDoc procResponseElement = UtilXml.firstChildElement(transactionElement, "CardProcResp");
457
458         Map JavaDoc result = ServiceUtil.returnSuccess();
459
460         String JavaDoc errorCode = UtilXml.childElementValue(procResponseElement, "CcErrCode");
461         if ("1".equals(errorCode)) {
462             result.put("reauthResult", Boolean.valueOf(true));
463             result.put("reauthCode", UtilXml.childElementValue(transactionElement, "AuthCode"));
464
465             Element JavaDoc currentTotalsElement = UtilXml.firstChildElement(transactionElement, "CurrentTotals");
466             Element JavaDoc totalsElement = UtilXml.firstChildElement(currentTotalsElement, "Totals");
467             String JavaDoc reauthAmountStr = UtilXml.childElementValue(totalsElement, "Total");
468             result.put("reauthAmount", new Double JavaDoc(Double.parseDouble(reauthAmountStr) / 100));
469         } else {
470             result.put("reauthResult", Boolean.valueOf(false));
471             result.put("reauthAmount", Double.valueOf("0.00"));
472         }
473
474         result.put("reauthRefNum", UtilXml.childElementValue(orderFormElement, "Id"));
475         result.put("reauthFlag", UtilXml.childElementValue(procResponseElement, "Status"));
476         result.put("reauthMessage", UtilXml.childElementValue(procResponseElement, "CcReturnMsg"));
477
478         List JavaDoc messages = getMessageList(responseDocument);
479         if (UtilValidate.isNotEmpty(messages)) {
480             result.put("internalRespMsgs", messages);
481         }
482         return result;
483     }
484
485     private static List JavaDoc getMessageList(Document JavaDoc responseDocument) {
486
487         List JavaDoc messageList = new ArrayList JavaDoc();
488
489         Element JavaDoc engineDocElement = UtilXml.firstChildElement(responseDocument.getDocumentElement(), "EngineDoc");
490         Element JavaDoc messageListElement = UtilXml.firstChildElement(engineDocElement, "MessageList");
491         List JavaDoc messageElementList = UtilXml.childElementList(messageListElement, "Message");
492         if (UtilValidate.isNotEmpty(messageElementList)) {
493             for (Iterator JavaDoc i = messageElementList.iterator(); i.hasNext();) {
494                 Element JavaDoc messageElement = (Element JavaDoc) i.next();
495                 int severity = 0;
496                 try {
497                     severity = Integer.parseInt(UtilXml.childElementValue(messageElement, "Sev"));
498                 } catch (NumberFormatException JavaDoc nfe) {
499                     Debug.logError("Error parsing message severity: " + nfe.getMessage(), module);
500                     severity = 9;
501                 }
502                 String JavaDoc message = "[" + UtilXml.childElementValue(messageElement, "Audience") + "] " +
503                         UtilXml.childElementValue(messageElement, "Text") + " (" + severity + ")";
504                 messageList.add(message);
505             }
506         }
507
508         return messageList;
509     }
510
511     private static int getMessageListMaxSev(Document JavaDoc responseDocument) {
512
513         int maxSev = 0;
514
515         Element JavaDoc engineDocElement = UtilXml.firstChildElement(responseDocument.getDocumentElement(), "EngineDoc");
516         Element JavaDoc messageListElement = UtilXml.firstChildElement(engineDocElement, "MessageList");
517         String JavaDoc maxSevStr = UtilXml.childElementValue(messageListElement, "MaxSev");
518         if (UtilValidate.isNotEmpty(maxSevStr)) {
519             try {
520                 maxSev = Integer.parseInt(maxSevStr);
521             } catch (NumberFormatException JavaDoc nfe) {
522                 Debug.logError("Error parsing MaxSev: " + nfe.getMessage(), module);
523                 maxSev = 9;
524             }
525         }
526         return maxSev;
527     }
528
529     private static String JavaDoc getReferenceNum(Document JavaDoc responseDocument) {
530         String JavaDoc referenceNum = null;
531         Element JavaDoc engineDocElement = UtilXml.firstChildElement(responseDocument.getDocumentElement(), "EngineDoc");
532         if (engineDocElement != null) {
533             Element JavaDoc orderFormElement = UtilXml.firstChildElement(engineDocElement, "OrderFormDoc");
534             if (orderFormElement != null) {
535                 referenceNum = UtilXml.childElementValue(orderFormElement, "Id");
536             }
537         }
538         return referenceNum;
539     }
540
541     private static Document JavaDoc buildPrimaryTxRequest(Map JavaDoc context, String JavaDoc type, Double JavaDoc amount, String JavaDoc refNum) {
542
543         String JavaDoc paymentConfig = (String JavaDoc) context.get("paymentConfig");
544         if (UtilValidate.isEmpty(paymentConfig)) {
545             paymentConfig = "payment.properties";
546         }
547
548         Document JavaDoc requestDocument = createRequestDocument(paymentConfig);
549
550         Element JavaDoc engineDocElement = UtilXml.firstChildElement(requestDocument.getDocumentElement(), "EngineDoc");
551         Element JavaDoc orderFormDocElement = UtilXml.firstChildElement(engineDocElement, "OrderFormDoc");
552
553         // add the reference number as a comment
554
UtilXml.addChildElementValue(orderFormDocElement, "Comments", refNum, requestDocument);
555
556         Element JavaDoc consumerElement = UtilXml.addChildElement(orderFormDocElement, "Consumer", requestDocument);
557
558         // email address
559
GenericValue billToEmail = (GenericValue) context.get("billToEmail");
560         if (billToEmail != null) {
561             UtilXml.addChildElementValue(consumerElement, "Email", billToEmail.getString("infoString"), requestDocument);
562         }
563
564         // payment mech
565
GenericValue creditCard = (GenericValue) context.get("creditCard");
566
567         boolean enableCVM = UtilProperties.propertyValueEqualsIgnoreCase(paymentConfig, "payment.clearcommerce.enableCVM", "Y");
568         String JavaDoc cardSecurityCode = enableCVM ? (String JavaDoc) context.get("cardSecurityCode") : null;
569
570         // Default to locale code 840 (United States)
571
String JavaDoc localCode = UtilProperties.getPropertyValue(paymentConfig, "payment.clearcommerce.localeCode", "840");
572
573         appendPaymentMechNode(consumerElement, creditCard, cardSecurityCode, localCode);
574
575         // billing address
576
GenericValue billingAddress = (GenericValue) context.get("billingAddress");
577         if (billingAddress != null) {
578             Element JavaDoc billToElement = UtilXml.addChildElement(consumerElement, "BillTo", requestDocument);
579             Element JavaDoc billToLocationElement = UtilXml.addChildElement(billToElement, "Location", requestDocument);
580             appendAddressNode(billToLocationElement, billingAddress);
581         }
582
583         // shipping address
584
GenericValue shippingAddress = (GenericValue) context.get("shippingAddress");
585         if (shippingAddress != null) {
586             Element JavaDoc shipToElement = UtilXml.addChildElement(consumerElement, "ShipTo", requestDocument);
587             Element JavaDoc shipToLocationElement = UtilXml.addChildElement(shipToElement, "Location", requestDocument);
588             appendAddressNode(shipToLocationElement, shippingAddress);
589         }
590
591         // Default to currency code 840 (USD)
592
String JavaDoc currencyCode = UtilProperties.getPropertyValue(paymentConfig, "payment.clearcommerce.currencyCode", "840");
593
594         // transaction
595
appendTransactionNode(orderFormDocElement, type, amount, currencyCode);
596
597         // TODO: determine if adding OrderItemList is worthwhile - JFE 2004.02.14
598

599         return requestDocument;
600     }
601
602     private static Document JavaDoc buildSecondaryTxRequest(Map JavaDoc context, String JavaDoc id, String JavaDoc type, Double JavaDoc amount) {
603
604         String JavaDoc paymentConfig = (String JavaDoc) context.get("paymentConfig");
605         if (UtilValidate.isEmpty(paymentConfig)) {
606             paymentConfig = "payment.properties";
607         }
608
609         Document JavaDoc requestDocument = createRequestDocument(paymentConfig);
610
611         Element JavaDoc engineDocElement = UtilXml.firstChildElement(requestDocument.getDocumentElement(), "EngineDoc");
612         Element JavaDoc orderFormDocElement = UtilXml.firstChildElement(engineDocElement, "OrderFormDoc");
613         UtilXml.addChildElementValue(orderFormDocElement, "Id", id, requestDocument);
614
615         // Default to currency code 840 (USD)
616
String JavaDoc currencyCode = UtilProperties.getPropertyValue(paymentConfig, "payment.clearcommerce.currencyCode", "840");
617
618         appendTransactionNode(orderFormDocElement, type, amount, currencyCode);
619
620         return requestDocument;
621     }
622
623     private static void appendPaymentMechNode(Element JavaDoc element, GenericValue creditCard, String JavaDoc cardSecurityCode, String JavaDoc localeCode) {
624
625         Document JavaDoc document = element.getOwnerDocument();
626
627         Element JavaDoc paymentMechElement = UtilXml.addChildElement(element, "PaymentMech", document);
628         Element JavaDoc creditCardElement = UtilXml.addChildElement(paymentMechElement, "CreditCard", document);
629
630         UtilXml.addChildElementValue(creditCardElement, "Number", creditCard.getString("cardNumber"), document);
631
632         String JavaDoc expDate = creditCard.getString("expireDate");
633         Element JavaDoc expiresElement = UtilXml.addChildElementValue(creditCardElement, "Expires",
634                 expDate.substring(0, 3) + expDate.substring(5), document);
635         expiresElement.setAttribute("DataType", "ExpirationDate");
636         expiresElement.setAttribute("Locale", localeCode);
637
638         if (UtilValidate.isNotEmpty(cardSecurityCode)) {
639             // Cvv2Val must be exactly 4 characters
640
if (cardSecurityCode.length() < 4) {
641                 while (cardSecurityCode.length() < 4) {
642                     cardSecurityCode = cardSecurityCode + " ";
643                 }
644             } else if (cardSecurityCode.length() > 4) {
645                 cardSecurityCode = cardSecurityCode.substring(0, 4);
646             }
647             UtilXml.addChildElementValue(creditCardElement, "Cvv2Val", cardSecurityCode, document);
648             UtilXml.addChildElementValue(creditCardElement, "Cvv2Indicator", "1", document);
649         }
650     }
651
652     private static void appendAddressNode(Element JavaDoc element, GenericValue address) {
653
654         Document JavaDoc document = element.getOwnerDocument();
655
656         Element JavaDoc addressElement = UtilXml.addChildElement(element, "Address", document);
657
658         UtilXml.addChildElementValue(addressElement, "Name", address.getString("toName"), document);
659         UtilXml.addChildElementValue(addressElement, "Street1", address.getString("address1"), document);
660         UtilXml.addChildElementValue(addressElement, "Street2", address.getString("address2"), document);
661         UtilXml.addChildElementValue(addressElement, "City", address.getString("city"), document);
662         UtilXml.addChildElementValue(addressElement, "StateProv", address.getString("stateProvinceGeoId"), document);
663         UtilXml.addChildElementValue(addressElement, "PostalCode", address.getString("postalCode"), document);
664
665         String JavaDoc countryGeoId = address.getString("countryGeoId");
666         if (UtilValidate.isNotEmpty(countryGeoId)) {
667             try {
668                 GenericValue countryGeo = address.getRelatedOneCache("CountryGeo");
669                 UtilXml.addChildElementValue(addressElement, "Country", countryGeo.getString("geoSecCode"), document);
670             } catch (GenericEntityException gee) {
671                 Debug.log(gee, "Error finding related Geo for countryGeoId: " + countryGeoId, module);
672             }
673         }
674     }
675
676     private static void appendTransactionNode(Element JavaDoc element, String JavaDoc type, Double JavaDoc amount, String JavaDoc currencyCode) {
677
678         Document JavaDoc document = element.getOwnerDocument();
679
680         Element JavaDoc transactionElement = UtilXml.addChildElement(element, "Transaction", document);
681         UtilXml.addChildElementValue(transactionElement, "Type", type, document);
682
683         // Some transactions will not have an amount (release, reAuth)
684
if (amount != null) {
685             Element JavaDoc currentTotalsElement = UtilXml.addChildElement(transactionElement, "CurrentTotals", document);
686             Element JavaDoc totalsElement = UtilXml.addChildElement(currentTotalsElement, "Totals", document);
687
688             // DecimalFormat("#") is used here in case the total is something like 9.9999999...
689
// in that case, we want to send 999, not 999.9999999...
690
String JavaDoc totalString = new DecimalFormat JavaDoc("#").format(amount.doubleValue() * 100);
691
692             Element JavaDoc totalElement = UtilXml.addChildElementValue(totalsElement, "Total", totalString, document);
693             totalElement.setAttribute("DataType", "Money");
694             totalElement.setAttribute("Currency", currencyCode);
695         }
696     }
697
698     private static Document JavaDoc createRequestDocument(String JavaDoc paymentConfig) {
699
700         // EngineDocList
701
Document JavaDoc requestDocument = UtilXml.makeEmptyXmlDocument("EngineDocList");
702         Element JavaDoc engineDocListElement = requestDocument.getDocumentElement();
703         UtilXml.addChildElementValue(engineDocListElement, "DocVersion", "1.0", requestDocument);
704
705         // EngineDocList.EngineDoc
706
Element JavaDoc engineDocElement = UtilXml.addChildElement(engineDocListElement, "EngineDoc", requestDocument);
707         UtilXml.addChildElementValue(engineDocElement, "ContentType", "OrderFormDoc", requestDocument);
708
709         String JavaDoc sourceId = UtilProperties.getPropertyValue(paymentConfig, "payment.clearcommerce.sourceId");
710         if (UtilValidate.isNotEmpty(sourceId)) {
711             UtilXml.addChildElementValue(engineDocElement, "SourceId", sourceId, requestDocument);
712         }
713
714         String JavaDoc groupId = UtilProperties.getPropertyValue(paymentConfig, "payment.clearcommerce.groupId");
715         if (UtilValidate.isNotEmpty(groupId)) {
716             UtilXml.addChildElementValue(engineDocElement, "GroupId", groupId, requestDocument);
717         }
718
719         // EngineDocList.EngineDoc.User
720
Element JavaDoc userElement = UtilXml.addChildElement(engineDocElement, "User", requestDocument);
721         UtilXml.addChildElementValue(userElement, "Name",
722                 UtilProperties.getPropertyValue(paymentConfig, "payment.clearcommerce.username", ""), requestDocument);
723         UtilXml.addChildElementValue(userElement, "Password",
724                 UtilProperties.getPropertyValue(paymentConfig, "payment.clearcommerce.password", ""), requestDocument);
725         UtilXml.addChildElementValue(userElement, "Alias",
726                 UtilProperties.getPropertyValue(paymentConfig, "payment.clearcommerce.alias", ""), requestDocument);
727
728         String JavaDoc effectiveAlias = UtilProperties.getPropertyValue(paymentConfig, "payment.clearcommerce.effectiveAlias");
729         if (UtilValidate.isNotEmpty(effectiveAlias)) {
730             UtilXml.addChildElementValue(userElement, "EffectiveAlias", effectiveAlias, requestDocument);
731         }
732
733         // EngineDocList.EngineDoc.Instructions
734
Element JavaDoc instructionsElement = UtilXml.addChildElement(engineDocElement, "Instructions", requestDocument);
735
736         String JavaDoc pipeline = "PaymentNoFraud";
737         if (UtilProperties.propertyValueEqualsIgnoreCase(paymentConfig, "payment.clearcommerce.enableFraudShield", "Y")) {
738             pipeline = "Payment";
739         }
740         UtilXml.addChildElementValue(instructionsElement, "Pipeline", pipeline, requestDocument);
741
742         // EngineDocList.EngineDoc.OrderFormDoc
743
Element JavaDoc orderFormDocElement = UtilXml.addChildElement(engineDocElement, "OrderFormDoc", requestDocument);
744
745         // default to "P" for Production Mode
746
String JavaDoc mode = UtilProperties.getPropertyValue(paymentConfig, "payment.clearcommerce.processMode", "P");
747         UtilXml.addChildElementValue(orderFormDocElement, "Mode", mode, requestDocument);
748
749         return requestDocument;
750     }
751
752     private static Document JavaDoc sendRequest(Document JavaDoc requestDocument, String JavaDoc paymentConfig) throws ClearCommerceException {
753
754         if (UtilValidate.isEmpty(paymentConfig)) {
755             paymentConfig = "payment.properties";
756         }
757
758         String JavaDoc serverURL = UtilProperties.getPropertyValue(paymentConfig, "payment.clearcommerce.serverURL");
759         if (UtilValidate.isEmpty(serverURL)) {
760             throw new ClearCommerceException("Missing server URL; check your ClearCommerce configuration");
761         }
762         if (Debug.verboseOn()) {
763             Debug.logVerbose("ClearCommerce server URL: " + serverURL, module);
764         }
765
766         OutputStream JavaDoc os = new ByteArrayOutputStream JavaDoc();
767
768         OutputFormat format = new OutputFormat();
769         format.setOmitDocumentType(true);
770         format.setOmitXMLDeclaration(true);
771         format.setIndenting(false);
772
773         XMLSerializer serializer = new XMLSerializer(os, format);
774         try {
775             serializer.asDOMSerializer();
776             serializer.serialize(requestDocument.getDocumentElement());
777         } catch (IOException JavaDoc ioe) {
778             throw new ClearCommerceException("Error serializing requestDocument: " + ioe.getMessage());
779         }
780
781         String JavaDoc xmlString = os.toString();
782
783         if (Debug.verboseOn()) {
784             Debug.logVerbose("ClearCommerce XML request string: " + xmlString, module);
785         }
786
787         HttpClient http = new HttpClient(serverURL);
788         http.setParameter("CLRCMRC_XML", xmlString);
789
790         String JavaDoc response = null;
791         try {
792             response = http.post();
793         } catch (HttpClientException hce) {
794             Debug.log(hce, module);
795             throw new ClearCommerceException("ClearCommerce connection problem", hce);
796         }
797
798         // Note: if Debug.verboseOn(), HttpClient will log this...
799
//if (Debug.verboseOn()) {
800
// Debug.logVerbose("ClearCommerce response: " + response, module);
801
//}
802

803         Document JavaDoc responseDocument = null;
804         try {
805             responseDocument = UtilXml.readXmlDocument(response, false);
806         } catch (SAXException JavaDoc se) {
807             throw new ClearCommerceException("Error reading response Document from a String: " + se.getMessage());
808         } catch (ParserConfigurationException JavaDoc pce) {
809             throw new ClearCommerceException("Error reading response Document from a String: " + pce.getMessage());
810         } catch (IOException JavaDoc ioe) {
811             throw new ClearCommerceException("Error reading response Document from a String: " + ioe.getMessage());
812         }
813
814         return responseDocument;
815     }
816
817 }
818
819 class ClearCommerceException extends GeneralException {
820
821     ClearCommerceException() {
822         super();
823     }
824
825
826     ClearCommerceException(String JavaDoc msg) {
827         super(msg);
828     }
829
830
831     ClearCommerceException(Throwable JavaDoc t) {
832         super(t);
833     }
834
835
836     ClearCommerceException(String JavaDoc msg, Throwable JavaDoc t) {
837         super(msg, t);
838     }
839 }
840
841
Popular Tags