1. Antecedentes comerciales
Recientemente he entrado en contacto con algunas empresas de comercio electrónico y descubrí que al tratar con interfaces comerciales de comercio electrónico, como Taobao e interfaces de pago, ambas partes de la interfaz deben firmar los datos de la interfaz para que los parámetros de datos no hayan sido manipulados durante el proceso de transmisión, y luego verifique los parámetros de la interfaz en el lado del servidor de la interfaz para garantizar que las dos señales sean las mismas. Después de aprobar la verificación, se lleva a cabo el procesamiento de la lógica comercial. Presentemos principalmente las ideas de procesamiento aquí. En cuanto al algoritmo de firma, no lo presentaré demasiado, hay muchos en Internet.
2. Ideas de procesamiento
Las dos partes acordaron que los parámetros se organizan en un orden específico, como en el orden de la primera letra, como URL: http: //xxx/xxx.do? A = wersd & b = sd2354 & c = 4 & firma = xxxxxxxxxxxxxxxxxxxx (la firma es la firma incomed). Después de obtener el parámetro entrante, agregue la cadena del parámetro a = wersd & b = sd2354 & c = 4 de acuerdo con las reglas de firma que acordó, y use MD5 para firmarlo una vez, y luego compararlo con el valor de firma del parámetro entrante para confirmar si la persona que llama es legal. Esta es la idea de la verificación de la firma de la interfaz.
3. Ejercicios de ejemplo
Después de la comunicación entre la interfaz, se alcanzó el siguiente consenso en la interfaz:
1. Notas consulte principalmente al protocolo de la interfaz, tipo de parámetro entrante, algoritmo de firma, formato de archivo, etc.
2. El siguiente es un caso real de una interfaz comercial de comercio electrónico. Las dos partes han acordado la URL de la interfaz, los parámetros comerciales, los parámetros fijos, las firmas y los formatos de datos de retorno.
Al llamar a una interfaz, el código de la persona que llama es el siguiente (solo como referencia): paquete 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.nosuchalgorithmexexception; import java.util.arrayList; import java.util.collections; import java.util.iterator; import java.util.list; import java.util.map; java.util.treemap; public class apitest {static string test_url = "pendiente"; static string test_key = "pendiente"; static string test_sec = "pendiendo"; public static void main (string [] args) lanza sin apoyoguredEncodingException, nosuchalgorithMexxception {string result = getResult (test_url, getReqParam ()); System.out.print (resultado); } cadena estática privada getReqParam () lanza UnsupportedEncodingException, nosuchalgorithMexxception {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", "{/" asignno/":/" test018/"}"); req.put ("s", firmar (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); } signo de cadena estática privada (map <string, string> ParamValues, List <String> IgnoreParamNames, String Secret) arroja NosuchalgorithMexxception, 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); }} Colección.sort (paramNames); sb.append (secreto); for (string paramName: paramName) {sb.append (paramName) .append (paramValues.get (paramName)); } sb.append (secreto); MessageDigest MD = MessageGest.getInstance ("SHA-1"); return byte2hex (md.digest (sb.toString (). getBytes ("utf-8"))); } string static private byte2hex (byte [] bytes) {StringBuilder signo = 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 firm.ToString (); } cadena estática privada getResult (string urlstr, string content) {url url = null; Httpurlconnection conexión = null; intente {url = new URL (urlstr); conexión = (httpurlconnection) url.openconnection (); Connect.SetDoOutput (verdadero); Connect.SetDoInput (verdadero); Connect.SetRequestMethod ("Post"); Connection.SetRequestProperty ("Content-type", "Application/x-www-form-urlencoded; charset = utf-8"); Connect.SetUsecaches (falso); Connection.Connect (); DatautputStream out = new DataOutputStream (Connection.getOutputStream ()); out.write (content.getBytes ("UTF-8")); out.flush (); out.close (); BufferedReader lector = new BufferedReader (new InputStreamReader (Connection.getInputStream (), "UTF-8")); StringBuffer Buffer = new StringBuffer (); Línea de cadena = ""; while ((línea = lector.readline ())! = null) {buffer.append (línea); } lector.close (); return buffer.ToString (); } catch (ioException e) {E.PrintStackTrace (); } finalmente {if (conexión! = null) {Connection.Disconnect (); }} return null; }} El código del lado del servidor es el siguiente (solo como referencia):
@RequestMapping ("/RepairtakeOrder")@ResponseBodyPublice RespuestaVo RepairtakeOrder (@RequestBody String JSonstr) {logger.info ("Parámetro de RepairtakeOrder:" + JSonstr); Response ResponseVo = null; try {RepairOrder RepairOrder = JackJSonUtil.Tobean (JSonstr); RepaeperOnder.class); TreeMSmap <stretOrder, StretOrder = StretOrder = StretOrd TreeMap <String, String> (); paramsmap.put ("gsxx01", reparador.getgsxx01 ()); paramsmap.put ("ordenype", reparador.getOrderType (). ToString ()); paramsmap.put ("ServiceNo", reparorRorder.getServiceno ()); paramsmap.put (("(" "" "" "" "" "" "" "" "" "" "VipCard", "" "" "" "VIPCARD", "" VIPE 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", reparador.getCity ()); paramsmap.put ("condado", reparador.getCounty ()); paramsmap.put ("dirección", reparador.getAddress ()); paramsmap.put ("salerCode", reparador.getSalerCode ()); paramsMap.put ("salername", reparador.getSalername (); reparadora.getstorecode ()); paramsmap.put ("storeName", reparador.getStoreName ()); paramsmap.put ("sitio", reparadora.getSite ()); paramsmap.put ("sitedesp", reparador.getSitedesp (); paramsMap.put ("EngineerCode", RepairOrder. reparador.getEngineNerName ()); if (reparador.getServiceDate ()! = NULL) {paramsMap.put ("ServiceDate", dateUtils.FormatDate (RepairOrder.getServiceDate ()));} if (RepairOrder.getSaleprice ()! = repairOrder.getSalePrice().toString());}paramsMap.put("profitCenter", repairOrder.getProfitCenter());paramsMap.put("costCenter", repairOrder.getCostCenter());paramsMap.put("gsxx02", repairOrder.getGsxx02());paramsMap.put("returnReason", reparador.getreturnRason ()); if (reparador.getoriorder ()! = null) {paramsmap.put ("oriorder", reparador.getoriorder (). toString ());} if (reparador.getoriseriserviceno ()! = null) {paramsmap.put ("oriserviceno cadena original de firma (a = 1 & b = 2) cadena paramsrc = requestuTils.getParamSrc (paramsmap); logger.info ("SignOrder:" + ParamSrc); // Verifique la operación de verificación de la firma If (SignUtils.verifyMD5 (Paramsrc, RepairOrder ResponseVo = erpServiceImpl.RepAirTakEordOrder (reparador);} else {ResponseVo = new ResponseVo (); ResponseVo.SetSuccess (false); ResponseVo.SetErrormSg ("VERIFICACIÓN DE LA VERIFICACIÓN") ResponseVo (); ResponseVo.SetSuccess (false); ResponseVo.SetErrormsg (StringUtils.isnotblank (e.getMessage ())? E.getMessage (): "Excepción de fondo");} return ResponseVo;}El artículo anterior sobre la interfaz Java HTTP Plus y la operación de verificación es todo el contenido que comparto con usted. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.