1. Деловой опыт
Недавно я вступил в контакт с некоторыми предприятиями электронной коммерции и обнаружил, что при работе с бизнес-интерфейсами электронной коммерции, такими как интерфейсы Taobao и платеж, обе стороны интерфейса должны подписать данные интерфейса, чтобы гарантировать, что параметры данных не были подвязаны во время процесса передачи, а затем проверяли параметры интерфейса на интерфейсном сервере, чтобы гарантировать, что двое признаков. После того, как проверка проходит, выполняется обработка бизнес -логики. Давайте в основном представим здесь идеи обработки. Что касается алгоритма подписи, я не буду его слишком много, в Интернете их много.
2. Идеи обработки
Обе стороны согласились с тем, что параметры расположены в определенном порядке, например, в порядке первой буквы, например, url: http: //xxx/xxx.do? A = wersd & b = sd2354 & c = 4 & signature = xxxxxxxxxxxx (подписи подписи). После того, как вы получите входящий параметр, добавьте строку параметра a = wersd & b = sd2354 & c = 4 в соответствии с правилами подписи, с которыми вы согласились, и используйте MD5, чтобы подписать его один раз, а затем сравните его со значением подписи входящего параметра, чтобы подтвердить, является ли вызывающий абонент законным. Это идея проверки подписи интерфейса.
3. Пример упражнений
После связи между интерфейсом был достигнут следующий консенсус на интерфейсе:
1. Примечания в основном обращайтесь к протоколу интерфейса, входящему типу параметра, алгоритму подписи, формату файла и т. Д.
2. Ниже приведен реальный случай бизнес-интерфейса электронной коммерции. Обе стороны согласились с URL -адресом интерфейса, бизнес -параметрам, фиксированным параметрам, подписями и форматам возврата данных.
При вызове интерфейса код абонента интерфейса выглядит следующим образом (только для ссылки): пакет com.pcmall; import java.io.bufferedReader; импорт java.io.dataoutputStream; импорт java.io.ioexception; import java.io.inputStreamReader; импорт java.io.unsupportedEncodingexception; импорт java.net.httpurlconnection; import.net.net.net.net.net.net.net.net.net.net.net.net. java.net.urlencoder; Import java.security.messagedigest; импорт java.security.nosuchalgorithmexception; import java.util.arraylist; import java.util.collections; import java.util.iterator; импорт java.util.list; import java.tiL Apitest {static String test_url = "warning"; статическая строка test_key = "warding"; статическая строка test_sec = "warding"; public static void main (String [] args) бросает UnsupportedEncodingException, noshuchalgorithmexception {String result = getResult (test_url, getReqparam ()); System.out.print (результат); } частная статическая строка getReqparam () бросает unsupportedencodingexception, noshuchalgorithmexception {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", "{/" assessingno/":/" test018/"}"); req.put ("s", знак (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: igenoreParamNames) {paramnames.remove (ignoreParamName); }} Collections.sort (paramnames); SB.Append (секрет); for (string paramname: paramname) {sb.append (paramname) .append (paramvalues.get (paramname)); } sb.append (секрет); MessagegeIgest MD = MOSSAGEDIGEST.GETINSTANCE ("SHA-1"); вернуть byte2Hex (md.digest (sb.toString (). getBytes ("UTF-8"))); } частная статическая строка 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 (); } частная статическая строка getResult (string urlstr, string content) {url url = null; Httpurlconnection connection = null; try {url = new url (urlstr); connection = (httpurlconnection) url.openconcenection (); 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 (); } наконец {if (connection! = null) {connection.disconnect (); }} return null; }} Код на стороне сервера выглядит следующим образом (только для ссылки):
@Requestmapping ("/reporttakeOrder")@responsebodypublic responsevo RepairtakeOrder (@Requestbody String JSonstr) {logger.info ("Parameter Order Order:" + JSonstr); responsevo responsevo = null; try {repormorder restrectorder = jackjsonutil.tobean (jsond jsonster, repair drempass); TreeMap <string, string> (); paramsmap.put ("gsxx01", repormord.getgsxx01 ()); paramsmap.put ("ortorytype", repormord.getOrderType (). ToString ()); ParamSmap.put ("serviceno", repacerOder.getServiceno (); REPARTORORD.GetVipCard ()); ParamsMap.Put («CustomerName», RepairOrder.getCustomerName ()); ParamSmap.Put («CustomerPhone», RephipOrder.getCustomerPhone ()); ParamsMap.Put («CustomerTel», RephipOrder.getCustomertel (); ParamsMap.put ("ProvineL", reportOrder.getCustomertel (); REPAPTORDORD.GETPROVINCE ()); ParamsMap.Put («City», REPAMPORDORD.GETCITY ()); PARAMSMAP.PUT («Округ», REPAPTORD.GETCOUNTY ()); PARAMSMAP.PUT («Адрес», REPAPTORDORD.GETADDRESS ()); PARAMSMAP.PUT («SALERCODE», REPAPTORDORDERCODE (); PARAMAP.PUT («SALERCODE», REPAPTORDORDERCODE (); REPARTORORD.GetSAlerName ()); ParamSmap.Put («StoreCode», RephipOrder.getStoreCode ()); ParamsMap.put («Storename», RephipOrder.getStorEname ()); ParamsMap.put («site», RepairOrder.GetSite ()); REPAPTORDORD.GETSITEDESP ()); PARAMSMAP.PUT ("EngineCode", ResiptionOrder.getEngineerCode ()); ParamsMap.Put ("EngineName", ResiptionROUST.GETENGINEERNAME ()); if (REPAMERORD.GETSERVIDATE ()! (Repair dorder.getSalePrice ()! = null) {paramsmap.put ("saleprice", repormorder.getsaleprice (). ToString ());} paramsmap.put ("refortcenter", ResiptionRord.getProfitCenter ()); ParamSmap.Put ("Costenter", REPARTORORD.GetCostCenter ()); ParamsMap.Put ("gsxx02", repormord.getgsxx02 ()); paramsmap.put ("returnReason", repormOrder.getReturnReason ()); if (repormorder.getoriorder ()! = null) {paramsmap.put ("oriorder", ", getoriorder ()! REPARTORORD.GetoriOrder (). ToString ());} if (repormOrder.getoriserviceNo ()! = null) {paramsmap.put ("oriserviceNo", repormorder.getOriserviceNo ());} // Разделитель подписи исходной строки (a = 1 & b = 2) string paramsrc =);} // RequestUtils.getParamSrc (paramsMap); logger.info ("signorder:" + paramsrc); // Проверьте операцию проверки подписи if (signutils.verifymd5 (paramsrc, repormorder.getsign ())) {// repressing logic responsevo = erpserviceimpl.repairtakeorder (resportord); Responsevo (); responsevo.setsuccess (false); responsevo.seterrormsg ("Неудача проверки входа");}} catch (exception e) {logger.error (", e); responsevo = new responsevo (); outs.setsuccess (false); ouncesvo.seterromsg (stringsnoTbrank (worseSscess (worseSsnotbrank? e.getmessage (): "founal Exception");} return responsevo;}Приведенная выше статья на Java HTTP Interface Plus и Operation Verification - это все контент, которым я делюсь с вами. Я надеюсь, что вы можете дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.