Dalam beberapa tahun terakhir, penggunaan kode QR menjadi semakin makmur. Baru -baru ini, saya telah menemukan pekerjaan yang mengharuskan pemindaian kode QR untuk masuk ke situs web. Jadi saya telah mempelajari mekanisme ini dan menerapkan seluruh proses dengan kode. Selanjutnya, saya akan berbicara dengan Anda tentang login kode QR dan hal -hal lainnya.
Prinsip Kode QR
Kode QR dibuat oleh WeChat. Ketika kami memindai kode QR di WeChat, kami merasa sangat ajaib ketika kami masuk ke halaman web WeChat. Namun, setelah kita memahami prinsip -prinsipnya, itu tidak terlalu ajaib. Kode QR sebenarnya berisi informasi permintaan URL melalui matriks titik hitam dan putih. Pindai kode di terminal, minta URL, dan lakukan operasi yang sesuai.
Prinsip Operasi Pemindaian Kode Umum
Ini adalah prinsip pembayaran kode pemindaian WeChat dan Alipay:
1. Minta kode QR
Desktop memulai permintaan kode QR ke server.
2. Hasilkan kode QR dengan ID unik
Desktop akan secara acak menghasilkan ID, dan ID akan secara unik mengidentifikasi kode QR ini untuk operasi selanjutnya.
3. Pindai kode di papan tulis
Pindai kode QR di terminal seluler untuk menyelesaikan permintaan URL dalam kode QR.
4. Terminal seluler mengirimkan permintaan ke server
Terminal seluler mengirimkan permintaan URL ke server, yang berisi dua informasi. ID unik mengidentifikasi kode mana yang dipindai, dan parameter cookie atau header spesifik di browser di terminal akan mengidentifikasi pengguna mana yang memindai kode.
5. Pemberitahuan sisi server untuk berhasil memindai kode
Ketika server menerima permintaan URL untuk informasi dalam kode QR, sisi pemberitahuan telah berhasil memindai kode dan menambahkan cookie login yang diperlukan dan informasi lainnya. Umumnya ada beberapa metode pemberitahuan di sini: Websocket, Permintaan Pelatihan Hold sampai Timeout, dan Pelatihan membutuhkan beberapa detik.
Seni url dalam kode qr
Bagaimana mewujudkan perbedaan antara kode pemindaian (seperti weChat) antara klien Anda sendiri dan klien lainnya
Misalnya, dalam bisnis, Anda mungkin ingin melakukan ini. Jika kode QR perusahaan Anda dipindai oleh aplikasi lain (seperti WeChat), dan Anda ingin melompat ke halaman prompt, mungkin ada tautan unduhan aplikasi pada halaman prompt; Dan ketika dipindai oleh aplikasi Anda sendiri, buat permintaan yang sesuai secara langsung.
Dalam hal ini, ini dapat dilakukan, semua tautan dalam kode QR dienkripsi dalam satu lapisan, dan kemudian ditangani dengan tautan lain.
Misalnya: www.test.com/qr?p=xxxxxx, parameter P berisi algoritma enkripsi dan dekripsi yang disepakati oleh server dan klien (dapat simetris atau asimetris). Saat memindai kode pada terminal ke jalur spesifik ini, parameter P secara langsung digunakan untuk menyelesaikan parameter P dan mendapatkan www.testqr.com/qrcode?key=s1arv, sehingga permintaan dapat dimulai ke server. Karena klien lain tidak tahu aturan ini, mereka hanya dapat secara langsung meminta www.test.com/qr?p=xxxxxx. Permintaan ini kembali ke halaman prompt.
Cara membuat kode qr lebih sederhana
Sering kali, kuda diminta untuk berlari dan tidak makan rumput. Saya ingin kode QR memiliki banyak parameter, tetapi saya tidak ingin kode QR terlalu rumit dan sulit untuk memindai kode. Pada saat ini, Anda perlu mempertimbangkan cara membuat kode QR sederhana tanpa mempengaruhi bisnis.
Kode sampel
Hasilkan Kode QR (Lepaskan tepi putih dan tambahkan logo tengah)
Perlu mengimpor paket JAR: Zxing's Core-2.0.jar
Impor java.awt.basicstroke; impor java.awt.color; impor java.awt.graphics; impor java.awt.graphics2d; impor java.awt.image; impor java.awt.shape; impor java.awt.geom.roundrecklexle; java.io.bytearrayoutputStream; import java.io.fileoutputStream; import java.io.ioexception; import java.util.hashmap; impor impor. com.google.zxing.multiformatwriter; import com.google.zxing.common.bitmatrix; import com.google.zxing.qrcode.decoder.errorcorrectionLevel; kelas publik qrcodeutil {private static final black black = color.black.get (); private static final int white = color.white.getrgb (); private static final int default_qr_size = 183; string final statis pribadi default_qr_format = "png"; byte final final statis pribadi [] kosong_bytes = byte baru [0]; public static byte [] createQrcode (konten string, ukuran int, ekstensi string) {return createQrcode (konten, ukuran, ekstensi, null); } /** * Generate a QR code with an image* @param content Information to be included in the QR code* @param size Size* @param extension File format extension* @param insertImg The middle logo image* @return */ public static byte[] createQrCode(String content, int size, String extension, Image insertImg) { if (size <= 0) { throw new IllegalArgumentException("size (" + ukuran +") tidak dapat <= 0 "); } BytearrayoutputStream baos = null; coba {peta <encodehinttype, object> hints = new HashMap <encodehintType, object> (); hints.put (encodehinttype.character_set, "UTF-8"); hints.put (encodehinttype.error_correction, errorCorrectionLevel.m); // Gunakan informasi untuk menghasilkan matriks titik dari ukuran yang ditentukan bitmatrix m = multiformatwriter baru (). Encode (konten, barcodeformat.qr_code, ukuran, ukuran, petunjuk); // Hapus White Edge M = UpdateBit (m, 0); Int width = m.getWidth (); int tinggi = m.getHeight (); // Atur informasi dalam bitmatrix ke dalam bufferDimage untuk membentuk gambar buferedImage gambar hitam dan putih = BufferedImage baru (lebar, tinggi, bufferedImage.type_int_rgb); untuk (int i = 0; i <width; i ++) {for (int j = 0; j <height; j ++) {image.setrgb (i, j, m.get (i, j)? Hitam: putih); }} if (insertImg! = null) {// masukkan insertImage gambar logo tengah (gambar, insertImg, m.getWidth ()); } // memperbesar gambar yang menjadi lebih kecil karena penghapusan gambar tepi putih = zoominimage (gambar, ukuran, ukuran); baos = bytearrayoutputStream (); Imageo.write (gambar, ekstensi, BAOS); return baos.tobytearray (); } catch (exception e) {} akhirnya {if (baos! = null) coba {baos.close (); } catch (ioException e) {// TODO AUTO-ENCEALATED Catch Block E.PrintStackTrace (); }} return empted_bytes; } / ** * Kode QR Kustom Lebar tepi putih * @param matrix * @param margin * @return * / private static bitmatrix updateBit (matriks bitmatrix, int margin) {int tempm = margin * 2; int [] rec = matrix.getEnclosingRectangle (); // Dapatkan atribut Pola Kode QR Int Reswidth = Rec [2] + Tempm; int resheight = rec [3] + tempm; Bitmatrix resMatrix = bitmatrix baru (reswidth, resheight); // menghasilkan bitmatrix baru resmatrix.clear () sesuai dengan perbatasan khusus; untuk (int i = margin; i <reswidth - margin; i ++) {// loop untuk menggambar pola kode qr ke bitmatrix baru untuk (int j = margin; j <resheight - margin; j ++) {if (matrix.get (i - margin+rec [0], j - margin+rec [1])))) (i - margin+rec [0], j - margin+rec [1])))) (i - margin+rec [0], j - margin+rec [ }} return resMatrix; } // gambar zoom masuk dan keluar zoominimage buferedImage statis publik (BufferedImage OriginalImage, Int Width, int Height) {bufferedImage newImage = BufferedImage baru (lebar, tinggi, originalImage.getType ()); Grafik g = newImage.getGraphics (); G.DrawImage (originalImage, 0, 0, lebar, tinggi, null); g.dispose (); mengembalikan newImage; } private static void InsertImage (Sumber buferedImage, insertImg gambar, ukuran int) {coba {int width = insertImg.getWidth (null); int tinggi = insertImg.getheight (null); lebar = lebar> ukuran / 6? Ukuran / 6: Lebar; // Atur logo ke seperenam dari ukuran Kode QR Tinggi = Tinggi> Ukuran / 6? Ukuran / 6: Tinggi; Graphics2d Graph = Source.Creategraphics (); int x = (ukuran - lebar) / 2; int y = (ukuran - tinggi) / 2; graph.drawimage (insertImg, x, y, lebar, tinggi, null); Bentuk bentuk = roundrectangle2d.float (x, y, lebar, lebar, 6, 6); graph.setstroke (New BasicStroke (3F)); graph.draw (bentuk); graph.dispose (); } catch (Exception e) {E.PrintStackTrace (); }} public static byte [] createQrcode (string content) {return createqrcode (content, default_qr_size, default_qr_format); } public static void main (string [] args) {coba {fileoutputStream fos = new fileoutputStream ("ab.png"); fos.write (createQrcode ("test")); fos.close (); } catch (Exception e) {// TODO Auto-Entoerated Catch Block E.PrintStackTrace (); }}}Menghasilkan tautan pendek
Ide Dasar:
Teori algoritma pemetaan URL pendek:
1. Gunakan algoritma MD5 untuk menghasilkan string tanda tangan 32-bit, dibagi menjadi 4 segmen, masing-masing segmen dengan 8 karakter.
2. Untuk 4 segmen ini, ambil 8 karakter di setiap segmen, perlakukan sedikit dan pengoperasian string heksadesimal dan 0x3ffffffff (30 bit 1), dan abaikan pemrosesan lebih dari 30 bit.
3. Bagi 30 digit yang diperoleh di setiap segmen menjadi 6 segmen, dan masing-masing angka 5 digit digunakan sebagai indeks alfabet untuk mendapatkan karakter tertentu, dan mendapatkan string 6-bit secara bergantian;
4. String MD5 seperti itu dapat memperoleh 4 string 6-bit, dan salah satu dari mereka dapat digunakan sebagai alamat URL pendek dari URL panjang ini.
5. Yang terbaik adalah menggunakan database nilai kunci untuk menyimpannya. Dalam kasus tabrakan, ganti satu. Jika keempatnya bertabrakan, regenerasi MD5 (karena ada angka acak, MD5 yang berbeda akan dihasilkan)
public class ShortUrlUtil { /** * Pass in 32-bit md5 value* @param md5 * @return */ public static String[] shortUrl(String md5) { // To use the character that generates the URL String[] chars = new String[] { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "v", "w", "x", "y", "" "," "," 1 "," 2 "," 3 "," "" "", "", "1", "2", "3", "4", "" "", "" 6 "," 2 "" 3 "," "" "" "", "a," 6 "7" "," 3 "," 4 "" "" "" "," 6 " "C", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "" z "}; String [] resurl = string baru [4]; untuk (int i = 0; i <4; i ++) {// Masukkan karakter yang dienkripsi sebagai 8 bit adalah satu set hexadecimal dan 0x3ffffffffffff dan lakukan bit dan perhitungan. Jika lebih dari 30 bit diabaikan string stempsubstring = md5.substring (i * 8, i * 8 + 8); // Anda perlu menggunakan tipe panjang untuk dikonversi di sini, karena inteper .parseint () hanya dapat memproses 31 bit, dan bit pertama adalah bit tanda. Jika Anda tidak menggunakan Long, itu akan di luar batas lhexlong = 0x3ffffff & long.parselong (stempsubstring, 16); String outchars = ""; untuk (int j = 0; j <6; j ++) {// Buat nilai yang diperoleh dengan 0x000003D lakukan bit dan operasi untuk mendapatkan indeks chars array chars index long index = 0x0000003D & lHexLong; // Tambahkan outchars karakter yang diperoleh += chars [(int) index]; // Setiap loop bergeser bit dengan 5 bit lhexlong = lHexlong >> 5; } // Simpan string ke array output dari indeks yang sesuai resurl [i] = outchars; } return resurl; } public static void main (string [] args) {string [] test = shorturl ("fdf8d941f23680be79af83f921b107ac"); untuk (string string: test) {system.out.println (string); }}} Catatan: Kode inti tidak asli dan meminjam dari kode orang lain, terima kasih!
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.