1. Contexte commercial
Je suis récemment entré en contact avec certaines entreprises de commerce électronique et j'ai constaté que lorsqu'ils traitent des interfaces commerciales de commerce électronique, telles que Taobao et les interfaces de paiement, les deux parties d'interface doivent signer les données d'interface afin de vous assurer que les paramètres de données n'ont pas été falsifiés pour assurer le processus de transmission, puis de vérifier les paramètres d'interface de l'interface du serveur pour assurer que les deux signatures sont les même. Une fois la vérification passée, le traitement de la logique métier est effectué. Préduisons principalement les idées de traitement ici. Quant à l'algorithme de signature, je ne le présenterai pas trop, il y en a beaucoup sur Internet.
2. Idées de traitement
Les deux parties ont convenu que les paramètres sont organisés dans un ordre spécifique, comme dans l'ordre de la première lettre, tels que URL: http: //xxx/xxx.do? A = wersd & b = sd2354 & c = 4 & signature = xxxxxxxxxxxxxx (signature est la signature de rendez-vous). Après avoir obtenu le paramètre entrant, ajoutez la chaîne de paramètre a = wersd & b = sd2354 & c = 4 selon les règles de signature que vous avez acceptées, et utilisez MD5 pour le signer une fois, puis le comparer avec la valeur de signature du paramètre entrant pour confirmer si l'appelant est légal. C'est l'idée de vérification de la signature d'interface.
3. Exemples d'exercices
Après la communication entre l'interface, le consensus suivant a été atteint sur l'interface:
1. Les notes se réfèrent principalement au protocole de l'interface, au type de paramètre entrant, à l'algorithme de signature, au format de fichier, etc.
2. Ce qui suit est un vrai cas d'une interface commerciale de commerce électronique. Les deux parties ont convenu de l'URL d'interface, des paramètres commerciaux, des paramètres fixes, des signatures et des formats de données de retour.
Lors de l'appel d'une interface, le code de l'appelant d'interface est le suivant (pour référence uniquement): package com.pcmall; importer java.io.buffereDader; import java.io.dataoutputStream; import java.io.ioException; import java.io.inputstreamreader; import java.io.unsupportedEncodingException; import java.net.httpurlconnection; import java.net.url; java.net.urlencoder; import java.security.messagedigest; import java.security.nosuchalgorithmexception; import java.util.arraylist; import java.util.collections java.util.iterator; import java.util.list; import java.util.map; import java.Telete Apitest {static string test_url = "en attente"; statique string test_key = "en attente"; statique statique test_sec = "en attente"; public static void main (String [] args) lève unportdencodingException, nosuchalgorithMexception {String result = getResult (test_url, getReqParam ()); System.out.print (résultat); } chaîne statique privée getReqParam () lève unportedEncodingException, 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", "{/" attributiontno / ": /" test018 / "}"); req.put ("s", signe (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); } signe de chaîne statique privée (map <string, string> paramvalues, list <string> ignoreParamNames, String Secret) lève nosuchalgorithMexception, unportEncodEndingException {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); }} Collection.Sort (paramNames); SB.APPEND (secret); for (String paramname: paramname) {sb.append (paramname) .append (paramvalues.get (paramname)); } sb.append (secret); MessagediGest MD = MessagediGest.getInstance ("Sha-1"); RETOUR BYTE2HEX (MD.DIGEST (SB.TOSTRING (). GetBytes ("UTF-8"))); } String statique privé 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 (); } String statique privé getResult (String urlstr, contenu de chaîne) {url url = null; HttpurlConnection Connection = null; essayez {url = new url (urlstr); connexion = (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 (); Chaîne line = ""; while ((line = reader.readline ())! = null) {buffer.append (line); } reader.close (); retour tamper.toString (); } catch (ioException e) {e.printStackTrace (); } enfin {if (connection! = null) {connection.disconnect (); }} return null; }} Le code côté serveur est le suivant (pour référence uniquement):
@Requestmapping ("/ réparpakeOrder") @ ResponseBodyPublic ResponseVo RepairTakeOrder (@Requestbody String JSONTON Treemap <String, String> (); paramsmap.put ("gsxx01", réparateur.getgsxx01 ()); paramsmap.put ("OrderType", réparorMorder.getOrderType (). ToString ()); paramsmap.put ("ServiceNo", réparateur.getServiceNo ()); paramsmap. réparationOrder.getVipCard ()); paramsmap.put ("Customername", réparateur.getCustomEnName ()); paramsmap.put ("CustomerPhone", réparororder.getCustomerPhone ()); paramsmap.put ("province", répartition réparationOrder.getProvince ()); paramsmap.put ("City", réparation.GetCity ()); paramsmap.put ("comté", réparation.getCounty ()); paramsmap.put ("adresse", réparateur.getsAlerccode ()); paramsmap.put. réparation Order.getsalername ()); paramsmap.put ("StoreCode", réparateur.getStoreCode ()); paramsmap.put ("storename", réparateur.getStoRename ()); paramsmap.put ("Site", réparateur.getSite ()); paramsmap.put ("SiteSesp",, réparateur réparationOrder.getSiteSesp ()); paramsmap.put ("EngineerCode", réparation. (réparation Order.getsAleprice ()! = null) {paramsmap.put ("Saleprice", réparateur.getsaleprice (). toString ());} paramsmap.put ("ProfitCenter", réparateur.getProfitCenter ()); paramsmap.put ("costcenter",. réparation Ordre.GetCostCenter ()); paramsmap.put ("gsxx02", réparateur.getgsxx02 ()); paramsmap.put ("returnReason", réparation.GetReturnReason ()); if (réparateur.getOrorder ()! = null) {paramsmap.put ("oriorder",, réparation Ordre.GetOrorder (). ToString ());} if (réparation.getORiserviceo ()! = null) {paramsmap.put ("oriserviceo", réparateur. RequestUtils.getParamsrc (paramsmap); logger.info ("Signorder:" + paramsrc); // vérifie l'opération de vérification de signature if (SignUtils.verifymd5 (paramsrc, réparation. Responsevo (); Responsevo.SetSuccess (false); ResponseVo.SetterRormsg ("La vérification de la connexion a échoué");}} catch (exception e) {logger.error ("", e); Responsevo = new Responsevo (); Responsevo.SetSuccess (false); Responsevo.seTerrormsg (startutils.isnotblank (E.Gessage ())? e.getMessage (): "Exception d'arrière-plan");} return Responsevo;}L'article ci-dessus sur l'interface plus et l'opération de vérification Java HTTP est tout le contenu que je partage avec vous. J'espère que vous pourrez vous faire référence et j'espère que vous pourrez soutenir Wulin.com plus.