其他的service请求都可以进去 这个新添加的service debug的时候进不去 大概有哪些问题 求解
把你post 请求和controller里方法贴出看下
把RecvOrder类代码贴出来
package com.netfinworks.mag.web.controller;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.net.URLDecoder;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpMethod;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
import org.springframework.web.servlet.view.RedirectView;
import com.meidusa.fastjson.JSON;
import com.netfinworks.common.lang.StringUtil;
import com.netfinworks.mag.constant.ReqConstant;
import com.netfinworks.mag.enums.ProcessStateKind;
import com.netfinworks.mag.enums.ServiceKind;
import com.netfinworks.mag.exception.CommonDefinedException;
import com.netfinworks.mag.exception.ErrorCodeException;
import com.netfinworks.mag.exception.ErrorCodeException.CommonException;
import com.netfinworks.mag.ext.service.MaQueryService;
import com.netfinworks.mag.helper.RequestHelper;
import com.netfinworks.mag.receive.order.ro.RequestBase;
import com.netfinworks.mag.service.base.IMagService;
import com.netfinworks.mag.service.base.ProcessResult;
import com.netfinworks.mag.service.base.SpringContextUtil;
import com.netfinworks.mag.util.sign.VerifyResult;
import com.netfinworks.mag.util.tools.MagCore;
import com.netfinworks.mag.util.tools.NetUtil;
import com.netfinworks.mag.web.verify.VerifyService;
import com.yongda.supermag.core.common.exception.BaseServiceException;
import com.yongda.supermag.core.common.exception.ErrorCode;
public class RecvOrder extends AbstractController {
private static final Logger logger = LoggerFactory.getLogger(RecvOrder.class);
// 统一日志
// private static final Logger wlogger = LoggerFactory
// .getLogger("mas.order.wlog");
private final String ERRORCODE = "ErrorCode";
private final String ERRORMSG = "ErrorMsg";
private final Charset BASIC_REQUEST_ENCODING = Charset.forName("iso8859-1");
private VerifyService verifyService;
private MaQueryService maQueryService;
private SpringContextUtil contextUtil;
private String submitNetbank = "<script language='javascript'>document.getElementById('frmBankID').submit();</script>";
public void setContextUtil(SpringContextUtil contextUtil) {
this.contextUtil = contextUtil;
}
public void setVerifyService(VerifyService verifyService) {
this.verifyService = verifyService;
}
public void setMaQueryService(MaQueryService maQueryService) {
this.maQueryService = maQueryService;
}
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request,
HttpServletResponse response) throws Exception {
try {
Map<?, ?> parameters = request.getParameterMap();
if (logger.isInfoEnabled()) {
logger.info(request.getMethod() + ", RecvOrder original request:"
+ JSON.toJSONString(parameters));
}
if (parameters == null || parameters.isEmpty() == true) {
// 什么参数都没有
throw CommonDefinedException.REQUIRED_FIELD_NOT_EXIST;
}
String referer = request.getHeader(ReqConstant.REFERER); //风控用
String userAgent = request.getHeader(ReqConstant.USER_AGENT);
logger.info("referer:" + referer + ",userAgent:" + userAgent);
Charset charset = getEncoding(request);
Map<String, String> formattedParameters = new HashMap<String, String>(parameters.size());
for (Map.Entry<?, ?> entry : parameters.entrySet()) {
if (entry.getValue() == null || Array.getLength(entry.getValue()) == 0) {
formattedParameters.put((String) entry.getKey(), null);
} else {
if (HttpMethod.GET.name().equals(request.getMethod())) {
formattedParameters.put(
(String) entry.getKey(),
new String(((String) Array.get(entry.getValue(), 0))
// .getBytes(BASIC_REQUEST_ENCODING), charset));
.getBytes(), charset));
// (String) Array.get(entry.getValue(), 0));
} else {
formattedParameters.put(
(String) entry.getKey(),
URLDecoder.decode((String) Array.get(entry.getValue(), 0),
charset.name()));
}
}
}
if (logger.isInfoEnabled()) {
logger.info("RecvOrder original request format:"
+ JSON.toJSONString(formattedParameters));
}
String serviceName = getServiceName(formattedParameters);
IMagService service = (IMagService) contextUtil.getServiceByAnnoName(serviceName);
//转换为基础对象
RequestBase baseInfo = RequestHelper.convertBaseTemp(formattedParameters);
//验签
verify(baseInfo, charset, formattedParameters);
// 防XSS攻击,去掉“<”和“>”
formattedParameters = auniXSS(formattedParameters);
//分接口处理
if(StringUtils.isNotBlank(referer) && referer.indexOf('?') != -1){
referer = referer.substring(0, referer.indexOf('?'));
}
formattedParameters.put(ReqConstant.REFERER, referer); // 加refer信息
formattedParameters.put(ReqConstant.USERAGENT, userAgent); // 加userAgent信息
// 获取buyer_ip是,目前不判断钓鱼风险
if (StringUtils.isEmpty(formattedParameters.get(ReqConstant.BUYER_IP))) {
formattedParameters.put(ReqConstant.BUYER_IP, NetUtil.getIpAddr(request));
}
ProcessResult result = service.process(formattedParameters);
if (result != null) {
if (!result.isResult()) {
respError(response, result.getException(), result.getMemo());
return null;
} else if (getGoCashier(formattedParameters) && result.isForwardCashier()) {
// 跳转收银台
Map<String, String> tokenParam = new HashMap<String, String>();
// tokenParam.put("token", "1234567");
if(goH5Cashier(formattedParameters)){
respSuccessWithAllInfo(response, result);
return null;
}
return new ModelAndView(new RedirectView(result.getCashierUrl()), tokenParam);
} else if (getGoCashier(formattedParameters)
&& StringUtil.isNotEmpty(result.getNetBankFormUrl())) {
String goNetbank = result.getNetBankFormUrl() + submitNetbank;
String formCharset = result.getFormCharset();
logger.debug("跳转网银:{}, 编码:{}", goNetbank, formCharset);
if (StringUtils.isEmpty(formCharset)) {
formCharset = "GBK";
}
// 网银直接跳转
request.setAttribute("charset", formCharset);
response.setContentType("text/html;charset=" + formCharset); // chrome兼容
response.getWriter().write(goNetbank);
return null;
} else {
// 回步返回成功信息
//respSuccess(response, result);
respSuccessWithAllInfo(response, result);
}
}
} catch (Exception e) {
logger.error("Receive error.", e);
if (e instanceof ErrorCodeException) {
logger.error(ERRORCODE + ":" + ((ErrorCodeException) e).getErrorCode() + ";"
+ ERRORMSG + ":" + ((ErrorCodeException) e).getErrorMsg() + ";", e);
respError(response, (ErrorCodeException) e, ((ErrorCodeException) e).getMemo());
} else {
logger.error("系统错误", e);
BaseServiceException a= (BaseServiceException)e;
respError(response, CommonDefinedException.SYSTEM_ERROR, "系统错误"+a.getMessage());
}
return null;
}
return null;
// return new ModelAndView(new RedirectView(cashierUrl), null);
}
/**
* 验签
* @param tradeInfo
* @param charset
* @param formattedParameters
* @throws CommonException
*/
/* private void verify(RequestBase baseInfo, Charset charset,
Map formattedParameters) throws CommonException {
String signContent = MagCore.createLinkString(MagCore.paraFilter(formattedParameters),
false);
if (logger.isInfoEnabled()) {
logger.info("verify signature: { content:" + signContent + ", signMsg:"
+ baseInfo.getSign() + "}");
}
VerifyResult result = verifyService.verify(baseInfo.getPartnerId(), baseInfo.getService(),
signContent, baseInfo.getSign(), charset.name(), baseInfo.getSignType());
if (!result.isSuccess()) {
//验签未通过
logger.error(ERRORCODE + ":" + CommonDefinedException.ILLEGAL_SIGN.getErrorCode() + ";"
+ ERRORMSG + ":" + CommonDefinedException.ILLEGAL_SIGN.getErrorMsg()
+ ";request dosen't pass verify.");
throw CommonDefinedException.ILLEGAL_SIGN;
}
//验证结果为需要进行证书持有者校验,则校验会员标识是否是证书的持有者
if (result.isNeedPostCheck()) {
//校验合作者身份ID的会员标识与证书持有者是否一致
String identityNo = maQueryService.queryIdentityNoByMemberId(formattedParameters.get("partner_id"));
Map<String, Object> map = result.getInfo();
if (map != null) {
if (!identityNo.equalsIgnoreCase(String.valueOf(map.get(VerifyResult.identityNo)))) {
logger.error("合作者身份ID会员标识与证书持有者不匹配,合作者身份ID:"+formattedParameters.get("partner_id")+",证书持有者:"+map.get(VerifyResult.identityNo));
throw CommonDefinedException.IDENTITY_NO_ERROR;
}
}
//如果传入的会员标识不为空,则校验会员标识与证书持有者是否一致
identityNo = formattedParameters.get("identity_no");
if(StringUtil.isNotBlank(identityNo)){
if (map != null) {
if (!identityNo.equalsIgnoreCase(String.valueOf(map.get(VerifyResult.identityNo)))) {
logger.error("会员标识与证书持有者不匹配,会员标识:"+identityNo+",证书持有者:"+map.get(VerifyResult.identityNo));
throw CommonDefinedException.IDENTITY_NO_ERROR;
}
}
}
}
baseInfo.setState(ProcessStateKind.ACCEPT);
if (logger.isDebugEnabled()) {
logger.debug("invoke verify end:" + result.isSuccess());
}
}
/
/*
* 验签
* @param tradeInfo
* @param charset
* @param formattedParameters
* @throws CommonException
*/
private void verify(RequestBase baseInfo, Charset charset,
Map formattedParameters) throws CommonException {
String signContent = MagCore.createLinkString(MagCore.paraFilter(formattedParameters),
false);
if (logger.isInfoEnabled()) {
logger.info("verify signature: { content:" + signContent + ", signMsg:"
+ baseInfo.getSign() + "}");
}
VerifyResult result = verifyService.verify(baseInfo.getPartnerId(), baseInfo.getService(),
signContent, baseInfo.getSign(), charset.name(), baseInfo.getSignType());
if (!result.isSuccess()) {
//验签未通过
logger.error(ERRORCODE + ":" + CommonDefinedException.ILLEGAL_SIGN.getErrorCode() + ";"
+ ERRORMSG + ":" + CommonDefinedException.ILLEGAL_SIGN.getErrorMsg()
+ ";request dosen't pass verify.");
throw CommonDefinedException.ILLEGAL_SIGN;
}
//验证结果为需要进行证书持有者校验,则校验会员标识是否是证书的持有者
if (result.isNeedPostCheck()) {
//校验合作者身份ID的会员标识与证书持有者是否一致
String identityNo = maQueryService.queryIdentityNoByMemberId(formattedParameters.get("partner_id"));
Map<String, Object> map = result.getInfo();
if (map != null) {
if (!identityNo.equalsIgnoreCase(String.valueOf(map.get(VerifyResult.identityNo)))) {
logger.error("合作者身份ID会员标识与证书持有者不匹配,合作者身份ID:"+formattedParameters.get("partner_id")+",证书持有者:"+map.get(VerifyResult.identityNo));
throw CommonDefinedException.IDENTITY_NO_ERROR;
}
}
//如果传入的会员标识不为空,则校验会员标识与证书持有者是否一致
identityNo = formattedParameters.get("identity_no");
if(StringUtil.isNotBlank(identityNo)){
if (map != null) {
if (!identityNo.equalsIgnoreCase(String.valueOf(map.get(VerifyResult.identityNo)))) {
logger.error("会员标识与证书持有者不匹配,会员标识:"+identityNo+",证书持有者:"+map.get(VerifyResult.identityNo));
throw CommonDefinedException.IDENTITY_NO_ERROR;
}
}
}
}
baseInfo.setState(ProcessStateKind.ACCEPT);
if (logger.isDebugEnabled()) {
logger.debug("invoke verify end:" + result.isSuccess());
}
}
private Charset getEncoding(HttpServletRequest request) {
Charset utf8Charset = Charset.forName("UTF-8");
Charset gbkCharset = Charset.forName("GBK");
Charset gb2312Charset = Charset.forName("GB2312");
String inputCharset = request.getParameter(ReqConstant.INPUT_CHARSET);
if ("utf-8".equalsIgnoreCase(inputCharset)) {
return utf8Charset;
} else if ("gbk".equalsIgnoreCase(inputCharset)) {
return gbkCharset;
} else if ("gb2312".equalsIgnoreCase(inputCharset)) {
return gb2312Charset;
}
return utf8Charset;
}
private boolean getGoCashier(Map<String, String> parameters) {
boolean result = true;
String goCashierStr = parameters.get(ReqConstant.GO_CASHIER);
if (goCashierStr != null && "Y".equalsIgnoreCase(goCashierStr)) {
result = true;
}
if (goCashierStr != null && "N".equalsIgnoreCase(goCashierStr)) {
result = false;
logger.debug("强制不跳转收银台");
}
return result;
}
private boolean goH5Cashier(Map<String, String> parameters) {
boolean result = false;
String serviceStr = parameters.get(ReqConstant.SERVICE);
ServiceKind service = ServiceKind.getByCode(serviceStr);
if(service != null){
if(service == ServiceKind.create_instant_pay_mobile){
result = true;
}
}
return result;
}
/**
* 取得service并验证支付方式
* @param request
* @return
* @throws Exception
*/
private String getServiceName(Map<String, String> parameters) throws Exception {
String serviceName = parameters.get(ReqConstant.SERVICE);
String partnerId = parameters.get(ReqConstant.PARNTER_ID);
// String payMethod = parameters.get(ReqConstant.PAY_METHOD);
if (StringUtil.isEmpty(partnerId)) {
CommonException exp = CommonDefinedException.REQUIRED_FIELD_NOT_EXIST;
exp.setMemo("合作者身份ID");
throw exp;
} else if (partnerId.length() > 32) {
CommonException exp = CommonDefinedException.FIELD_LENGTH_EXCEEDS_LIMIT;
exp.setMemo("合作者身份ID");
throw exp;
}
if (StringUtil.isNotEmpty(serviceName)) {
serviceName = serviceName.toLowerCase();
} else {
CommonException exp = CommonDefinedException.REQUIRED_FIELD_NOT_EXIST;
exp.setMemo("接口名称");
throw exp;
}
ServiceKind service = ServiceKind.getByCode(serviceName);
if (service == null) {
throw CommonDefinedException.ILLEGAL_SERVICE;
}
// PartnerInfo partnerInfo = AcsTask.getPartnerPublicKey(partnerId);
// List payList = partnerInfo.getPayChannelList();
// if (ServiceKind.operator_substitute_recharge.equals(service)) {
// // 代充的支付方式不一样
// PayChannelKind payKind = PayChannelKind.getByMsg(payMethod);
// if (payKind == null) {
// throw CommonDefinedException.PAY_METHOD_ERROR; // 支付方式错误
// }
// if (!payList.contains(payKind.getCode())) {
// throw CommonDefinedException.ILLEGAL_PAY_METHOD; // 未授权
// }
// } else {
// List payMethodList = Tools.str2PayMethodList(payMethod);
// if (payMethodList != null) {
// for (PayMethod pay : payMethodList) {
// PayChannelKind payKind = pay.getPayChannel();
// if (!payList.contains(payKind.getCode())) {
// throw CommonDefinedException.ILLEGAL_PAY_METHOD; // 未授权
// }
// }
// }
// }
// ILLEGAL_PAY_METHOD
// 去掉了充值接口
if (ServiceKind.create_deposit.equals(service)) {
throw CommonDefinedException.ILLEGAL_SERVICE;
}
return serviceName;
}
private void respError(HttpServletResponse response, ErrorCodeException e, String memo)
throws Exception {
String errorInfo = "is_success=F&_input_charset=UTF-8&";
response.setCharacterEncoding("utf8");
response.setHeader("content-type", "text/html;charset=UTF-8");
StringBuilder sb = new StringBuilder();
sb.append(errorInfo).append("error_code=").append(e.getErrorCode())
.append("&error_message=").append(e.getErrorMsg());
if (StringUtil.isNotEmpty(memo)) {
sb.append("&memo=").append(memo);
}
response.getWriter().write(sb.toString());
}
private void respSuccess(HttpServletResponse response, ProcessResult result) throws Exception {
String succInfo = "is_success=T&_input_charset=UTF-8";
response.setCharacterEncoding("utf8");
response.setHeader("content-type", "text/html;charset=UTF-8");
StringBuilder sb = new StringBuilder();
sb.append(succInfo);
if (StringUtil.isNotEmpty(result.getInner_trade_no())) {
sb.append("&inner_trade_no=").append(result.getInner_trade_no());
}
if (StringUtil.isNotEmpty(result.getOuter_trade_no())) {
sb.append("&outer_trade_no=").append(result.getOuter_trade_no());
}
if (StringUtil.isNotEmpty(result.getPartner_id())) {
sb.append("&partner_id=").append(result.getPartner_id());
}
/*if (StringUtil.isNotEmpty(result.getPos_pay_no())) {
sb.append("&pos_pay_no=").append(result.getPos_pay_no());
}*/
if (StringUtil.isNotEmpty(result.getInstPayInfo())) {
sb.append("&inst_pay_info=").append(result.getInstPayInfo());
}
if (StringUtil.isNotEmpty(result.getMemo())) {
sb.append("&memo=").append(result.getMemo());
}
if (StringUtil.isNotEmpty(result.getTradeList())) {
sb.append("&trade_list=").append(result.getTradeList());
}
if (StringUtil.isNotEmpty(result.getPayeeId())) {
sb.append("&payee_id=").append(result.getPayeeId());
}
if (StringUtil.isNotEmpty(result.getPayeeIdType())) {
sb.append("&payee_id_type=").append(result.getPayeeIdType());
}
if (StringUtil.isNotEmpty(result.getPageNo())) {
sb.append("&page_no=").append(result.getPageNo());
}
if (StringUtil.isNotEmpty(result.getPageSize())) {
sb.append("&page_size=").append(result.getPageSize());
}
if (StringUtil.isNotEmpty(result.getTotalItem())) {
sb.append("&total_item=").append(result.getTotalItem());
}
if (StringUtil.isNotEmpty(result.getDetailList())) {
sb.append("&detail_list=").append(result.getDetailList());
}
response.getWriter().write(sb.toString());
}
private void respSuccessWithAllInfo(HttpServletResponse response, ProcessResult result)
throws Exception {
String succInfo = "is_success=T&_input_charset=UTF-8";
response.setCharacterEncoding("UTF-8");
response.setHeader("content-type", "text/html;charset=UTF-8");
StringBuilder sb = new StringBuilder();
sb.append(succInfo);
for (Field f : ProcessResult.class.getDeclaredFields()) {
f.setAccessible(true);
if (f.get(result) != null && StringUtils.isNotBlank(f.get(result).toString())) {
sb.append("&" + f.getName() + "=").append(f.get(result).toString());
}
f.setAccessible(false);
}
logger.info("生成响应结果:" + sb.toString());
response.getWriter().write(sb.toString());
}
private Map<String, String> auniXSS(Map<String, String> reqMap) {
Map<String, String> result = new HashMap<String, String>(reqMap.size());
for (Map.Entry<String, String> entry : reqMap.entrySet()) {
if (entry.getValue() == null) {
result.put((String) entry.getKey(), null);
} else {
String value = entry.getValue().replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll("\"", """).replaceAll("'", "´");
result.put((String) entry.getKey(), value);
}
}
return result;
}
}