1. 비즈니스 배경
나는 최근 일부 전자 상거래 사업과 접촉했으며 Taobao 및 지불 인터페이스와 같은 전자 상거래 비즈니스 인터페이스를 처리 할 때 인터페이스 파티가 두 인터페이스 파라미터가 전송 프로세스 중에 변조되지 않도록하기 위해 인터페이스 데이터에 서명해야한다는 것을 발견했습니다. 확인이 통과 된 후 비즈니스 로직 처리가 수행됩니다. 주로 처리 아이디어를 여기에 소개하겠습니다. 서명 알고리즘은 너무 많이 소개하지 않으며 인터넷에 많은 것들이 있습니다.
2. 아이디어 처리
두 당사자는 url : http : //xxx/xxx.do? a = wersd & b = sd2354 & c = 4 & signature = xxxxxxxxxxxxxxx와 같은 첫 번째 문자의 순서와 같이 매개 변수가 특정 순서로 배열된다는 데 동의했습니다 (시그니처는 Incoming Signature). 들어오는 매개 변수를 얻은 후에는 매개 변수 문자열 a = wersd & b = sd2354 & c = 4에 동의 한 서명 규칙에 따라 MD5와 한 번 서명 한 다음 들어오는 매개 변수의 서명 값과 비교하여 발신자가 합법적인지 확인하십시오. 이것은 인터페이스 서명 검증의 아이디어입니다.
3. 예제 연습
인터페이스 간의 통신 후, 인터페이스에서 다음 합의에 도달했습니다.
1. 참고 주로 인터페이스의 프로토콜, 들어오는 매개 변수 유형, 서명 알고리즘, 파일 형식 등을 나타냅니다.
2. 다음은 전자 상거래 비즈니스 인터페이스의 실제 사례입니다. 두 당사자는 인터페이스 URL, 비즈니스 매개 변수, 고정 매개 변수, 서명 및 반환 데이터 형식에 동의했습니다.
인터페이스를 호출 할 때 인터페이스 발신자의 코드는 다음과 같습니다 (참조 만). 패키지 com.pcmall; import java.io.bufferedReader; import java.io.dataOutputStream; import java.io.ioexception; import java.io.inputStreamReader; import java.io.unsupportedEncodexception; import java.net.httpurlConnection; java.net.net.net java.net.urlencoder; import java.security.messagegedigest; import java.security.nosuchalgorithmexception; import java.util.arraylist; import java.util.collections; import java.util.iterator; import java.util.list; java.util.map; java.util.treemap; public class apitest {static string test_url = "pending"; 정적 문자열 test_key = "보류"; 정적 문자열 test_sec = "보류"; public static void main (string [] args)은 unsupportedencodingexception, nosuchalgorithmexception {string result = getResult (test_url, getreqparam ()); System.out.print (결과); } private static string getReqparam ()는 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", "{/"antualno/":/"test018/"}"); req.put ( "s", sign (req, null, test_sec)); StringBuilder param = new StringBuilder (); for (iterator <map.entry <string, string >> it = req.entryset (). iterator (); hasnext ();) {map.Entry <string, string> e = it.next (); param.append ( "&"). Append (e.getKey ()). Append ( "="). Append (urlencoder.encode (e.getValue (), "UTF-8")); } return param.toString (). 서브 스트링 (1); } private static string 부호 (map <string, string> paramvalues, list <string> ingoreparamnames, string secret) nosuchalgorithmexception, unsupportedencodingexception {stringbuilder sb = new StringBuilder (); list <string> paramnames = new arraylist <string> (paramvalues.size ()); paramnames.addall (paramvalues.keyset ()); if (ingoreparamnames! = null && ingoreparamnames.size ()> 0) {for (string gnoreparamname : ingoreparamnames) {paramnames.remove (ingoreparamname); }} collections.sort (paramnames); sb.append (비밀); for (string paramname : paramname) {sb.append (paramname) .append (paramvalues.get (paramname)); } sb.append (비밀); MessageDigest MD = MessageDigest.getInstance ( "SHA-1"); return byte2Hex (md.digest (sb.toString (). getBytes ( "UTF-8"))); } private static string byte2Hex (byte [] bytes) {StringBuilder 부호 = 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; {url = new URL (urlstr); 연결 = (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.setUeCaches (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 (); 문자열 line = ""; while ((line = reader.readline ())! = null) {buffer.append (line); } reader.close (); return buffer.toString (); } catch (ioexception e) {e.printstacktrace (); } 마침내 {if (connection! = null) {connection.disconnect (); }} return null; }} 서버 측 코드는 다음과 같습니다 (참조 만) :
@RequestMapping ( "/RepoytakeOrder")@responseBodyPublic ResponseVO RepairTakeOrder (@RequestBody String JSONST) {Logger.Info ( "RepairTakeOrder 매개 변수 :" + jsonst); responsevo responsevo = null; try {RepairOrder = jackjsonUtil.tobean (jsonst, newford); tritap <, stREEM); treemap <string, string> (); paramsmap.put ( "gsxx01", Repainsorder.getgsxx01 ()); paramsmap.put ( "OrderType", RepairOder.getOrderType (). toString ()); paramsmap.put ( "serviceno", RepainServerCARDER (paramsMap.GetServicEno ()); Reapinalder.getVipCard ()); ParamsMap.put ( "CustomerName", RepainerDer.GetCustomerName ()); ParamsMap.put ( "CustomerPhone", RepairOrder.GetCustomerPhone ()); ParamsMap.put ( "CustomerTel", RepairOrder.GetCustomerTel ()); ParamsMap.put ( "Proves", Reaporiorder.getProvince ()); ParamsMap.put ( "City", RepairOrder.getCity ()); ParamsMap.put ( "County", RepairOrder.getCounty ()); ParamsMap.put ( "address", RepairOrder.getAddress ()); paramsmap.put ( "salercode", paramsmap.getSalerCode ()); Reapinalder.getSalername ()); paramsmap.put ( "storecode", RepairOrder.getStoreCode ()); ParamsMap.put ( "storeName", reacherOrder.getStorEname ()); ParamsMap.put ( "site", reinaroder.getSite ()); ParamsMap.put ( "sitedesp", reapurayOrder.getSitedEsp ()); paramsmap.put ( "엔진 코드", RepairOrder.getEngineErcode ()); paramsmap.put ( "engineername", reachorder.getEngineerName ()); if (reinageOrder.getServedate ()! = null) {null) {servicedate.formatdate (repainricedDate)) (reinageOrder.getSalePrice ()! = null) {paramsmap.put ( "saleprice", reparoder.getSalePrice (). toString ());} paramsmap.put ( "ProfitCenter", reachorder.getProfiter ()); paramsmap.put ( "Costcenter", reapuranorder.getCostCenter ()); ParamsMap.put ( "gsxx02", Repairorder.getgsxx02 ()); paramsmap.put ( "returnReason", RepainReason.GetReturnReason ()); if (reinageCorder ()! = null) {oriorder ", RepairOrder.getoriorder (). toString ());} if (reinageOrder.getoriserviceno ()! = null) {paramsmap.put ( "oriserviceno", reachorder.getoriserviceno ());} // signature original string (a = 1 & b = 2) 문자열 paramsrc = requestUtils.getParamsrc (paramsmap); logger.info ( "signorder :" + paramsrc); // 서명 확인 작업을 확인합니다 (signutils.verifymd5 (paramsrc, reiniforder.getSign ())) {// 비즈니스 로직 responsevo = erpserviceimpl.repairTordorder (repainsvoordorder); responsevo (); responsevo.setsuccess (false); responsevo.seterRormsg ( "로그인 검증 실패");}} catch (예외 e) {logger.error ( "", e); new responsevo (); responsevo.setSuccess (false); responsevo.seterRormsg (strestBo.seterRormsg)? e.getMessage () : "배경 예외");} return responsevo;}Java HTTP Interface Plus 및 Verification Operation의 위의 기사는 내가 공유하는 모든 컨텐츠입니다. 나는 당신이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.