في السنوات الأخيرة ، أصبح استخدام رموز QR أكثر ازدهارًا. لقد واجهت مؤخرًا وظيفة تتطلب مسح رمز الاستجابة السريعة لتسجيل الدخول إلى الموقع. لذلك لقد درست هذه الآلية وقمت بتطبيق العملية بأكملها مع الكود. بعد ذلك ، سأتحدث معك عن تسجيل الدخول إلى رمز الاستجابة السريعة وأشياء أخرى.
مبدأ رمز الاستجابة السريعة
تم إنشاء رمز الاستجابة السريعة بواسطة WeChat. عندما نقوم بمسح رمز الاستجابة السريعة على WeChat ، شعرنا بالسحر الشديد عندما دخلنا في صفحة الويب الخاصة بـ WeChat. ومع ذلك ، بعد أن نفهم مبادئها ، ليس الأمر سحريًا. يحتوي رمز الاستجابة السريعة في الواقع على معلومات طلب عنوان URL من خلال مصفوفة DOT بالأبيض والأسود. مسح الرمز على المحطة ، واطلب عنوان URL ، وقم بالعملية المقابلة.
مبدأ عملية مسح الكود العام
هذا هو مبدأ تسجيل الدخول إلى WeChat ودفع رمز المسح الضوئي:
1. طلب رمز الاستجابة السريعة
يبدأ سطح المكتب طلب رمز الاستجابة السريعة إلى الخادم.
2. قم بإنشاء رمز الاستجابة السريعة مع معرف فريد
سيقوم سطح المكتب بإنشاء معرف بشكل عشوائي ، وسيقوم المعرف بتحديد رمز الاستجابة السريعة هذا بشكل فريد للعمليات اللاحقة.
3. مسح الرمز على اللوحة
مسح رمز الاستجابة السريعة على محطة الهاتف المحمول لحل طلب عنوان URL في رمز الاستجابة السريعة.
4. يرسل محطة الهاتف المحمول طلبًا إلى الخادم
ترسل محطة الهاتف المحمول طلب URL إلى الخادم ، والذي يحتوي على معلوماتين. يحدد المعرف الفريد الرمز الذي تم مسحه ضوئيًا ، وسيقوم معلمات ملفات تعريف الارتباط أو الرأس المحددة في المتصفح على المحطة بتحديد أي المستخدم يقوم بمسح الكود.
5. إشعار من جانب الخادم لمسح الرمز بنجاح
عندما يتلقى الخادم طلب عنوان URL للمعلومات الموجودة في رمز الاستجابة السريعة ، قام جانب الإخطار بمسح الكود بنجاح وأضاف ملفات تعريف الارتباط الضرورية والمعلومات الأخرى. هناك عمومًا عدة طرق للإخطار هنا: WebSocket ، طلب التدريب حتى المهلة ، والتدريب يستغرق عدة ثوان.
فن عنوان URL في رمز الاستجابة السريعة
كيفية إدراك الفرق بين رموز المسح (مثل WeChat) بين العميل الخاص بك والعميل الآخر
على سبيل المثال ، في العمل ، قد ترغب في القيام بذلك. إذا تم مسح رمز الاستجابة السريعة لشركتك بواسطة تطبيقات أخرى (مثل WeChat) ، وكنت ترغب في القفز إلى صفحة موجهة ، يمكن أن يكون هناك رابط تنزيل تطبيق في صفحة المطالبة ؛ وعندما يتم مسحه ضوئيًا بواسطة التطبيق الخاص بك ، قم بتقديم الطلب المقابل مباشرة.
في هذه الحالة ، يمكن القيام بذلك ، يتم تشفير جميع الروابط في رمز الاستجابة السريعة في طبقة واحدة ، ثم يتم التعامل معها برابط آخر.
على سبيل المثال: www.test.com/qr؟p=xxxxxx ، تحتوي المعلمة P على خوارزمية التشفير وفك التشفير المتفق عليها الخادم والعميل (يمكن أن تكون متماثلة أو غير متناظرة). عند مسح الرمز على المحطة على هذا المسار المحدد ، يتم استخدام المعلمة P مباشرة لحل المعلمة P والحصول على www.testqr.com/qrcode؟key=S1Arv ، بحيث يمكن بدء الطلب إلى الخادم. نظرًا لأن العملاء الآخرين لا يعرفون هذه القاعدة ، يمكنهم فقط طلب www.test.com/qr؟p=xxxxxx. يعود هذا الطلب إلى صفحة المطالبة.
كيفية جعل رمز الاستجابة السريعة أكثر بساطة
في كثير من الأحيان ، يُطلب من الخيول الجري وعدم تناول العشب. أريد أن يحتوي رمز الاستجابة السريعة على العديد من المعلمات ، لكنني لا أريد أن يكون رمز الاستجابة السريعة معقدًا للغاية ومن الصعب فحص الرمز. في هذا الوقت ، تحتاج إلى التفكير في كيفية جعل رمز الاستجابة السريعة بسيطًا دون التأثير على العمل.
نموذج الرمز
قم بإنشاء رمز الاستجابة السريعة (قم بإزالة الحواف البيضاء وأضف الشعار الأوسط)
بحاجة إلى استيراد حزمة الجرة: Zxing's Core-2.0.jar
استيراد java.awt.basicstroke ؛ استيراد java.awt.color ؛ استيراد java.awt.graphics java.io.bytearrayoutputstream ؛ import java.io.fileOutputStream ؛ import java.io.ioException ؛ استيراد java.util.hashmap ؛ استيراد java.util.map ؛ import javax.imageio.imageio com.google.zxing.multiformatwriter ؛ import com.google.zxing.common.bitmatrix ؛ import com.google.zxing.qrcode.decoder.errorcorrectlevel ؛ public class qrcodeutil {private static final int black. private Static Final int white = color.white.getrgb () ؛ int static int int default_qr_size = 183 ؛ Static Final String Default_Qr_Format = "PNG" ؛ بايت نهائي ثابت خاص [] فارغ_ها = بايت جديد [0] ؛ البايت الثابت العام [] CreateQrCode (محتوى السلسلة ، حجم int ، تمديد السلسلة) {return createQrcode (المحتوى ، الحجم ، الامتداد ، null) ؛ } / *** قم بإنشاء رمز QR مع صورة* param معلومات المحتوى ليتم تضمينها في رمز QR* size size size* param extruction extension* param insertimg صورة الشعار الأوسط* @return* / public static byte [] createqrcode (content content ، int extension ، صورة إدانة الصورة) + ") لا يمكن أن يكون <= 0") ؛ } bytearrayoutputstream baos = null ؛ جرب {map <encodeHintType ، Object> Hints = new HashMap <EncodeHintType ، Object> () ؛ Hints.put (Encodehinttype.character_set ، "UTF-8") ؛ hints.put (EncodeHintType.error_correction ، errorcorrectlevel.m) ؛ // استخدم المعلومات لإنشاء مصفوفة DOT من Bitmatrix ذات الحجم المحدد M = جديد multiformatwriter () // إزالة الحافة البيضاء m = updateBit (m ، 0) ؛ عرض int = m.getWidth () ؛ ارتفاع int = m.getheight () ؛ // قم بتعيين المعلومات الموجودة في Bitmatrix في bufferdimage لتشكيل صورة بالأبيض والأسود bufferedImage = جديد bufferedImage (العرض ، الارتفاع ، bufferedImage.type_int_rgb) ؛ لـ (int i = 0 ؛ i <width ؛ i ++) {for (int j = 0 ؛ j <height ؛ j ++) {image.setrgb (i ، j ، m.get (i ، j)؟ Black: White) ؛ }} if (insertimg! = null) {// insert the middle logo image insertimage (Image ، insertimg ، m.getWidth ()) ؛ } // تكبير الصورة التي تصبح أصغر بسبب إزالة صورة الحافة البيضاء = ZoominImage (الصورة ، الحجم ، الحجم) ؛ baos = جديد bytearrayoutputstream () ؛ imageio.write (الصورة ، الامتداد ، baos) ؛ إرجاع baos.tobytearray () ؛ } catch (استثناء e) {} أخيرًا {if (baos! = null) حاول {baos.close () ؛ } catch (ioException e) {// todo acto catch block e.printstacktrace () ؛ }} return freed_bytes ؛ } / ** * Custom QR Code White Edge Width * param matrix * param margin * @return * / private static bitmatrix updatebit (bitmatrix matrix ، int margin) {int tempm = margin * 2 ؛ int [] rec = matrix.getenclosingRectangle () ؛ // احصل على سمة نمط رمز QR int int recwidth = rec [2] + tempm ؛ int resheight = rec [3] + tempm ؛ bitmatrix resmatrix = new bitmatrix (reswidth ، resheight) ؛ // إنشاء bitmatrix جديد resmatrix.clear () وفقا للحدود المخصصة ؛ لـ (int i = margin ؛ i <reswidth - margin ؛ i ++) {// loop لرسم نمط رمز QR إلى bitmatrix الجديد لـ (int j = margin ؛ j <resheight - margin ؛ j ++) {if (matrix.get (i - margin+rec [0] ، j - margin+rec [1])) }} return resmatrix ؛ } // صورة تكبير وخارج ZoominImage ZoominImage الثابتة العامة (intricalImage ، عرض int ، ارتفاع) {bufferedImage newImage = new BufferedImage (العرض ، الارتفاع ، الأصلي. الرسومات g = newImage.getGraphics () ؛ G.DrawImage (OriginalImage ، 0 ، 0 ، العرض ، الارتفاع ، NULL) ؛ G.Dispose () ؛ إرجاع Newimage ؛ } insertimage private static void (مصدر bufferedImage ، إدراج الصورة ، حجم int) {try {int width = insertimg.getWidth (null) ؛ ارتفاع int = insertimg.getheight (null) ؛ العرض = العرض> الحجم / 6؟ الحجم / 6: العرض ؛ // قم بتعيين الشعار إلى سادس واحد من حجم ارتفاع رمز QR = الارتفاع> الحجم / 6؟ الحجم / 6: الارتفاع ؛ Graphics2d Graph = source.creategraphics () ؛ int x = (الحجم - العرض) / 2 ؛ int y = (الحجم - الارتفاع) / 2 ؛ graph.drawImage (insertimg ، x ، y ، width ، height ، null) ؛ شكل الشكل = جديد RoundRectangle2d.float (x ، y ، العرض ، العرض ، 6 ، 6) ؛ Graph.SetStroke (New BasicStroke (3F)) ؛ graph.draw (الشكل) ؛ graph.dispose () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }} البايت الثابت العام [] CreateQrCode (content content) {return createQrcode (content ، default_qr_size ، default_qr_format) ؛ } public static void main (string [] args) {try {fileOutputStream fos = new FileOutputStream ("ab.png") ؛ fos.write (createQrcode ("test")) ؛ fos.close () ؛ } catch (استثناء e) {// todo catch e.printstacktrace () ؛ }}}توليد روابط قصيرة
الأفكار الأساسية:
نظرية خوارزمية تعيين URL القصيرة:
1. استخدم خوارزمية MD5 لإنشاء سلسلة توقيع 32 بت ، مقسمة إلى 4 قطاعات ، كل قطعة بها 8 أحرف.
2. بالنسبة لهذه الأجزاء الأربعة ، خذ 8 أحرف في كل جزء ، وعلاملها قليلاً وتشغيل السلسلة السداسية و 0x3ffffffff (30 بت 1) ، وتجاهل معالجة أكثر من 30 بت.
3. قسّم الـ 30 رقمًا تم الحصول عليه في كل جزء إلى 6 قطاعات ، ويتم استخدام كل رقم 5 أرقام كفهرس الأبجدية للحصول على أحرف محددة ، والحصول على سلسلة 6 بت بدورها ؛
4. يمكن لهذا سلسلة MD5 الحصول على 4 سلاسل 6 بت ، ويمكن استخدام أي منها كعنوان URL القصير لهذا عنوان URL الطويل.
5. من الأفضل استخدام قاعدة بيانات ذات قيمة رئيسية لتخزينها. في حالة الاصطدام ، استبدل واحد. إذا كانت جميع الأربعة تصادمين ، تجدد MD5 (نظرًا لوجود أرقام عشوائية ، سيتم إنشاء MD5 مختلف)
الفئة العامة ShortUrlutil { / ** * تمرير في قيمة 32 بت MD5 * param md5 * @regurn * / سلسلة ثابتة عامة [] ShortUrl (سلسلة md5) {// لاستخدام الحرف الذي يولد سلسلة url []] "K" ، "L" ، "M" ، "N" ، "O" ، "P" ، "Q" ، "R" ، "S" ، "T" ، "U" ، "V" ، "V" ، "W" ، "X" ، "C" ، "D" ، "E" ، "F" ، "G" ، "H" ، "I" ، "J" ، "K" ، "L" ، "M" ، "N" ، "O" ، "P" ، " String [] Resurl = سلسلة جديدة [4] ؛ لـ (int i = 0 ؛ i <4 ؛ i ++) {// ضع الأحرف المشفرة حيث أن 8 بت هي مجموعة من السداسي عشرة و 0x3ffffffffff وأداء البت والحسابات. إذا تم تجاهل أكثر من 30 بت سلسلة stempsubstring = md5.substring (i * 8 ، i * 8 + 8) ؛ // تحتاج إلى استخدام النوع الطويل للتحويل هنا ، لأن IntePer .ParseInt () يمكنه معالجة 31 بت فقط ، والبت الأول هو بت. إذا لم تستخدم طويلاً ، فسيكون ذلك خارج الحدود LUM LHEXLONG = 0x3FFFFFFFF & Long.Parselong (Stempsubstring ، 16) ؛ سلسلة Outchars = "" ؛ لـ (int j = 0 ؛ j <6 ؛ j ++) {// ، قم بإجراء القيمة التي تم الحصول عليها مع 0x000003d أداء وتشغيل للحصول على فهرس chars chars حرف طويل = 0x0000003d & lhexlong ؛ // إضافة الأحرف التي تم الحصول عليها Outchars += chars [(int) index] ؛ // يتم تحويل كل حلقة إلى اليمين بمقدار 5 بتات lhexlong = lhexlong >> 5 ؛ } // حفظ السلسلة في صفيف الإخراج من الفهرس المقابل Resurl [i] = Outchars ؛ } return resurl ؛ } main static void main (string [] args) {string [] test = ShortUrl ("FDF8D941F23680BE79AF83F921B107AC") ؛ لـ (سلسلة السلسلة: اختبار) {system.out.println (string) ؛ }}} ملاحظة: الرمز الأساسي ليس أصليًا ويقترض من رمز الآخرين ، شكرًا لك!
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.