자바 Http 인터페이스 추가,검사 방법

1.업무 배경
최근 에 일부 전자상거래 업 무 를 접 했 는데 전자상거래 업무 인 터 페 이 스 를 처리 할 때 예 를 들 어 타 오 바 오,결제 류 인 터 페 이 스 를 발견 했다.인터페이스 쌍방 은 데이터 매개 변수 가 전송 과정 에서 변경 되 지 않도록 인터페이스 데 이 터 를 추가 서명 한 다음 에 인터페이스 서버 에서 인터페이스 매개 변 수 를 검사 하여 두 서명 이 똑 같 도록 확보 해 야 한다.검 사 를 통과 한 후에 업무 논리 처 리 를 진행 하 다.우 리 는 여기 서 주로 처리 방향 을 소개 합 니 다.서명 알고리즘 에 대해 저 는 소 개 를 많이 하지 않 고 인터넷 에 많이 있 습 니 다.
2.처리 방향
쌍방 은 매개 변 수 를 특정한 순서에 따라 배열 하기 로 약속 했다.예 를 들 어 이니셜 의 순서에 따라 배열 하 는 것 이다.예 를 들 어 url:http://xxx/xxx.do?a=wersd&b=sd2354&c=4&signature=XXXXXXXXXXXX(signature 는 전 송 된 서명 입 니 다)입 참 을 받 은 후에 매개 변 수 를 a=wersd&b=sd 2354&c=4 로 연결 합 니 다.약속 한 서명 규칙 에 따라 md5 로 서명 한 다음 에 입 참 된 signature 값 과 비교 합 니 다.호출 자가 합 법 적 인지 확인 하 는 것 이 인터페이스 서명 검증 의 사고방식 이다.
3.실례 연습
인터페이스 쌍방 은 의사 소통 을 통 해 인터페이스 에 대해 다음 과 같은 공감 대 를 형성 했다.
1.주의사항 은 인터페이스의 프로 토 콜,전송 매개 변수 유형,서명 알고리즘,파일 형식 등 설명 을 말한다.

2.다음은 전자상거래 업무 인터페이스의 실제 사례 로 쌍방 은 인터페이스 URL,업무 매개 변수,고정 매개 변수,서명 과 데이터 형식 을 되 돌려 주기 로 약속 했다.


인터페이스 호출 시 인터페이스 호출 자 코드 는 다음 과 같 습 니 다(참고 만 제공).

package com.pcmall;

import java.io.BufferedReader;					
import java.io.DataOutputStream;					
import java.io.IOException;					
import java.io.InputStreamReader;					
import java.io.UnsupportedEncodingException;					
import java.net.HttpURLConnection;					
import java.net.URL;					
import java.net.URLEncoder;					
import java.security.MessageDigest;					
import java.security.NoSuchAlgorithmException;					
import java.util.ArrayList;					
import java.util.Collections;					
import java.util.Iterator;					
import java.util.List;					
import java.util.Map;					
import java.util.TreeMap;
					
public class APITest {					
  static String TEST_URL = "  ";					
  static String TEST_KEY = "  ";					
  static String TEST_SEC = "  ";					
  					
  public static void main(String[] args) throws UnsupportedEncodingException, NoSuchAlgorithmException {					
    String result = getResult(TEST_URL, getReqParam());					
    System.out.print(result);					
  }					
					
  private static String getReqParam() throws UnsupportedEncodingException, NoSuchAlgorithmException {					
  	TreeMap<String, String> req = new TreeMap<String, String>();			
    req.put("a", TEST_KEY);					
    req.put("f", "json");					
    req.put("l", "zh_CN");					
    req.put("m", "zhongan.repair.query");					
    req.put("v", "1.0");					
    req.put("i", "" + System.currentTimeMillis() / 1000);					
    req.put("params", "{\"assignNo\":\"TEST018\"}");					
    req.put("s", sign(req, null, TEST_SEC));					
    					
    StringBuilder param = new StringBuilder();					
    for (Iterator<Map.Entry<String, String>> it = req.entrySet().iterator(); it.hasNext();) {					
      Map.Entry<String, String> e = it.next();					
      param.append("&").append(e.getKey()).append("=").append(URLEncoder.encode(e.getValue(), "UTF-8"));					
    }					
    					
    return param.toString().substring(1);					
  }					
  					
  private static String sign(Map<String, String> paramValues, List<String> ignoreParamNames, String secret) throws NoSuchAlgorithmException, UnsupportedEncodingException {					
    StringBuilder sb = new StringBuilder();					
    List<String> paramNames = new ArrayList<String>(paramValues.size());					
    paramNames.addAll(paramValues.keySet());					
    if (ignoreParamNames != null && ignoreParamNames.size() > 0) {					
      for (String ignoreParamName : ignoreParamNames) {					
        paramNames.remove(ignoreParamName);					
      }					
    }					
    Collections.sort(paramNames);					
    					
    sb.append(secret);					
    for (String paramName : paramNames) {					
      sb.append(paramName).append(paramValues.get(paramName));					
    }					
    sb.append(secret);					
					
    MessageDigest md = MessageDigest.getInstance("SHA-1");					
    return byte2hex(md.digest(sb.toString().getBytes("UTF-8")));					
  }					
  					
  private static String byte2hex(byte[] bytes) {					
    StringBuilder sign = new StringBuilder();					
    for (int i = 0; i < bytes.length; i++) {					
      String hex = Integer.toHexString(bytes[i] & 0xFF);					
      if (hex.length() == 1) {					
        sign.append("0");					
      }					
      sign.append(hex.toUpperCase());					
    }					
    return sign.toString();					
  }					
  					
  private static String getResult(String urlStr, String content) {					
    URL url = null;					
    HttpURLConnection connection = null;					
    try {					
      url = new URL(urlStr);					
      connection = (HttpURLConnection) url.openConnection();					
      connection.setDoOutput(true);					
      connection.setDoInput(true);					
      connection.setRequestMethod("POST");					
      connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");					
      connection.setUseCaches(false);					
      connection.connect();					
      					
      DataOutputStream out = new DataOutputStream(connection.getOutputStream());					
      out.write(content.getBytes("UTF-8"));					
      out.flush();					
      out.close();					
      					
      BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));					
      StringBuffer buffer = new StringBuffer();					
      String line = "";					
      while ((line = reader.readLine()) != null) {					
        buffer.append(line);					
      }					
      reader.close();					
					
      return buffer.toString();					
    } catch (IOException e) {					
      e.printStackTrace();					
    } finally {					
      if (connection != null) {					
        connection.disconnect();					
      }					
    }					
    					
    return null;					
  }	
  
  
}
서버 쪽 코드 는 다음 과 같 습 니 다(참고 만 제공).

@RequestMapping("/repairTakeOrder")
	@ResponseBody
	public ResponseVO repairTakeOrder(@RequestBody String jsonStr) {
		logger.info("repairTakeOrder  :" + jsonStr);

		ResponseVO responseVO = null;
		try {
			RepairOrder repairOrder = JackJsonUtil.toBean(jsonStr,
					RepairOrder.class);
			TreeMap<String, String> paramsMap = new TreeMap<String, String>();
			paramsMap.put("gsxx01", repairOrder.getGsxx01());
			paramsMap.put("orderType", repairOrder.getOrderType().toString());
			paramsMap.put("serviceNo", repairOrder.getServiceNo());
			paramsMap.put("vipCard", repairOrder.getVipCard());
			paramsMap.put("customerName", repairOrder.getCustomerName());
			paramsMap.put("customerPhone", repairOrder.getCustomerPhone());
			paramsMap.put("customerTel", repairOrder.getCustomerTel());
			paramsMap.put("province", repairOrder.getProvince());
			paramsMap.put("city", repairOrder.getCity());
			paramsMap.put("county", repairOrder.getCounty());
			paramsMap.put("address", repairOrder.getAddress());
			paramsMap.put("salerCode", repairOrder.getSalerCode());
			paramsMap.put("salerName", repairOrder.getSalerName());
			paramsMap.put("storeCode", repairOrder.getStoreCode());
			paramsMap.put("storeName", repairOrder.getStoreName());
			paramsMap.put("site", repairOrder.getSite());

			paramsMap.put("siteDesp", repairOrder.getSiteDesp());
			paramsMap.put("engineerCode", repairOrder.getEngineerCode());
			paramsMap.put("engineerName", repairOrder.getEngineerName());
			if (repairOrder.getServiceDate() != null) {
				paramsMap.put("serviceDate",
						DateUtils.formatDate(repairOrder.getServiceDate()));
			}

			if (repairOrder.getSalePrice() != null) {
				paramsMap.put("salePrice", repairOrder.getSalePrice()
						.toString());
			}

			paramsMap.put("profitCenter", repairOrder.getProfitCenter());
			paramsMap.put("costCenter", repairOrder.getCostCenter());
			paramsMap.put("gsxx02", repairOrder.getGsxx02());
			paramsMap.put("returnReason", repairOrder.getReturnReason());
			if (repairOrder.getOriOrder() != null) {
				paramsMap.put("oriOrder", repairOrder.getOriOrder().toString());
			}

			if (repairOrder.getOriServiceNo() != null) {
				paramsMap.put("oriServiceNo", repairOrder.getOriServiceNo());
			}

			//       (a=1&b=2)
			String paramSrc = RequestUtils.getParamSrc(paramsMap);
			logger.info("    :" + paramSrc);
			//      
			if (SignUtils.verifymd5(paramSrc, repairOrder.getSign())) {
				//      
				responseVO=erpServiceImpl.repairTakeOrder(repairOrder);
				
			} else {
				responseVO = new ResponseVO();
				responseVO.setSuccess(false);
				responseVO.setErrorMsg("    ");
			}

		} catch (Exception e) {
			logger.error("", e);
			responseVO = new ResponseVO();
			responseVO.setSuccess(false);
			responseVO.setErrorMsg(StringUtils.isNotBlank(e.getMessage()) ? e.getMessage() : "    ");
		}
		return responseVO;

	}
이상 의 자바 Http 인터페이스 에 서명 을 추가 하고 서명 을 검사 하 는 방법 은 바로 작은 편집 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.여러분 께 참고 가 되 고 여러분 들 이 저 희 를 많이 지지 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기