1. พื้นหลังธุรกิจ
เมื่อเร็ว ๆ นี้ฉันได้ติดต่อกับธุรกิจอีคอมเมิร์ซบางแห่งและพบว่าเมื่อต้องจัดการกับอินเทอร์เฟซธุรกิจอีคอมเมิร์ซเช่น Taobao และอินเทอร์เฟซการชำระเงินทั้งสองฝ่ายอินเตอร์เฟสจำเป็นต้องลงนามในข้อมูลอินเทอร์เฟซเพื่อให้แน่ใจว่าพารามิเตอร์ข้อมูลไม่ได้ถูกดัด หลังจากผ่านการตรวจสอบแล้วการประมวลผลตรรกะทางธุรกิจจะดำเนินการ มาแนะนำแนวคิดการประมวลผลที่นี่เป็นหลัก สำหรับอัลกอริทึมลายเซ็นฉันจะไม่แนะนำมันมากเกินไปมีจำนวนมากบนอินเทอร์เน็ต
2. แนวคิดการประมวลผล
ทั้งสองฝ่ายตกลงกันว่าพารามิเตอร์จะถูกจัดเรียงตามลำดับที่เฉพาะเจาะจงเช่นในลำดับของตัวอักษรตัวแรกเช่น url: http: //xxx/xxx.do? a = wersd & b = sd2354 & c = 4 & signature = xxxxxxxxxxxxxxxxxxxxxx หลังจากที่คุณได้รับพารามิเตอร์ที่เข้ามาแล้วเพิ่มพารามิเตอร์สตริง a = wersd & b = SD2354 & c = 4 ตามกฎลายเซ็นที่คุณเห็นด้วยและใช้ MD5 เพื่อลงนามครั้งเดียวแล้วเปรียบเทียบกับค่าลายเซ็นของพารามิเตอร์ขาเข้าเพื่อยืนยันว่าผู้โทรถูกกฎหมายหรือไม่ นี่คือแนวคิดของการตรวจสอบลายเซ็นอินเตอร์เฟส
3. ตัวอย่างแบบฝึกหัด
หลังจากการสื่อสารระหว่างอินเทอร์เฟซแล้วฉันทามติต่อไปนี้ได้มาถึงอินเทอร์เฟซ:
1. หมายเหตุส่วนใหญ่อ้างถึงโปรโตคอลของอินเตอร์เฟสประเภทพารามิเตอร์ขาเข้าอัลกอริทึมลายเซ็นรูปแบบไฟล์ ฯลฯ
2. ต่อไปนี้เป็นกรณีจริงของอินเทอร์เฟซธุรกิจอีคอมเมิร์ซ ทั้งสองฝ่ายได้ตกลงกันใน URL อินเทอร์เฟซพารามิเตอร์ทางธุรกิจพารามิเตอร์คงที่ลายเซ็นและรูปแบบข้อมูลส่งคืน
เมื่อเรียกอินเทอร์เฟซรหัสของผู้โทรอินเตอร์เฟสมีดังนี้ (สำหรับการอ้างอิงเท่านั้น): แพ็คเกจ com.pcmall; นำเข้า java.io.bufferedreader; นำเข้า java.io.dataoutputstream; นำเข้า java.io.ioexception; นำเข้า java.io.inputstreamreader; นำเข้า Java.io.unsupportencodexception; java.net.urlencoder; นำเข้า java.security.messagedigest; นำเข้า Java.security.nosuchalgorithmexception; นำเข้า java.util.arraylist; นำเข้า java.util.collections; java.util.treemap; คลาสสาธารณะ apitest {String String test_url = "รอดำเนินการ"; String String test_key = "รอดำเนินการ"; String String test_sec = "รอดำเนินการ"; โมฆะคงที่สาธารณะหลัก (String [] args) พ่น unsupportencodingexception, nosuchalgorithmexception {string result = getResult (test_url, getReqparam ()); System.out.print (ผลลัพธ์); } สตริงคงที่ส่วนตัว getreqparam () พ่น unsupportencodexception, 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", "{/" asyno/":/" test018/"}"); req.put ("s", sign (req, null, test_sec)); StringBuilder param = new StringBuilder (); สำหรับ (iterator <map.entry <string, string >> it = req.entryset (). iterator (); it.hasnext ();) {map.entry <สตริง, สตริง> e = it.next (); param.append ("&"). ผนวก (e.getKey ()). ผนวก ("="). ผนวก (urlencoder.encode (e.getValue (), "UTF-8")); } return param.toString (). substring (1); } เครื่องหมายสตริงคงที่ส่วนตัว (แผนที่ <สตริง, สตริง> paramValues, รายการ <String> ไม่รู้ชื่อ, ความลับของสตริง) พ่น nosuchalgorithMexception, unsupportencodexception {stringbuilder sb = new StringBuilder (); รายการ <String> paramNames = new ArrayList <String> (paramValues.size ()); paramnames.addall (paramvalues.keyset ()); if (ไม่รู้ชื่อ! = null && conlondereparamnames.size ()> 0) {สำหรับ (สตริงไม่รู้ parumeparamname: ความไม่รู้ชื่อ) {paramnames.remove }} collections.sort (paramnames); sb.append (ความลับ); สำหรับ (สตริง paramName: paramName) {sb.append (paramName) .Append (paramValues.get (paramName)); } sb.append (ความลับ); MESAGEDIGEST MD = MESEGATEGEST.GETINSTANCE ("SHA-1"); Return Byte2Hex (Md.Digest (sb.toString (). getBytes ("UTF-8"))); } สตริงคงที่ส่วนตัว byte2Hex (ไบต์ [] ไบต์) {StringBuilder sign = new StringBuilder (); สำหรับ (int i = 0; i <bytes.length; i ++) {string hex = integer.tohexstring (ไบต์ [i] & 0xff); if (hex.length () == 1) {sign.append ("0"); } sign.append (hex.touppercase ()); } return sign.toString (); } สตริงคงที่ส่วนตัว getResult (string urlstr, เนื้อหาสตริง) {url url = null; การเชื่อมต่อ httpurlConnection = null; ลอง {url = url ใหม่ (urlstr); การเชื่อมต่อ = (httpurlConnection) url.openconnection (); Connection.setDooutput (จริง); Connection.setDoInput (จริง); Connection.setRequestMethod ("โพสต์"); Connection.setRequestProperty ("เนื้อหาประเภท", "แอปพลิเคชัน/x-www-form-urlencoded; charset = utf-8"); Connection.setUsecaches (เท็จ); Connection.connect (); dataOrtputStream out = new dataOutputStream (Connection.getOutputStream ()); out.write (content.getBytes ("UTF-8")); out.flush (); out.close (); bufferedReader reader = new BufferedReader (ใหม่ inputStreamReader (Connection.getInputStream (), "UTF-8")); StringBuffer buffer = new StringBuffer (); สตริงบรรทัด = ""; ในขณะที่ ((line = reader.readline ())! = null) {buffer.append (บรรทัด); } reader.close (); return buffer.toString (); } catch (ioexception e) {e.printstacktrace (); } ในที่สุด {ถ้า (การเชื่อมต่อ! = null) {connection.disconnect (); }} return null; - รหัสฝั่งเซิร์ฟเวอร์มีดังนี้ (สำหรับการอ้างอิงเท่านั้น):
@RequestMapping ("/repairtakeOrder")@responsebodypublic responsevo remaptakeOrder (@requestbody สตริง jsonstr) {logger.info ("parameter remaptakeorder:" + jsonsters); ResponsEvo ResponsEvo = null; ลอง {remageRorder treemap <string, string> (); paramsmap.put ("gsxx01", repairorder.getgsxx01 ()); paramsmap.put ("orderType", repairOrder.getOrderType (). toString (); repairorder.getVipcard ()); paramsmap.put ("customername", repairorder.getCustomerName ()); paramsmap.put ("customerphone", repairorder.getCustomerphone ()); paramsmap.put ("customerTel" repairorder.getCity ()); paramsmap.put ("เคาน์ตี", repairorder.getCounty ()); paramsmap.put ("ที่อยู่", repairorder.getAddress ()); paramsmap.put ("salercode", repairorder.getSalerCode ()); paramsmap.put ("salername" repairorder.getStorEcode ()); paramsmap.put ("storename", repairorder.getStorename ()); paramsmap.put ("site", repairorder.getSite ()); paramsmap.put ("SiteStesp", repairorder.getSitedEsp (); paramsmap.put ( repairorder.getEngineERNAME ()); ถ้า (repairOrder.getServiceDate ()! = null) {paramsmap.put ("serviceDate", dateutils.formatdate (repairorder.getServiceDate ()); repairorder.getSalePrice (). toString ());} paramsmap.put ("ProfitCenter", recackorder.getProfitCenter ()); paramsmap.put ("costCenter", recackorder.getCostCenter ()); paramsmap.put ("GSXX02" repairorder.getReturnReason ()); ถ้า (repairorder.getoriorder ()! = null) {paramsmap.put ("oriorder", repairorder.getoriorder (). toString ());} ถ้า (repairorder.getoriserviceno ()! = null) {paramsmap.put ( สตริงต้นฉบับลายเซ็น (a = 1 & b = 2) สตริง paramsrc = requestutils.getParamsrc (paramsmap); logger.info ("SignOrder:" + paramsrc); // ตรวจสอบการดำเนินการตรวจสอบลายเซ็นถ้า (signutils.verifymd5 (paramsrc ResponsEvo = erpserviceimpl.RepairTakeOrder (repairorder);} else {responsEvo = new ResponsEvo (); ResponsEvo.SetSuccess (เท็จ); ResponsEvo.SeterRormsg ("การตรวจสอบเข้าสู่ระบบล้มเหลว");}} จับ ResponsEvo (); ResponsEvo.SetSuccess (false); ResponsEvo.SeterRormsg (stringutils.isnotblank (e.getMessage ())? e.getMessage (): "ข้อยกเว้นพื้นหลัง");} return responsevo;}บทความข้างต้นเกี่ยวกับ Java HTTP Interface Plus และการดำเนินการตรวจสอบเป็นเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น