1。ビジネスの背景
私は最近、いくつかのeコマース事業と接触し、Taobaoや支払いインターフェイスなどのeコマースビジネスインターフェイスを扱うとき、両方のインターフェイスパーティーがインターフェイスデータに署名する必要があることを発見しました。検証が渡された後、ビジネスロジック処理が実行されます。主に処理のアイデアをここで紹介しましょう。署名アルゴリズムについては、あまり紹介しません。インターネットには多くのものがあります。
2。アイデアの処理
両当事者は、url:http://xxx/xxx.do?a = wersd&b = sd2354&c = 4&signature = xxxxxxxxxxxxxxxxx(署名)(署名))など、最初の文字の順序など、パラメーターが特定の順序で配置されることに同意しました。着信パラメーターを取得したら、パラメーター文字列a = wersd&b = sd2354&c = 4を追加し、合意した署名ルールに従ってmd5で署名し、着信パラメーターの署名値と比較して、発信者が合法かどうかを確認します。これは、インターフェイスの署名検証のアイデアです。
3。例の運動
インターフェース間の通信後、インターフェイスで次のコンセンサスに達しました。
1。ノート、主にインターフェイスのプロトコル、着信パラメータータイプ、署名アルゴリズム、ファイル形式などを参照してください。
2。以下は、eコマースビジネスインターフェイスの実際のケースです。 2つの当事者は、インターフェイスURL、ビジネスパラメーター、固定パラメーター、署名、および返信データ形式について合意しています。
インターフェイスを呼び出すとき、インターフェイス発信者のコードは次のとおりです(参照のみ)。パッケージcom.pcmall; Import java.io.bufferedreader; Import java.io.dataoutputStream; Import java.io.ioexception; Import java.io.inputStreamReader; Import java.io.unsupportedencodingexception; java.net.urlencoder; Import java.security.messagegest; Import java.security.nosuchalgorithmexception; Import java.util.arraylist; Import java.util.collections; Import Java.util.iterator; Import Java.util.util.util.util.util.util. java.util.treemap; public class apitest {static string test_url = "pesting"; static string test_key = "pending";静的文字列test_sec = "pending"; public static void main(string [] args)throws unsupportedencodingexception、nosuchalgorithmexception {string result = getResult(test_url、getReqparam()); System.out.print(result); } private static string getReqParam()SLOWS 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"、 "{/" assignno/":/" test018/"}"); req.put( "s"、sign(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")); } param.toString()。サブストリング(1)を返します。 } private static string sign(map <string、string> paramvalues、list <string> nignoreparamnames、string secret)nosuchalgorithmexception、unsupportedencodingexception {stringbuilder sb = new StringBuilder(); List <String> paramNames = new ArrayList <String>(paramvalues.size()); paramnames.addall(paramvalues.keyset()); if(IngroreParamnames!= null && ingroreparamnames.size()> 0){for(string ingoreparamname:nignoreparamnames){paramnames.remove(ingroreparamname); }} collections.sort(paramnames); sb.append(secret); for(string paramname:paramname){sb.append(paramname).append(paramvalues.get(paramname)); } sb.append(secret); MESSAGEDGEST MD = MESSAGEDGEST.GETINSTANCE( "SHA-1"); return byte2hex(md.digest(sb.tostring()。getBytes( "utf-8"))); } private static string 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(); } private static string getResult(string urlstr、string content){url url = null; httpurlconnection connection = null; try {url = new url(urlstr); connection =(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();文字列line = ""; while((line = reader.readline())!= null){buffer.append(line); } reader.close(); return buffer.toString(); } catch(ioexception e){e.printstacktrace(); }最後に{if(connection!= null){connection.disconnect(); }} nullを返します。 }}サーバー側のコードは次のとおりです(参照のみ):
@RequestMapping( "/RepairTakeOrder")@ResponseBodyPublic Responsevo RepairTakeOrder(@RequestBody String jsonstr){logger.info( "RepairTakeOrderパラメーター:" + jSonstr); Responsevo Responsevo = null; try {Repairsordorder Repairide Order = JackJSonutil.Tobean treemap <string、string>(); paramsmap.put( "gsxx01"、repairorder.getgsxx01(); paramsmap.put( "ordertype"、repairordordertype()。toString()。 RepairOrder.getVipCard()); paramsMap.put( "CustomerName"、RepairOrder.getCustomername()); paramsmap.put( "CustomerPhone"、RepairOrder.getCustomerPhone()); RepairOrder.getProvince()); paramsmap.put( "city"、riapeorder.getCity()); paramsmap.put( "County"、RepairOrder.getCounty()); paramsmap.put( "address"、RepairOrder.getAddress(); RepairOrder.getSalername()); paramsmap.put( "storecode"、repairorder.getStoreCode()); paramsmap.put( "storename"、repairorder.getStorename()); paramsmap.put( "site"、repairsord.getsite()); paramsmap.put( " Repaer Order.GetSitedESP()); ParamsMap.put( "EngineerCode"、RepairOrder.GetEngineCode(); ParamsMap.put( "EngineName"、RepairOrder.getEnginERNAME()); if(RepairOrder.getServiceate()!= null){null){paramsmap.put( "servicedate"、dationtils.friontils.brestdate() (RepairOrder.getSalePrice()!= null){paramsmap.put( "saleprice"、repairorder.getSaleprice()。toString());} paramsmap.put( "profitcenter"、repairorder.getprofitcenter(); paramsmap.put( "Costenterter"、 RepairOrder.getCostCenter()); paramsmap.put( "gsxx02"、RepairOrder.getGSXX02()); paramsmap.put( "ReparnReason"、RepairOrder.GetRunReason()); RepairOrder.getOriorder()。toString());} if(RepairOrder.getoriserviceno()!= null){paramsmap.put( "oriserviceno"、repairorder.getoriserviceno());} //スプリットシグネチャオリジナル文字列(a = 1&b = 2) requestutils.getParamsrc(paramsmap); logger.info( "signorder:" + paramsrc); //署名検証操作を確認します(signutils.verifymd5(paramsrc、repairorder.getsign()){//ビジネスロジック応答vo = erpserviceimpl.repairtakeOrder(ReparyAirtodervo); responsevo(); responsevo.setsuccess(false); responsevo.setErrormsg( "login vidification failed");}} catch(exception e){logger.error( ""、e); new Responsevo(); responsvo.setsucces(false); responseRormsg(sintersutils.snotblank(); e.getmessage(): "background exception");} return responsevo;}Java HTTP Interface Plusおよび検証操作に関する上記の記事は、私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。