📄 paymentgatewayservices.java
字号:
Debug.logInfo("Nothing to capture; authAmount = 0", module);
continue;
}
//Debug.log("Actual Auth amount : " + authAmount, module);
// if the authAmount is more then the remaining total; just use remaining total
if (authAmount.doubleValue() > remainingTotal) {
authAmount = new Double(remainingTotal);
}
// if we have a billing account; total up auth + account available
double amountToBillAccount = 0.00;
if (billingAccountAvail != null) {
amountToBillAccount = authAmount.doubleValue() + billingAccountAvail.doubleValue();
}
// the amount for *this* capture
double amountThisCapture = 0.00;
// determine how much for *this* capture
if (authAmount.doubleValue() >= amountToCapture) {
// if the auth amount is more then expected capture just capture what is expected
amountThisCapture = amountToCapture;
} else if (payments.hasNext()) {
// if we have more payments to capture; just capture what was authorized
amountThisCapture = authAmount.doubleValue();
} else if (billingAccountAvail != null && amountToBillAccount >= amountToCapture) {
// the provided billing account will cover the remaining; just capture what was autorized
amountThisCapture = authAmount.doubleValue();
} else {
// we need to capture more then what was authorized; re-auth for the new amount
// TODO: add what the billing account cannot support to the re-auth amount
// TODO: add support for re-auth for additional funds
// just in case; we will capture the authorized amount here; until this is implemented
Debug.logError("The amount to capture was more then what was authorized; we only captured the authorized amount : " + paymentPref, module);
amountThisCapture = authAmount.doubleValue();
}
Map captureResult = capturePayment(dispatcher, userLogin, orh, paymentPref, amountThisCapture);
if (captureResult != null) {
GenericValue paymentSettings = (GenericValue) captureResult.get("paymentSettings");
Double amountCaptured = (Double) captureResult.get("captureAmount");
if (amountCaptured != null) amountToCapture -= amountCaptured.doubleValue();
finished.add(captureResult);
// add the invoiceId to the result for processing
captureResult.put("invoiceId", invoiceId);
//Debug.log("Capture result : " + captureResult, module);
// process the capture's results
boolean processResult = false;
try {
processResult = processResult(dctx, captureResult, userLogin, paymentPref, paymentSettings);
} catch (GeneralException e) {
Debug.logError(e, "Trouble processing the result; captureResult: " + captureResult, module);
ServiceUtil.returnError("Trouble processing the capture results");
}
// create any splits which are needed
if (authAmount.doubleValue() > amountThisCapture) {
// create a new payment preference and authorize it
Debug.logInfo("Creating payment preference split", module);
double newAmount = authAmount.doubleValue() - amountThisCapture;
String newPrefId = delegator.getNextSeqId("OrderPaymentPreference").toString();
GenericValue newPref = delegator.makeValue("OrderPaymentPreference", UtilMisc.toMap("orderPaymentPreferenceId", newPrefId));
newPref.set("orderId", paymentPref.get("orderId"));
newPref.set("paymentMethodTypeId", paymentPref.get("paymentMethodTypeId"));
newPref.set("paymentMethodId", paymentPref.get("paymentMethodId"));
newPref.set("maxAmount", paymentPref.get("maxAmount"));
newPref.set("statusId", "PAYMENT_NOT_AUTH");
Debug.logInfo("New preference : " + newPref, module);
try {
// create the new payment preference
delegator.create(newPref);
// authorize the new preference
Map processorResult = authPayment(dispatcher, userLogin, orh, newPref, newAmount, false);
if (processorResult != null) {
GenericValue pSetting = (GenericValue) processorResult.get("paymentSettings");
Double thisAmount = (Double) processorResult.get("processAmount");
// process the auth results
boolean authResult = false;
try {
authResult = processResult(dctx, processorResult, userLogin, newPref, pSetting);
if (!authResult) {
Debug.logError("Authorization failed : " + newPref + " : " + processorResult, module);
}
} catch (GeneralException e) {
Debug.logError(e, "Trouble processing the auth result : " + newPref + " : " + processorResult, module);
}
} else {
Debug.logError("Payment not authorized : " + newPref + " : " + processorResult, module);
}
} catch (GenericEntityException e) {
Debug.logError(e, "ERROR: cannot create new payment preference : " + newPref, module);
}
}
} else {
Debug.logError("Payment not captured", module);
continue;
}
}
if (amountToCapture > 0.00) {
result.put(ModelService.RESPONSE_MESSAGE, ModelService.RESPOND_SUCCESS);
result.put("processResult", "FAILED");
return result;
} else {
result.put(ModelService.RESPONSE_MESSAGE, ModelService.RESPOND_SUCCESS);
result.put("processResult", "COMPLETE");
return result;
}
}
private static Map capturePayment(LocalDispatcher dispatcher, GenericValue userLogin, OrderReadHelper orh, GenericValue paymentPref, double amount) {
// 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, CAPTURE_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", module);
return null;
}
} else {
Debug.logError("Invalid payment settings entity, no payment settings found", module);
return null;
}
if (paymentConfig == null || paymentConfig.length() == 0) {
paymentConfig = "payment.properties";
}
// prepare the context for the capture service (must follow the ccCaptureInterface
Map captureContext = new HashMap();
captureContext.put("userLogin", userLogin);
captureContext.put("orderPaymentPreference", paymentPref);
captureContext.put("paymentConfig", paymentConfig);
captureContext.put("captureAmount", new Double(amount));
captureContext.put("currency", orh.getCurrency());
Debug.logInfo("Capture [" + serviceName + "] : " + captureContext, module);
// now invoke the capture service
Map captureResult = null;
try {
captureResult = dispatcher.runSync(serviceName, captureContext);
} catch (GenericServiceException e) {
Debug.logError(e, "Could not capture payment ... serviceName: " + serviceName + " ... context: " + captureContext, module);
return null;
}
// pass the payTo partyId to the result processor; we just add it to the result context.
String payToPartyId = getPayToPartyId(orh.getOrderHeader());
captureResult.put("payToPartyId", payToPartyId);
// add paymentSettings to result; for use by later processors
captureResult.put("paymentSettings", paymentSettings);
return captureResult;
}
private static boolean processResult(DispatchContext dctx, Map result, GenericValue userLogin, GenericValue paymentPreference, GenericValue paymentSettings) throws GeneralException {
Boolean authResult = (Boolean) result.get("authResult");
Boolean captureResult = (Boolean) result.get("captureResult");
boolean resultPassed = false;
boolean fromAuth = false;
if (authResult != null) {
processAuthResult(dctx, result, userLogin, paymentPreference, paymentSettings);
resultPassed = authResult.booleanValue();
fromAuth = true;
}
if (captureResult != null) {
processCaptureResult(dctx, result, userLogin, paymentPreference, paymentSettings, fromAuth);
if (!resultPassed)
resultPassed = captureResult.booleanValue();
}
return resultPassed;
}
private static void processAuthResult(DispatchContext dctx, Map result, GenericValue userLogin, GenericValue paymentPreference, GenericValue paymentSettings) throws GeneralException {
Boolean authResult = (Boolean) result.get("authResult");
GenericDelegator delegator = paymentPreference.getDelegator();
// type of auth this was can be determined by the previous status
String authType = paymentPreference.getString("statusId").equals("PAYMENT_NOT_AUTH") ? AUTH_SERVICE_TYPE : REAUTH_SERVICE_TYPE;
// create the PaymentGatewayResponse
String responseId = delegator.getNextSeqId("PaymentGatewayResponse").toString();
GenericValue response = delegator.makeValue("PaymentGatewayResponse", null);
response.set("paymentGatewayResponseId", responseId);
response.set("paymentServiceTypeEnumId", authType);
response.set("orderPaymentPreferenceId", paymentPreference.get("orderPaymentPreferenceId"));
response.set("paymentMethodTypeId", paymentPreference.get("paymentMethodTypeId"));
response.set("paymentMethodId", paymentPreference.get("paymentMethodId"));
// set the avs/fraud result
response.set("gatewayAvsResult", result.get("avsCode"));
response.set("gatewayScoreResult", result.get("scoreCode"));
// set the auth info
response.set("amount", result.get("processAmount"));
response.set("referenceNum", result.get("authRefNum"));
response.set("gatewayCode", result.get("authCode"));
response.set("gatewayFlag", result.get("authFlag"));
response.set("gatewayMessage", result.get("authMessage"));
response.set("transactionDate", UtilDateTime.nowTimestamp());
delegator.create(response);
if (response.getDouble("amount").doubleValue() != ((Double) result.get("processAmount")).doubleValue()) {
Debug.logWarning("The authorized amount does not match the max amount : Response - " + response + " : result - " + result, module);
}
// set the status of the OrderPaymentPreference
if (result != null && authResult.booleanValue()) {
paymentPreference.set("statusId", "PAYMENT_AUTHORIZED");
} else if (result != null && !authResult.booleanValue()) {
paymentPreference.set("statusId", "PAYMENT_DECLINED");
} else {
paymentPreference.set("statusId", "PAYMENT_ERROR");
}
paymentPreference.store();
}
private static void processCaptureResult(DispatchContext dctx, Map result, GenericValue userLogin, GenericValue paymentPreference, GenericValue paymentSettings) throws GeneralException {
processCaptureResult(dctx, result, userLogin, paymentPreference, paymentSettings, false);
}
private static void processCaptureResult(DispatchContext dctx, Map result, GenericValue userLogin, GenericValue paymentPreference, GenericValue paymentSettings, boolean fromAuth) throws GeneralException {
Boolean captureResult = (Boolean) result.get("captureResult");
String invoiceId = (String) result.get("invoiceId");
String payTo = (String) result.get("payToPartyId");
GenericDelegator delegator = dctx.getDelegator();
LocalDispatcher dispatcher = dctx.getDispatcher();
Double amount = null;
if (result.get("captureAmount") != null) {
amount = (Double) result.get("captureAmount");
} else if (result.get("processAmount") != null) {
amount = (Double) result.get("processAmount");
}
if (amount == null) {
throw new GeneralException("Unable to process null capture amount");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -