1. خلفية الأعمال
لقد تلامس مؤخرًا مع بعض شركات التجارة الإلكترونية ووجدت أنه عند التعامل مع واجهات تجارة التجارة الإلكترونية ، مثل واجهات Taobao وواجهات الدفع ، يحتاج كلا الطرفين إلى توقيع بيانات الواجهة على ضمان عدم وجود معلمات البيانات في الإرسال أثناء عملية النقل أثناء عملية نقل الواجهة على جانب خادم interface لضمان وجود معلمات اثنين. بعد تمرير التحقق ، يتم إجراء معالجة منطق العمل. دعونا نقدم بشكل أساسي أفكار المعالجة هنا. أما بالنسبة لخوارزمية التوقيع ، فلن أقدمها كثيرًا ، فهناك الكثير منها على الإنترنت.
2. معالجة الأفكار
اتفق الطرفان على أن يتم ترتيب المعلمات بترتيب محدد ، كما هو الحال في ترتيب الحرف الأول ، مثل عنوان URL: http: //xxx/xxx.do؟ a = wersd & b = sd2354 & c = 4 & signature = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx فإن التوقيع على التوقيع). بعد الحصول على المعلمة الواردة ، أضف سلسلة المعلمة A = WersD & B = SD2354 & C = 4 وفقًا لقواعد التوقيع التي اتفقت عليها ، واستخدم MD5 للتوقيع عليها مرة واحدة ، ثم قارنها بقيمة توقيع المعلمة الواردة لتأكيد ما إذا كان المتصل قانونيًا. هذه هي فكرة التحقق من توقيع الواجهة.
3. مثال تمارين
بعد التواصل بين الواجهة ، تم التوصل إلى الإجماع التالي على الواجهة:
1. تشير الملاحظات بشكل أساسي إلى بروتوكول الواجهة ، ونوع المعلمة الواردة ، وخوارزمية التوقيع ، وتنسيق الملف ، إلخ.
2. فيما يلي حالة حقيقية لواجهة تجارة الإلكترونية. اتفق الطرفان على عنوان URL للواجهة ، ومعلمات الأعمال ، والمعلمات الثابتة ، والتوقيعات ، وتنسيقات بيانات الإرجاع.
عند استدعاء واجهة ، يكون رمز المتصل الواجهة كما يلي (للرجوع إليه فقط): package com.pcmall ؛ import java.io.bufferedReader ؛ import java.io.dataoutputstream ؛ import java.ioexception ؛ import java.io.inputstreamreader ؛ import java.io.unsupportedencodingexception ؛ import java.net.httpurlconnection ؛ import java. java.net.urlencoder ؛ استيراد java.security.messageDigest ؛ استيراد java.security.nosuchalgorithmexception ؛ استيراد java.util.arraylist Apitest {Static String test_url = "Pending" ؛ Static String Test_Key = "Pending" ؛ Static String test_sec = "معلق" ؛ يرمي الفراغ الثابت العام (السلسلة [] args) UnsupportedEncodingException ، nosuchalgorithMexception {String result = getResult (test_url ، getReqparam ()) ؛ system.out.print (نتيجة) ؛ } سلسلة ثابتة خاصة getReqparam () يلقي UnduportedEncodingException ، 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" ، "{/" issignno/":/" test018/"}") ؛ req.put ("s" ، علامة (req ، null ، test_sec)) ؛ StringBuilder param = new StringBuilder () ؛ لـ (iterator <map.entry <string ، string >> it = req.EntrySet (). iterator () ؛ it.hasnext () ؛) {map.entry <string ، string> e = it.next () ؛ param.append ("&"). append ( } return param.toString (). substring (1) ؛ } علامة سلسلة ثابتة خاصة (خريطة <سلسلة ، سلسلة> paramvalues ، قائمة <string> تجاهل الأسماء ، سرية السلسلة) يلقي nosuchalgorithmexception ، غير مدعوم قائمة <Tring> paramnames = new ArrayList <String> (paramValues.size ()) ؛ paramnames.addall (paramvalues.keyset ()) ؛ if (dectionParamNames! = null && dectionparamnames.size ()> 0) {for (string transerAramName: thunoreParamNames) {paramnames.remove (تجاهل paramname) ؛ }} collections.sort (paramnames) ؛ SB.Append (Secret) ؛ لـ (String paramName: paramName) {sb.append (paramName) .Append (paramValues.get (paramName)) ؛ } sb.append (secret) ؛ messagedigest md = messagedigest.getInstance ("sha-1") ؛ إرجاع Byte2Hex (Md.Digest (SB.ToString (). getBytes ("UTF-8"))) ؛ } private Static String Byte2Hex (byte [] bytes) {StringBuilder sign = new StringBuilder () ؛ لـ (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 () ؛ } سلسلة ثابتة خاصة (سلسلة urlstr ، محتوى السلسلة) {url url = null ؛ httpurlconnection connect = null ؛ حاول {url = url جديد (urlstr) ؛ اتصال = (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 = جديد BufferedReader (New InputStreamReader (connection.getInputStream () ، "UTF-8")) ؛ StringBuffer Buffer = new StringBuffer () ؛ خط السلسلة = "" ؛ بينما ((line = reader.ReadLine ())! = null) {buffer.append (line) ؛ } reader.close () ؛ إرجاع buffer.toString () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ } أخيرًا {if (connection! = null) {connection.disconnect () ؛ }} الإرجاع null ؛ }} رمز جانب الخادم كما يلي (للرجوع إليه فقط):
requestmapping ("/repairTakeOrder")@responsebodypublic responsevo RepairTakeOrder (@requestbody string jsonstr) {logger.info ("repairtakeorder parameter:" + jsonstr) ؛ responsevo responsevo = null ؛ try {repairOrder repairOrder = jackjsonutil.toBean (jsonstr. treemap <string ، string> () ؛ paramsmap.put ("gsxx01" ، repairOrder.getGsxx01 ()) ؛ paramsmap.put ("ordertype" ، repairOrdorder.getOrderType (). repairOrder.getVipCard ()) ؛ paramsmap.put ("customername" ، repairOrder.getCustomerName ()) ؛ paramsmap.put ("هاتف العميل" ، repairOrdorder.getCustomerPhone ()) RepairOrder.getProvince ()) ؛ paramsmap.put ("City" ، RepairOrder.getCity ()) ؛ paramsmap.put ("County" ، RepairOrder.getCounty ()) ؛ repairOrder.getSalerName ()) ؛ paramsmap.put ("storecode" ، repairOrder.getStorEcode ()) ؛ paramsmap.put ("storename" ، repairOrder.getStorEname ()) ؛ paramsmap.put ("الموقع" ، إصلاح. repairOrder.getSitiDESP ()) ؛ paramsmap.put ("EngineerCode" ، repairOrder.getEngineerCode ()) ؛ paramsmap.put ("actaringername" ، repairorder.getEngineerName ()) ؛ if (repairOrder.getServicedate ()! = null) {paramsmap.put ("servicedate ، (repairOrder.getSalePrice ()!! = null) {paramsmap.put ("saleprice" ، repairOrder.getSalePrice (). repairOrder.getCostCenter ()) ؛ paramsmap.put ("gsxx02" ، repairOrder.getGsxx02 ()) ؛ paramsmap.put ("returnreason" ، repairOrder.getReturnReason ()) ؛ if (repairOrdorder.getoriorder ()! = null) {paramsmap.pp. RepairOrder.getoriorder (). requestUtils.getParamSrc (paramsmap) ؛ logger.info ("signorder:" + paramsrc) ؛ // Responsevo () ؛ reponsevo.setsuccess (false) ؛ desponsevo.seterrormsg ("فشل التحقق من تسجيل الدخول") ؛}} catch (استثناء e) {logger.error ("" ، e) ؛ responsevo = new responsevo () E.GetMessage (): "استثناء الخلفية") ؛} response responsevo ؛}المقالة أعلاه على واجهة Java HTTP Plus وعملية التحقق هي كل المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.