📄 paymentgatewayservices.java
字号:
if (processorResult != null) {
// check for errors from the processor implementation
String resultResponseCode = (String) processorResult.get(ModelService.RESPONSE_MESSAGE);
if (resultResponseCode != null && resultResponseCode.equals(ModelService.RESPOND_ERROR)) {
Debug.logError("Processor failed; will retry later : " + processorResult.get(ModelService.ERROR_MESSAGE), module);
return null;
}
// pass the payTo partyId to the result processor; we just add it to the result context.
String payToPartyId = getPayToPartyId(orh.getOrderHeader());
processorResult.put("payToPartyId", payToPartyId);
// add paymentSettings to result; for use by later processors
processorResult.put("paymentSettings", paymentSettings);
}
return processorResult;
}
private static GenericValue getPaymentSettings(GenericValue orderHeader, GenericValue paymentPreference, String paymentServiceType, boolean anyServiceType) {
GenericDelegator delegator = orderHeader.getDelegator();
GenericValue paymentSettings = null;
GenericValue paymentMethod = null;
try {
paymentMethod = paymentPreference.getRelatedOne("PaymentMethod");
} catch (GenericEntityException e) {
Debug.logError(e, "Problem getting PaymentMethod from OrderPaymentPreference", module);
}
if (paymentMethod != null) {
String productStoreId = orderHeader.getString("productStoreId");
String paymentMethodTypeId = paymentMethod.getString("paymentMethodTypeId");
if (productStoreId != null && paymentMethodTypeId != null) {
paymentSettings = ProductStoreWorker.getProductStorePaymentSetting(delegator, productStoreId, paymentMethodTypeId, paymentServiceType, anyServiceType);
}
}
return paymentSettings;
}
private static String getPayToPartyId(GenericValue orderHeader) {
String payToPartyId = "Company"; // default value
GenericValue productStore = null;
try {
productStore = orderHeader.getRelatedOne("ProductStore");
} catch (GenericEntityException e) {
Debug.logError(e, "Unable to get ProductStore from OrderHeader", module);
return null;
}
if (productStore != null && productStore.get("payToPartyId") != null) {
payToPartyId = productStore.getString("payToPartyId");
}
return payToPartyId;
}
private static Map makeAuthContext(OrderReadHelper orh, GenericValue userLogin, GenericValue paymentPreference, String paymentConfig, double totalRemaining) throws GeneralException {
Map processContext = new HashMap();
processContext.put("userLogin", userLogin);
processContext.put("orderId", orh.getOrderId());
processContext.put("orderItems", orh.getOrderItems());
processContext.put("shippingAddress", orh.getShippingAddress());
processContext.put("paymentConfig", paymentConfig);
processContext.put("currency", orh.getCurrency());
processContext.put("orderPaymentPreference", paymentPreference);
// get the billing information
getBillingInformation(orh, paymentPreference, processContext);
// get the process amount
double thisAmount = totalRemaining;
if (paymentPreference.get("maxAmount") != null) {
thisAmount = paymentPreference.getDouble("maxAmount").doubleValue();
}
// don't authorized more then what is required
if (thisAmount > totalRemaining) {
thisAmount = totalRemaining;
}
// format the decimal
String currencyFormat = UtilProperties.getPropertyValue("general.properties", "currency.decimal.format", "##0.00");
DecimalFormat formatter = new DecimalFormat(currencyFormat);
String amountString = formatter.format(thisAmount);
Double processAmount = null;
try {
processAmount = new Double(formatter.parse(amountString).doubleValue());
} catch (ParseException e) {
Debug.logError(e, "Problems parsing string formatted double to Double", module);
throw new GeneralException("ParseException in number format", e);
}
if (Debug.verboseOn())
Debug.logVerbose("Charging amount: " + processAmount, module);
processContext.put("processAmount", processAmount);
return processContext;
}
private static String getBillingInformation(OrderReadHelper orh, GenericValue paymentPreference, Map toContext) throws GenericEntityException {
// gather the payment related objects.
GenericValue paymentMethod = paymentPreference.getRelatedOne("PaymentMethod");
if (paymentMethod != null && paymentMethod.getString("paymentMethodTypeId").equals("CREDIT_CARD")) {
// type credit card
GenericValue creditCard = paymentMethod.getRelatedOne("CreditCard");
GenericValue billingAddress = creditCard.getRelatedOne("PostalAddress");
toContext.put("creditCard", creditCard);
toContext.put("billingAddress", billingAddress);
} else if (paymentMethod != null && paymentMethod.getString("paymentMethodTypeId").equals("EFT_ACCOUNT")) {
// type eft
GenericValue eftAccount = paymentMethod.getRelatedOne("EftAccount");
GenericValue billingAddress = eftAccount.getRelatedOne("PostalAddress");
toContext.put("eftAccount", eftAccount);
toContext.put("billingAddress", billingAddress);
} else if (paymentMethod != null && paymentMethod.getString("paymentMethodTypeId").equals("GIFT_CARD")) {
// type gift card
GenericValue giftCard = paymentMethod.getRelatedOne("GiftCard");
toContext.put("giftCard", giftCard);
} else {
// add other payment types here; i.e. gift cards, etc.
// unknown payment type; ignoring.
Debug.logError("ERROR: Unsupported PaymentMethodType passed for authorization", module);
return null;
}
// get some contact info.
GenericValue contactPerson = orh.getBillToPerson();
GenericValue contactEmail = null;
Collection emails = null;
try {
emails = ContactHelper.getContactMech(contactPerson.getRelatedOne("Party"), "PRIMARY_EMAIL", "EMAIL_ADDRESS", false);
} catch (GenericEntityException gee) {
Debug.logError("Problems getting contact information: " + gee.getMessage(), module);
}
if (emails != null && emails.size() > 0)
contactEmail = (GenericValue) emails.iterator().next();
toContext.put("contactPerson", contactPerson);
toContext.put("contactEmail", contactEmail);
return contactPerson.getString("partyId");
}
/**
*
* Releases authorizations through service calls to the defined processing service for the ProductStore/PaymentMethodType
* @return COMPLETE|FAILED|ERROR for complete processing of ALL payments.
*/
public static Map releaseOrderPayments(DispatchContext dctx, Map context) {
GenericDelegator delegator = dctx.getDelegator();
LocalDispatcher dispatcher = dctx.getDispatcher();
GenericValue userLogin = (GenericValue) context.get("userLogin");
String orderId = (String) context.get("orderId");
Map result = new HashMap();
// get the order header and payment preferences
GenericValue orderHeader = null;
List paymentPrefs = null;
try {
// first get the order header
orderHeader = delegator.findByPrimaryKey("OrderHeader", UtilMisc.toMap("orderId", orderId));
// get the valid payment prefs
List othExpr = UtilMisc.toList(new EntityExpr("paymentMethodTypeId", EntityOperator.EQUALS, "EFT_ACCOUNT"));
othExpr.add(new EntityExpr("paymentMethodTypeId", EntityOperator.EQUALS, "GIFT_CARD"));
EntityCondition con1 = new EntityConditionList(othExpr, EntityJoinOperator.OR);
EntityCondition statExpr = new EntityExpr("statusId", EntityOperator.EQUALS, "PAYMENT_SETTLED");
EntityCondition con2 = new EntityConditionList(UtilMisc.toList(con1, statExpr), EntityOperator.AND);
EntityCondition authExpr = new EntityExpr("statusId", EntityOperator.EQUALS, "PAYMENT_AUTHORIZED");
EntityCondition con3 = new EntityConditionList(UtilMisc.toList(con2, authExpr), EntityOperator.OR);
EntityExpr orderExpr = new EntityExpr("orderId", EntityOperator.EQUALS, orderId);
EntityCondition con4 = new EntityConditionList(UtilMisc.toList(con3, orderExpr), EntityOperator.AND);
paymentPrefs = delegator.findByCondition("OrderPaymentPreference", con4, null, null);
} catch (GenericEntityException gee) {
Debug.logError(gee, "Problems getting entity record(s), see stack trace", module);
result.put(ModelService.RESPONSE_MESSAGE, ModelService.RESPOND_ERROR);
result.put(ModelService.ERROR_MESSAGE, "ERROR: Could not get order information (" + gee.getMessage() + ").");
return result;
}
// error if no order was found
if (orderHeader == null) {
return ServiceUtil.returnError("Could not find OrderHeader with orderId: " + orderId + "; not processing payments.");
}
// return complete if no payment prefs were found
if (paymentPrefs == null || paymentPrefs.size() == 0) {
Debug.logWarning("No OrderPaymentPreference records available for release", module);
result.put("processResult", "COMPLETE");
result.put(ModelService.RESPONSE_MESSAGE, ModelService.RESPOND_SUCCESS);
return result;
}
OrderReadHelper orh = new OrderReadHelper(orderHeader);
String currency = orh.getCurrency();
// iterate over the prefs and release each one
List finished = new ArrayList();
Iterator payments = paymentPrefs.iterator();
while (payments.hasNext()) {
GenericValue paymentPref = (GenericValue) payments.next();
// look up the payment configuration settings
String serviceName = null;
String paymentConfig = null;
// get the payment settings i.e. serviceName and config properties file name
GenericValue paymentSettings = getPaymentSettings(orh.getOrderHeader(), paymentPref, RELEASE_SERVICE_TYPE, false);
if (paymentSettings != null) {
paymentConfig = paymentSettings.getString("paymentPropertiesPath");
serviceName = paymentSettings.getString("paymentService");
if (serviceName == null) {
Debug.logError("Service name is null for payment setting; cannot process for : " + paymentPref, module);
}
} else {
Debug.logError("Invalid payment settings entity, no payment release settings found for : " + paymentPref, module);
continue; // no release service available -- has been logged
}
if (paymentConfig == null || paymentConfig.length() == 0) {
paymentConfig = "payment.properties";
}
GenericValue authTransaction = PaymentGatewayServices.getAuthTransaction(paymentPref);
Map releaseContext = new HashMap();
releaseContext.put("orderPaymentPreference", paymentPref);
releaseContext.put("releaseAmount", authTransaction.getDouble("amount"));
releaseContext.put("currency", currency);
releaseContext.put("paymentConfig", paymentConfig);
releaseContext.put("userLogin", userLogin);
// run the defined service
Map releaseResult = null;
try {
releaseResult = dispatcher.runSync(serviceName, releaseContext);
} catch (GenericServiceException e) {
Debug.logError(e, "Problem releasing payment", module);
}
// get the release result code
Boolean releaseResponse = (Boolean) releaseResult.get("releaseResult");
// create the PaymentGatewayResponse
String responseId = delegator.getNextSeqId("PaymentGatewayResponse").toString();
GenericValue pgResponse = delegator.makeValue("PaymentGatewayResponse", null);
pgResponse.set("paymentGatewayResponseId", responseId);
pgResponse.set("paymentServiceTypeEnumId", RELEASE_SERVICE_TYPE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -