В последние годы использование QR -кодов становилось все более и более процветающим. Недавно я столкнулся с работой, которая требует сканирования QR -кода для входа на веб -сайт. Поэтому я изучил этот механизм и внедрил весь процесс с кодом. Далее я поговорю с вами о входе в систему QR -кода и о других вещах.
Принцип QR -кода
QR -код был создан WeChat. Когда мы сканируем QR -код на WeChat, мы чувствовали себя очень волшебными, когда вошли в веб -страницу WeChat. Однако после того, как мы поймем его принципы, это не так волшебно. QR -код фактически содержит информацию о запросе URL через черно -белую матрицу Dot. Сканируйте код на терминале, запросите URL и выполните соответствующую операцию.
Принцип операции сканирования общего кода
Это принцип выплаты входа WeChat и платежа сканирования Alipay:
1. Запросить QR -код
Настольный компьютер инициирует запрос QR -кода на сервер.
2. Сгенерировать QR -код с уникальным идентификатором
Настольный компьютер будет случайным образом генерировать идентификатор, и идентификатор будет однозначно идентифицировать этот QR -код для последующих операций.
3. сканировать код на доске
Сканируйте QR -код на мобильном терминале для решения запроса URL в QR -коде.
4. Мобильный терминал отправляет запрос на сервер
Мобильный терминал отправляет запрос URL на сервер, который содержит две информации. Уникальный идентификатор идентифицирует, какой код сканируется, и конкретные параметры cookie или заголовка в браузере на терминале определят, какой пользователь сканирует код.
5. Уведомление на стороне сервера для успешного сканирования кода
Когда сервер получает запрос URL для информации в QR -коде, сторона уведомления успешно отсканировала код и добавил необходимые файлы cookie и другую информацию. Обычно здесь есть несколько методов уведомления: WebSocket, запрос на обучение до тайм -аута и обучение занимает несколько секунд.
Искусство URL в QR -коде
Как реализовать разницу между кодами сканирования (например, WeChat) между вашим собственным клиентом и другим клиентом
Например, в бизнесе вы можете сделать это. Если QR -код вашей компании отсканируется другими приложениями (например, WeChat), и вы хотите перейти на страницу с приглашением, на странице приложения может быть ссылка загрузки приложения; И когда оно отсканируется вашим собственным приложением, сделайте соответствующий запрос напрямую.
В этом случае это можно сделать, все ссылки в QR -коде зашифрованы в одном слое, а затем обрабатываются с другой ссылкой.
Например: www.test.com/qr?p=xxxxxx, параметр p содержит алгоритм шифрования и дешифрования, согласованный сервером и клиентом (может быть симметричным или асимметричным). При сканировании кода на терминале по этому конкретному пути параметр p напрямую используется для решения параметра P и получить www.testqr.com/qrcode?key=s1arv, чтобы запрос мог быть инициирован на сервер. Поскольку другие клиенты не знают этого правила, они могут напрямую запрашивать www.test.com/qr?p=xxxxxx. Этот запрос возвращается на страницу приглашения.
Как упростить QR -код
Много раз лошадей просят бежать, а не есть траву. Я хочу, чтобы QR -код имел много параметров, но я не хочу, чтобы QR -код был слишком сложным, и трудно сканировать код. В настоящее время вам нужно подумать о том, как сделать QR -код простым, не влияя на бизнес.
Пример кода
Создать QR -код (удалить белые края и добавить средний логотип)
Необходимо импортировать пакет JAR: Zxing's Core-2.0.jar
Импорт java.awt.basicsstroke; импорт java.awt.color; импорт java.awt.graphics; импорт java.awt.graphics2d; импорт java.awt.image; импорт java.awt.shape; импорт java.awt.geom.roundrectangle2d; импорт java.avage.burfure.burfure.burfure.burfure.burfure.burfure.burfure.burfure. java.io.bytearrayoutputstream; import java.io.fileOutputStream; импорт java.io.ioexception; import java.util.hashmap; импорт java.util.map; импорт javax.imageio.imageio; импорт com.google.zxing.barcodeformat; импорт. com.google.zxing.multiformatwriter; import com.google.zxing.common.bitmatrix; import com.google.zxing.qrcode.decoder.errorcorrectionlevel; открытый класс qrcodeutil {private static final int black = color.black.getrgb (); Частный статический конечный int white = color.white.getrgb (); Private Static Final int default_qr_size = 183; частная статическая конечная строка default_qr_format = "png"; Частный статический финальный байт [] empty_bytes = new Byte [0]; public static byte [] createqrcode (String Content, int size, string endension) {return createqrcode (содержимое, размер, расширение, null); } / **** Сгенерировать QR -код с изображением* @param Content information, которая будет включена в QR -код* @param размер размера* @param расширение формата расширения* @param Insertimg Среднее изображение логотипа* @return* / public Static Byte [] CreateQrcode (String Content, Inte Size, string Extension, Image Insertimg) {if size <= 0). (" + size +") не может быть <= 0 "); } BytearrayOutputStream baos = null; try {map <encodehinttype, object> ntsts = new hashmap <encodehinttype, object> (); nts.put (encodehinttype.character_set, "utf-8"); nts.put (encodehinttype.error_correction, errorcorrectionlevel.m); // Использование информации для генерации точечной матрицы указанного размера Bitmatrix M = new MultiformatWriter (). Encode (Содержание, Barcodeformat.qr_code, размер, размер, подсказки); // Удалить белый край m = updatebit (m, 0); int width = m.getwidth (); int height = m.getheight (); // Установите информацию в растровой битматрице в буфердимаж, чтобы сформировать черно -белое изображение BufferedImage Image = new BufferedImage (ширина, высота, bufferedimage.type_int_rgb); for (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) {// вставить среднее изображение логотипа Insertimage (image, insertimg, m.getWidth ()); } // Увеличение изображения, которое становится меньше из -за удаления белого края изображения = Zoominimage (изображение, размер, размер); baos = new BytearrayOutputStream (); Imageio.write (изображение, расширение, баос); вернуть baos.tobytearray (); } catch (Exception e) {} наконец {if (baos! = null) try {baos.close (); } catch (ioException e) {// todo автоматически сгенерированный блок e.printstacktrace (); }} return yate_bytes; } / ** * Пользовательский QR -код ширина белого края * @param matrix * @param margin * @return * / private static bitmatrix updatebit (bitmatrix matrix, int margin) {int tempm = margin * 2; int [] rec = matrix.getEnclosingRectangle (); // Получить атрибут шаблона QR -кода int reswidth = rec [2] + tempm; int resheight = rec [3] + tempm; Bitmatrix resmatrix = new Bitmatrix (Reswidth, Resheight); // генерировать новую битматрикс Resmatrix.clear () в соответствии с пользовательской границей; для (int i = margin; i <reswidth - margin; i ++) {// цикл, чтобы нарисовать шаблон QR кода в новую растрою для (int j = margin; j <resheight - margin; j ++) {if (matrix.get (i - margin+rec [0], j - margin+rec [1])) {resmatrix }} return resmatrix; } // Изображение Zoom In and Out Public Static BufferedImage Zoominimage (BufferedImage OriginalImage, int width, int height) {bufferemage newimage = new BufferedImage (ширина, высота, оригинал gettype ()); Graphics g = newimage.getGraphics (); g.drawimage (OriginalImage, 0, 0, ширина, высота, нулевая); g.dispose (); вернуть Newimage; } private static void insertimage (BufferedImage Source, Image insertimg, int size) {try {int width = insertimg.getwidth (null); int height = insertimg.getheight (null); ширина = ширина> размер / 6? размер / 6: ширина; // Установить логотип на одну шесту от размера QR-кода высота = высота> размер / 6? размер / 6: высота; Graphics2d graph = source.creategraphics (); int x = (размер - ширина) / 2; int y = (размер - высота) / 2; graph.drawimage (insertimg, x, y, width, высота, нулевая); Форма формы = новый Roundrectangle2d.float (x, y, ширина, ширина, 6, 6); graph.setstroke (New BasicStroke (3F)); graph.draw (форма); 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) {try {fileOutputStream fos = new FileOutputStream ("ab.png"); fos.write (createqrcode ("test")); fos.close (); } catch (Exception e) {// todo автоматически сгенерированный блок e.printstacktrace (); }}}Генерировать короткие ссылки
Основные идеи:
Теория алгоритма картирования короткого URL:
1. Используйте алгоритм MD5 для генерации 32-разрядной подписи строки, разделенной на 4 сегмента, каждый сегмент с 8 символами.
2. Для этих 4 сегментов возьмите 8 символов в каждом сегменте, рассматривайте его как немного и работу шестнадцатеричной строки и 0x3ffffffff (30 бит 1) и игнорируйте обработку более 30 бит.
3. Разделите 30 цифр, полученные в каждом сегменте на 6 сегментов, и каждое 5-значное число используется в качестве индекса алфавита для получения определенных символов и получения 6-битной строки по очереди;
4. Такая строка MD5 может получить 4 6-битные строки, и любой из них может использоваться в качестве короткого адреса URL этого длинного URL.
5. Лучше всего использовать базу данных ключей для ее хранения. В случае столкновения замените один. Если все четыре сталкиваются, регенерируйте MD5 (поскольку существуют случайные числа, генерируются разные MD5)
открытый класс ShortUrlutil { / ** * Пропустите 32-битное значение MD5 * @param md5 * @return * / public static String [] shortUrl (String md5) {// Использовать символ, который генерирует url string [] chars = new String [] {«a», «B», «C», «D», «e», ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",", ",". " «K», «L», «M», «N», «O», «P», «Q», «R», «S», «T», «U», «V», «V», «W», «X», «Y», «Z», «0», «1», «2», 3 «», «4», «7», «7», «7», «7», «7», «7", ",", ",", ",", ",", ",", "," 2 ",", ",". " "C", "D", "E", "F", "G", "H", "I", "J", "k", "L", "M", "n", "O", "P", "q", "R", "S", "t", "u", "V", "w", "x", "y", "Z"}; String [] resurl = new String [4]; Для (int i = 0; i <4; i ++) {// Поместите зашифрованные символы как 8 бит - это набор шестнадцатеричных и 0x3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe и выполните биты и расчеты. Если более 30 бит игнорируется String Stempsubstring = md5.substring (i * 8, i * 8 + 8); // Вам нужно использовать длинный тип для преобразования здесь, потому что Inteper .parseint () может обрабатывать только 31 бит, а первый бит - это бит знака. Если вы не используете длинные, это будет вне границ Long Lhexlong = 0x3ffffffff & long.parselong (Stempsubstring, 16); String outchars = ""; для (int j = 0; j <6; j ++) {// Сделайте полученное значение с 0x000003d выполнить бит и операцию, чтобы получить индекс массива символов Long Index = 0x0000003d & lHexlong; // Добавить полученные символы Outchars += chars [(int) index]; // Каждый цикл сменен в правом бите на 5 бит lHexlong = lHexlong >> 5; } // Сохранить строку в выходной массив соответствующего индекса Resurl [i] = outchars; } return resurl; } public static void main (string [] args) {string [] test = shortUrl ("fdf8d941f23680be79af83f921b107ac"); for (String String: test) {System.out.println (String); }}} Примечание: основной код не является оригинальным и заимствует из кода других людей, спасибо!
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.