📄 checkouthelper.java
字号:
}
// Get the orderId from the cart.
String orderId = this.cart.getOrderId();
// Get the paymentMethodTypeIds - this will need to change when ecom supports multiple payments
List paymentMethodTypeIds = this.cart.getPaymentMethodTypeIds();
// Check the payment preferences; if we have ANY w/ status PAYMENT_NOT_AUTH invoke payment service.
boolean requireAuth = false;
List allPaymentPreferences = null;
try {
allPaymentPreferences = this.delegator.findByAnd("OrderPaymentPreference", UtilMisc.toMap("orderId", orderId));
} catch (GenericEntityException e) {
throw new GeneralException("Problems getting payment preferences", e);
}
Map paymentFields = UtilMisc.toMap("statusId", "PAYMENT_NOT_AUTH");
List paymentPreferences = EntityUtil.filterByAnd(allPaymentPreferences, paymentFields);
if (paymentPreferences != null && paymentPreferences.size() > 0) {
requireAuth = true;
}
// Invoke payment processing.
if (requireAuth) {
Map paymentResult = null;
try {
// invoke the payment gateway service.
paymentResult = dispatcher.runSync("authOrderPayments", UtilMisc.toMap("orderId", orderId, "userLogin", userLogin));
} catch (GenericServiceException e) {
Debug.logWarning(e, module);
}
if (Debug.verboseOn()) Debug.logVerbose("Finsished w/ Payment Service", module);
if (paymentResult != null && paymentResult.containsKey("processResult")) {
String authResp = (String) paymentResult.get("processResult");
if (authResp.equals("FAILED")) {
// order was NOT approved
if (Debug.verboseOn()) Debug.logVerbose("Payment auth was NOT a success!", module);
boolean ok = OrderChangeHelper.rejectOrder(dispatcher, userLogin, orderId);
if (!ok) {
throw new GeneralException("Problem with order change; see above error");
}
// null out the orderId for next pass.
cart.setOrderId(null);
return ServiceUtil.returnError(DECLINE_MESSAGE);
} else if (authResp.equals("APPROVED")) {
// order WAS approved
if (Debug.verboseOn()) Debug.logVerbose("Payment auth was a success!", module);
// set the order and item status to approved
boolean ok = OrderChangeHelper.approveOrder(dispatcher, userLogin, orderId);
if (!ok) {
throw new GeneralException("Problem with order change; see above error");
}
return ServiceUtil.returnSuccess();
} else if (authResp.equals("ERROR")) {
// service failed
if (Debug.verboseOn()) Debug.logVerbose("Payment auth failed due to processor trouble.", module);
if ("Y".equalsIgnoreCase(RETRY_ON_ERROR)) {
return ServiceUtil.returnSuccess(ERROR_MESSAGE);
} else {
boolean ok = OrderChangeHelper.cancelOrder(dispatcher, userLogin, orderId);
if (!ok) {
throw new GeneralException("Problem with order change; see above error");
}
// null out orderId for next pass
this.cart.setOrderId(null);
return ServiceUtil.returnError(ERROR_MESSAGE);
}
} else {
// should never happen
return ServiceUtil.returnError("Please contact customer service; payment return code unknown.");
}
} else {
// result returned null == service failed
if (Debug.verboseOn()) Debug.logVerbose("Payment auth failed due to processor trouble.", module);
if ("Y".equalsIgnoreCase(RETRY_ON_ERROR)) {
return ServiceUtil.returnSuccess(ERROR_MESSAGE);
} else {
boolean ok = OrderChangeHelper.cancelOrder(dispatcher, userLogin, orderId);
if (!ok) {
throw new GeneralException("Problem with order change; see above error");
}
// null out orderId for next pass
this.cart.setOrderId(null);
return ServiceUtil.returnError(ERROR_MESSAGE);
}
}
} else if (paymentMethodTypeIds.contains("EXT_COD") || paymentMethodTypeIds.contains("EXT_BILLACT")) {
boolean hasOther = false;
boolean validAmount = false;
Iterator pmti = paymentMethodTypeIds.iterator();
while (pmti.hasNext()) {
String type = (String) pmti.next();
if (!"EXT_COD".equals(type) && !"EXT_BILLACT".equals(type)) {
hasOther = true;
break;
}
}
if (!hasOther) {
if (!paymentMethodTypeIds.contains("EXT_COD")) {
// only billing account, make sure we have enough to cover
String billingAccountId = cart.getBillingAccountId();
double billAcctCredit = this.availableAccountBalance(billingAccountId);
double billingAcctAmt = cart.getBillingAccountAmount();
if (billAcctCredit >= billingAcctAmt) {
if (cart.getGrandTotal() > billAcctCredit) {
validAmount = false;
} else {
validAmount = true;
}
}
}
// approve this as long as there are only COD and Billing Account types
boolean ok = OrderChangeHelper.approveOrder(dispatcher, userLogin, orderId);
if (!ok) {
throw new GeneralException("Problem with order change; see above error");
}
}
return ServiceUtil.returnSuccess();
} else {
// Handle NO payment gateway as a success.
return ServiceUtil.returnSuccess();
}
}
public Map checkOrderBlacklist(GenericValue userLogin) {
if (cart == null) {
return ServiceUtil.returnSuccess("success");
}
GenericValue shippingAddressObj = this.cart.getShippingAddress();
if (shippingAddressObj == null) {
return ServiceUtil.returnSuccess("success");
}
String shippingAddress = UtilFormatOut.checkNull(shippingAddressObj.getString("address1")).toUpperCase();
List exprs = UtilMisc.toList(new EntityExpr(
new EntityExpr("blacklistString", true, EntityOperator.EQUALS, shippingAddress, true), EntityOperator.AND,
new EntityExpr("orderBlacklistTypeId", EntityOperator.EQUALS, "BLACKLIST_ADDRESS")));
String errMsg=null;
List paymentMethods = this.cart.getPaymentMethods();
Iterator i = paymentMethods.iterator();
while (i.hasNext()) {
GenericValue paymentMethod = (GenericValue) i.next();
if (paymentMethod.getString("paymentMethodTypeId").equals("CREDIT_CARD")) {
GenericValue creditCard = null;
GenericValue billingAddress = null;
try {
creditCard = paymentMethod.getRelatedOne("CreditCard");
if (creditCard != null)
billingAddress = creditCard.getRelatedOne("PostalAddress");
} catch (GenericEntityException e) {
Debug.logError(e, "Problems getting credit card from payment method", module);
errMsg = UtilProperties.getMessage(resource,"checkhelper.problems_reading_database", (cart != null ? cart.getLocale() : Locale.getDefault()));
return ServiceUtil.returnError(errMsg);
}
if (creditCard != null) {
String creditCardNumber = UtilFormatOut.checkNull(creditCard.getString("cardNumber"));
exprs.add(new EntityExpr(
new EntityExpr("blacklistString", EntityOperator.EQUALS, creditCardNumber), EntityOperator.AND,
new EntityExpr("orderBlacklistTypeId", EntityOperator.EQUALS, "BLACKLIST_CREDITCARD")));
}
if (billingAddress != null) {
String address = UtilFormatOut.checkNull(billingAddress.getString("address1").toUpperCase());
exprs.add(new EntityExpr(
new EntityExpr("blacklistString", true, EntityOperator.EQUALS, address, true), EntityOperator.AND,
new EntityExpr("orderBlacklistTypeId", EntityOperator.EQUALS, "BLACKLIST_ADDRESS")));
}
}
}
List blacklistFound = null;
if (exprs.size() > 0) {
try {
blacklistFound = this.delegator.findByOr("OrderBlacklist", exprs);
} catch (GenericEntityException e) {
Debug.logError(e, "Problems with OrderBlacklist lookup.", module);
errMsg = UtilProperties.getMessage(resource,"checkhelper.problems_reading_database", (cart != null ? cart.getLocale() : Locale.getDefault()));
return ServiceUtil.returnError(errMsg);
}
}
if (blacklistFound != null && blacklistFound.size() > 0) {
return ServiceUtil.returnError("failed");
} else {
return ServiceUtil.returnSuccess("success");
}
}
public Map failedBlacklistCheck(GenericValue userLogin, GenericValue productStore) {
Map result;
String errMsg=null;
String REJECT_MESSAGE = productStore.getString("authFraudMessage");
// Get the orderId from the cart.
String orderId = this.cart.getOrderId();
// set the order/item status - reverse inv
OrderChangeHelper.rejectOrder(dispatcher, userLogin, orderId);
// nuke the userlogin
userLogin.set("enabled", "N");
try {
userLogin.store();
} catch (GenericEntityException e) {
Debug.logError(e, "Problems de-activating userLogin.", module);
errMsg = UtilProperties.getMessage(resource,"checkhelper.database_error", (cart != null ? cart.getLocale() : Locale.getDefault()));
result = ServiceUtil.returnError(errMsg);
return result;
}
result = ServiceUtil.returnSuccess();
result.put(ModelService.ERROR_MESSAGE, REJECT_MESSAGE);
// wipe the cart and session
this.cart.clear();
return result;
}
public Map checkExternalPayment(String orderId) {
Map result;
String errMsg=null;
// warning there can only be ONE payment preference for this to work
// you cannot accept multiple payment type when using an external gateway
GenericValue orderHeader = null;
try {
orderHeader = this.delegator.findByPrimaryKey("OrderHeader", UtilMisc.toMap("orderId", orderId));
} catch (GenericEntityException e) {
Debug.logError(e, "Problems getting order header", module);
errMsg = UtilProperties.getMessage(resource,"checkhelper.problems_getting_order_header", (cart != null ? cart.getLocale() : Locale.getDefault()));
result = ServiceUtil.returnError(errMsg);
return result;
}
if (orderHeader != null) {
List paymentPrefs = null;
try {
paymentPrefs = orderHeader.getRelated("OrderPaymentPreference");
} catch (GenericEntityException e) {
Debug.logError(e, "Problems getting order payments", module);
errMsg = UtilProperties.getMessage(resource,"checkhelper.problems_getting_payment_preference", (cart != null ? cart.getLocale() : Locale.getDefault()));
result = ServiceUtil.returnError(errMsg);
return result;
}
if (paymentPrefs != null && paymentPrefs.size() > 0) {
if (paymentPrefs.size() > 1) {
Debug.logError("Too many payment preferences, you cannot have more then one when using external gateways", module);
}
GenericValue paymentPreference = EntityUtil.getFirst(paymentPrefs);
String paymentMethodTypeId = paymentPreference.getString("paymentMethodTypeId");
if (paymentMethodTypeId.startsWith("EXT_")) {
String type = paymentMethodTypeId.substring(4);
result = ServiceUtil.returnSuccess();
result.put("type", type.toLowerCase());
return result;
}
}
result = ServiceUtil.returnSuccess();
result.put("type", "none");
return result;
} else {
errMsg = UtilProperties.getMessage(resource,"checkhelper.problems_getting_order_header", (cart != null ? cart.getLocale() : Locale.getDefault()));
result = ServiceUtil.returnError(errMsg);
result.put("type", "error");
return result;
}
}
/**
* Sets the shipping contact mechanism on the cart
*
* @param shippingContactMechId The identifier of the contact
* @return A Map conforming to the OFBiz Service conventions containing
* any error messages
*/
public Map finalizeOrderEntryShip(String shippingContactMechId) {
Map result;
String errMsg=null;
//Verify the field is valid
if (UtilValidate.isNotEmpty(shippingContactMechId)) {
this.cart.setShippingContactMechId(shippingContactMechId);
result = ServiceUtil.returnSuccess();
} else {
errMsg = UtilProperties.getMessage(resource,"checkhelper.enter_shipping_address", (cart != null ? cart.getLocale() : Locale.getDefault()));
result = ServiceUtil.returnError(errMsg);
}
return result;
}
/**
* Sets the options associated with the order
*
* @param shippingMethod The shipping method indicating the carrier and
* shipment type to use
* @param shippingInstructions Any additional handling instructions
* @param maySplit "true" or anything else for <code>false</code>
* @param giftMessage A message to have included for the recipient
* @param isGift "true" or anything else for <code>false</code>
* @return A Map conforming to the OFBiz Service conventions containing
* any error messages
*/
public Map finalizeOrderEntryOptions(String shippingMethod,
String shippingInstructions, String maySplit, String giftMessage, String isGift) {
Map result;
String errMsg=null;
//Verify the shipping method is valid
if (UtilValidate.isNotEmpty(shippingMethod)) {
int delimiterPos = shippingMethod.indexOf('@');
String shipmentMethodTypeId = null;
String carrierPartyId = null;
if (delimiterPos > 0) {
shipmentMethodTypeId = shippingMethod.substring(0, delimiterPos);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -