1. Antecedentes de negócios
Recentemente, entrei em contato com algumas empresas de comércio eletrônico e descobri que, ao lidar com interfaces de negócios de comércio eletrônico, como Taobao e interfaces de pagamento, as duas partes da interface precisam assinar os dados da interface para garantir que os parâmetros de dados não tenham sido adulterados com o processo de transmissão e depois a verificação da interface. Após a passagem da verificação, o processamento da lógica de negócios é realizado. Vamos apresentar principalmente as idéias de processamento aqui. Quanto ao algoritmo de assinatura, não vou apresentar muito, há muitos deles na internet.
2. Idéias de processamento
The two parties agreed that the parameters are arranged in a specific order, such as in the order of the first letter, such as url: http://xxx/xxx.do?a=wersd&b=sd2354&c=4&signature=XXXXXXXXXXXXXXXX(signature is the incoming signature). Depois de obter o parâmetro recebido, adicione a sequência de parâmetros A = WERSD & B = SD2354 & C = 4 De acordo com as regras de assinatura que você concordou e assine -o com o MD5 uma vez e, em seguida, compare -o com o valor de assinatura do parâmetro de entrada para confirmar se o chamador é legal. Esta é a idéia de verificação de assinatura da interface.
3. Exemplo de exercícios
Após a comunicação entre a interface, o seguinte consenso foi alcançado na interface:
1. Notas consulte principalmente o protocolo da interface, tipo de parâmetro recebido, algoritmo de assinatura, formato de arquivo, etc.
2. A seguir, é apresentado um caso real de uma interface de negócios de comércio eletrônico. As duas partes concordaram com o URL da interface, parâmetros de negócios, parâmetros fixos, assinaturas e formatos de dados de retorno.
Ao chamar uma interface, o código do chamador da interface é o seguinte (somente para referência): pacote com.pcmall; importar java.io.bufferedReader; importar java.io.dataoutputStream; importar java.io.ioException; importar java.io.inputStreamReader; import java.io.unsupportEncodingException; import java.net.htttttpurspur; Java.net.urlencoder; importar java.security.messagedigest; importar java.security.nosuchalgorithMexception; importar java.util.arraylist; importação java.utilist.util.collections; import java.util.iterator; importAmil.List.List; ImportMilist; ImportMilist; ImportMilist; ImportMilist; Immport Java.util.util.UtAlT; java.util.treemap; classe pública apitest {static string test_url = "pendente"; String estática test_key = "pendente"; Static String test_sec = "pendente"; public static void main (string [] args) lança UnsupportEdEncodingException, nosuchalgorithMexception {string resultado = getResult (test_url, getReqparam ()); System.out.print (resultado); } String estática privada getReqparam () lança 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", "{/" cessão/":/" test018/"}"); req.put ("s", signo (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")); } retornar param.toString (). Substring (1); } string estática privada Sign (mapa <string, string> paramvalues, list <string> ignoreParamNames, string secret) lança NosuchalgorithMexception, não suportesEnCodingException {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); }} Coleções.sort (paramnames); sb.append (segredo); para (String paramName: paramName) {sb.append (paramname) .append (paramvalues.get (paramname)); } sb.append (segredo); Messagedigest md = Messagedigest.getInstance ("sha-1"); retornar byte2hex (md.digest (sb.toString (). getBytes ("utf-8")))); } String estática privada byte2hex (byte [] bytes) {stringbuilder sinal = new StringBuilder (); para (int i = 0; i <bytes.length; i ++) {string hex = intege.tohexstring (bytes [i] e 0xff); if (hex.Length () == 1) {Sign.append ("0"); } sinal.append (hex.touppercase ()); } return sign.toString (); } String estática privada getResult (string urlstr, string content) {url url = null; Conexão httpurlConnection = null; tente {url = novo url (urlstr); conexão = (httpurlConnection) url.openconnection (); Connection.SetDoOutput (true); Connection.SetDoinput (true); Connection.SetRequestMethod ("Post"); Connection.setRequestProperty ("conteúdo-tipo", "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 (); BUBLEREDRADER LEITOR = new BufferredReader (new InputStreamReader (Connection.getInputStream (), "UTF-8")); StringBuffer buffer = new StringBuffer (); String line = ""; while ((line = reader.readline ())! = null) {buffer.append (line); } leitor.close (); retornar buffer.toString (); } catch (ioexception e) {e.printStackTrace (); } finalmente {if (conexão! = null) {conexão.disconnect (); }} retornar nulo; }} O código do lado do servidor é o seguinte (somente para referência):
@RequestMapping ("/RepakeTeorder")@ResponseBodyPublic ResponseVo RepakeDorder (@RequestBody String jSonstr) {Logger.info ("RepakeDoporar Parâmetro:" + JSonstr); ResponseVo ResponsoVo = NULL; Try {RepairOrder = Jackjsonutil.toBean (JSONSTRONSTNS, TreeMap <String, String> (); ParamsMap.put ("GSXX01", Repairorder.getgsxx01 ()); paramsmap.put ("OrderType", RepairOrder.getOrderTyPe (). RepareRert.getVipcard ()); paramsmap.put ("CustomerName", RepairOrder.getCustomerName ()); paramsmap.put ("Customerphone", Repairorder.getCustomerphone ();); paramsmap.put ("CustomerTel", RepaRorder.getComerTel ()); RepareRert.getProvince ()); paramsmap.put ("City", Repairorder.getCity ()); paramsmap.put ("Condado", RepairOrder.getCounty ()); paramsmap.put ("endereço", recuperação.getAddress ();); RepaROrder.getSalerName ()); paramsmap.put ("storeCode", repareRert.getStoreCode ()); paramsmap.put ("storename", reparetorr.getStorename ()); paramsmap.put ("site", reparetorr.getSite ()); RepareRert.getSitedESP ()); paramsmap.put ("EngineerCode", RepaporOrder.getEngineerCode ()); paramsmap.put ("EngineerName", RepairOrder.getEngineerName ()); if (ReporteTeRerDOrdErtilEn.TeTIdIlTilEn)! . RepareRert.getCostCenter ()); paramsmap.put ("gsxx02", reparetorr.getgsxx02 ()); paramsmap.put ("returnReason", repareRert.getReturnReason ()); if (reparador.getoriordor ()! = null) {paramsMap.put " Reparador.GETORIORDER (). ToString ());} if (RepeLOrder.GetoriserServiceno ()! = NULL) {paramsmap.put ("oriserviceno", ReparErder.getoriserviceno ());} // string string string (a = 1 & b = 2) string ()); RequestUtils.getParamsrc (paramsmap); logger.info ("signoDorder:" + paramsrc); // Verifique a operação de verificação de assinatura se (signoTILS.VILIFYMD5 (paramsrc, repeteRorter.getSign ()) {// Processando lógica de negócios. ResponseVo (); ResponseVo.SetSuccess (false); ResponseVo.SterRormsg ("Falha na verificação do login");}} Catch (Exceção e) {Logger.error ("", e); ResponserVoTerRormSg (); ResponsevO.SetSuccess (False); ResponseVerRormSG (); ResponsevO.SetSuccess (False); e.getMessage (): "Exceção de fundo");} Retornar Responsevo;}O artigo acima sobre a interface Java HTTP Plus e a operação de verificação é todo o conteúdo que compartilho com você. Espero que você possa lhe dar uma referência e espero que você possa apoiar mais o wulin.com.