精华内容
下载资源
问答
  • 扫码枪对接api
    2021-05-05 06:08:30

    let code = '';

    let lastTime, nextTime;

    let lastCode, nextCode;

    window.document.onkeypress = (e) => {

    if (window.event) { // IE

    nextCode = e.keyCode;

    } else if (e.which) { // Netscape/Firefox/Opera

    nextCode = e.which;

    }

    if (nextCode === 13) {

    if (code.length < 3) return; // 手动输入的时间不会让code的长度大于2,所以这里只会对扫码枪有

    console.log(code); // 获取到扫码枪输入的内容,做别的操作

    code = '';

    lastCode = '';

    lastTime = '';

    return;

    }

    nextTime = new Date().getTime();

    if (!lastTime && !lastCode) {

    code += e.key;

    }

    if (lastCode && lastTime && nextTime - lastTime > 30) { // 当扫码前有keypress事件时,防止首字缺失

    code = e.key;

    } else if (lastCode && lastTime) {

    code += e.key;

    }

    lastCode = nextCode;

    lastTime = nextTime;

    }

    PS:下面看下js获取USB扫码枪数据的代码

    前言

    找了很多相关的教程不太好用,汲取各家之长总结精简了一下

    原理扫码枪扫描到的条形码每一位会触发一次onkeydown事件

    比如扫描条码位‘1234567890'的条形码,会连续执行10次onkeydown事件

    条码扫描到最后一位,会直接触发Enter

    需要引入jQuery,我这里用的是vue

    window.onload = (e)=> {

    document.onkeydown = (e)=> {

    let nextCode,nextTime = '';

    let lastTime = this.lastTime;

    let code = this.code;

    if (window.event) {// IE

    nextCode = e.keyCode

    } else if (e.which) {// Netscape/Firefox/Opera

    nextCode = e.which

    }

    nextTime = new Date().getTime();

    //字母上方 数字键0-9 对应键码值 48-57; 数字键盘 数字键0-9 对应键码值 96-105

    if((nextCode>=48&&nextCode<=57) || (nextCode>=96&&nextCode<=105)){

    let codes = {'48':48,'49':49,'50':50,'51':51,'52':52,'53':53,'54':54,'55':55,'56':56,'57':57,

    '96':48,'97':49,'98':50,'99':51,'100':52,'101':53,'102':54,'103':55,'104':56,'105':57

    };

    nextCode = codes[nextCode];

    nextTime = new Date().getTime();

    }

    // 第二次输入延迟两秒,删除之前的数据重新计算

    if(nextTime && lastTime && nextTime-lastTime>2000){

    code = String.fromCharCode(nextCode);

    }else{

    code += String.fromCharCode(nextCode)

    }

    // 保存数据

    this.nextCode = nextCode;

    this.lastTime = nextTime;

    this.code = code;

    // 键入Enter

    if(e.which == 13) {

    // 判断 code 长度(这里就获取到条码值了,以下业务自由发挥)

    code = $.trim(code)

    if (code.length == 13) {

    this.$message('A类条码:' + code);

    } else if (code.length == 23) {

    this.$message('B类条码:' + code);

    } else if (code.length == 0) {

    this.$message('请输入条码');

    } else{

    this.$message('条码不合法:' + code);

    }

    //键入回车务必清空code值

    this.code = ''

    return false;

    }

    }

    }

    总结

    到此这篇关于js 获取扫码枪输入数据的文章就介绍到这了,更多相关js 获取扫码枪输入数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!推荐教程:《JS教程》

    更多相关内容
  • 笔者最近接到了这样一个需求,需要对接扫码枪并获取扫码枪扫出来的值; 2.实现思路 2.1.构思 使用生产者消费者模式作为整体架构设计,生产者持续监听输入直到生成一个链接,然后将该链接放入一个阻塞队列中,消费者...

    1.前言

    笔者最近接到了这样一个需求,需要对接扫码枪并获取扫码枪扫出来的值;

    2.实现思路

    2.1.构思

    使用生产者消费者模式作为整体架构设计,生产者持续监听输入直到生成一个链接,然后将该链接放入一个阻塞队列中,消费者会不断从该阻塞队列中消费产品,若队列为空,则阻塞直至消费到产品;

    2.1.持续读取键盘缓冲区

    2.1.1.原理

    扫码枪默认模式是会将扫出来的值输出到键盘缓冲区中,这样就可以直接在文本框上打出来;
    通过观察得知,

    1. 计算机对于每一个字符并不是按照ASCII规则,而是按照其内部自定义的编码输出,因此需要对每一个字符进行转换,准换成标准ASCII;
    2. 计算机使用SHIFT区分大小写以及其他字符如 ",:,+,这类字符同大写一样,需要先按住SHIFT,因此可通过这个方式区分字符
      是否有经过SHIFT转义,且键盘中输出的字符默认全为大写;
    2.1.2.具体实现 (Java)
    //字符转换
    
    //若前一个字符是SHIFT,则需要转换
        private void initWithShiftCharacter() {
            particularKeyToLetterWithShift.put(192, '~');
            particularKeyToLetterWithShift.put(49, '!');
            particularKeyToLetterWithShift.put(50, '@');
            particularKeyToLetterWithShift.put(51, '#');
            particularKeyToLetterWithShift.put(52, '$');
            particularKeyToLetterWithShift.put(53, '%');
            particularKeyToLetterWithShift.put(54, '^');
            particularKeyToLetterWithShift.put(55, '&');
            particularKeyToLetterWithShift.put(56, '*');
            particularKeyToLetterWithShift.put(57, '(');
            particularKeyToLetterWithShift.put(48, ')');
            particularKeyToLetterWithShift.put(189, '_');
            particularKeyToLetterWithShift.put(187, '+');
            particularKeyToLetterWithShift.put(219, '{');
            particularKeyToLetterWithShift.put(221, '}');
            particularKeyToLetterWithShift.put(220, '|');
            particularKeyToLetterWithShift.put(186, ':');
            particularKeyToLetterWithShift.put(222, '"');
            particularKeyToLetterWithShift.put(188, '<');
            particularKeyToLetterWithShift.put(190, '>');
            particularKeyToLetterWithShift.put(191, '?');
        }
    
    //若前一个字符不是SHIFT,则无需转换
        private void initWithoutShiftCharacter() {
            particularKeyToLetterWithoutShift.put(189, '-');// - ok
            particularKeyToLetterWithoutShift.put(187, '=');
            particularKeyToLetterWithoutShift.put(219, '[');//{ ok
            particularKeyToLetterWithoutShift.put(221, ']');
            particularKeyToLetterWithoutShift.put(220, '\\');// \ ok
            particularKeyToLetterWithoutShift.put(186, ';');//: ok
            particularKeyToLetterWithoutShift.put(222, '\'');
            particularKeyToLetterWithoutShift.put(188, ',');
            particularKeyToLetterWithoutShift.put(190, '.');
            particularKeyToLetterWithoutShift.put(191, '/');
            particularKeyToLetterWithoutShift.put(107, '+');
            particularKeyToLetterWithoutShift.put(109, '-');
            particularKeyToLetterWithoutShift.put(106, '*');
            particularKeyToLetterWithoutShift.put(111, '/');
            particularKeyToLetterWithoutShift.put(110, '.');
            particularKeyToLetterWithoutShift.put((int) '\u008D', '-');
        }
    
    
    //开启服务
    private void startService() throws InterruptedException {
            logger.info("Barcode producer启动成功");
            BarcodeKeyboardListenerProducer listener = new BarcodeKeyboardListenerProducer();
            WinUser.LowLevelKeyboardProc lowLevelKeyboardProc = new WinUser.LowLevelKeyboardProc() {
                @Override
                public WinDef.LRESULT callback(int nCode, WinDef.WPARAM wparam, WinUser.KBDLLHOOKSTRUCT hook) {
                    if (nCode >= 0 && wparam.intValue() == WinUser.WM_KEYUP) {
                        int keyCode = hook.vkCode;
                        listener.onKey(keyCode);
                    }
                    return lib.CallNextHookEx(hhook, nCode, wparam, new WinDef.LPARAM(Pointer.nativeValue(hook.getPointer())));
                }
            };
            WinDef.HMODULE hmodule = Kernel32.INSTANCE.GetModuleHandle(null);
            hhook = lib.SetWindowsHookEx(WinUser.WH_KEYBOARD_LL, lowLevelKeyboardProc, hmodule, 0);
            WinUser.MSG msg = new WinUser.MSG();
            int result;
            while ((result = lib.GetMessage(msg, null, 0, 0)) != 0) {
                if (result == -1) {
                    logger.error("quit ,error in get message: " + result);
                    break;
                } else {
                    lib.TranslateMessage(msg);
                    lib.DispatchMessage(msg);
                }
            }
    
        }
    
    //监听键盘缓冲区的每一个字符
     // 160 = SHIFT
        //此处判断识别的为可显示的字符
        public void onKey(int keyCode) {
    //        logger.info(keyCode+" "+(char)keyCode);
            if (keyCode == SHIFT_VALUE) {
                IS_SHIFT = true;
                return;
            }
            if (barcode == null) {
                IS_SHIFT = false;
                barcode = new StringBuilder();
                start = System.currentTimeMillis();
            }
            long cost = System.currentTimeMillis() - start;
            if (cost > maxScanTime) {
                IS_SHIFT = false;
                barcode = new StringBuilder();
                start = System.currentTimeMillis();
            }
            if (isNumber(keyCode) && !IS_SHIFT) {
    //            logger.info("number:" + keyCode + " " + (char) keyCode);
            } else if (isUpperLetter(keyCode)) {
    //            logger.info("alpha:" + keyCode + " " + (char) keyCode);
                //默认字母小写
                keyCode = keyCode + 32;
                if (IS_SHIFT) {
                    keyCode = keyCode - 32;
                }
            } else if (keyCode != CODE_ENTER) {
    //            logger.info("other:" + keyCode + " " + (char) keyCode);
                keyCode = handleParticularCharacter(IS_SHIFT, keyCode);
            } else {
                //最终结果
                if (barcode.length() > barcodeMinLength && cost < maxScanTime) {
                    BarcodeBuffer.produce(barcode.toString());
                }
                barcode = new StringBuilder();
                return;
            }
            barcode.append((char) keyCode);
            //默认全部字符都是大写
            IS_SHIFT = false;
    //        logger.info(keyCode+" "+(char)keyCode);
        }
    
    
    2.1.3.具体实现 (Go)
    //字符转换
    func initWithoutShiftCharacter() {
    	particularKeyToLetterWithoutShift = make(map[uint32]uint32)
    	particularKeyToLetterWithoutShift[189] = '-' // - ok
    	particularKeyToLetterWithoutShift[187] = '='
    	particularKeyToLetterWithoutShift[219] = '[' //{ ok
    	particularKeyToLetterWithoutShift[221] = ']'
    	particularKeyToLetterWithoutShift[220] = '\\' // \ ok
    	particularKeyToLetterWithoutShift[186] = ';'  //: ok
    	particularKeyToLetterWithoutShift[222] = '\''
    	particularKeyToLetterWithoutShift[188] = ','
    	particularKeyToLetterWithoutShift[190] = '.'
    	particularKeyToLetterWithoutShift[191] = '/'
    	particularKeyToLetterWithoutShift[107] = '+'
    	particularKeyToLetterWithoutShift[109] = '-'
    	particularKeyToLetterWithoutShift[106] = '*'
    	particularKeyToLetterWithoutShift[111] = '/'
    	particularKeyToLetterWithoutShift[110] = '.'
    	//particularKeyToLetterWithoutShift[uint32('\u08D')] = '-'
    }
    
    func initWithShiftCharacter() {
    	particularKeyToLetterWithShift = make(map[uint32]uint32)
    	particularKeyToLetterWithShift[48] = ')'
    	particularKeyToLetterWithShift[49] = '!'
    	particularKeyToLetterWithShift[50] = '@'
    	particularKeyToLetterWithShift[51] = '#'
    	particularKeyToLetterWithShift[52] = '$'
    	particularKeyToLetterWithShift[53] = '%'
    	particularKeyToLetterWithShift[54] = '^'
    	particularKeyToLetterWithShift[55] = '&'
    	particularKeyToLetterWithShift[56] = '*'
    	particularKeyToLetterWithShift[57] = '('
    	particularKeyToLetterWithShift[189] = '_'
    	particularKeyToLetterWithShift[187] = '+'
    	particularKeyToLetterWithShift[219] = '{'
    	particularKeyToLetterWithShift[221] = '}'
    	particularKeyToLetterWithShift[220] = '|'
    	particularKeyToLetterWithShift[186] = ':'
    	particularKeyToLetterWithShift[222] = '"'
    	particularKeyToLetterWithShift[188] = '<'
    	particularKeyToLetterWithShift[190] = '>'
    	particularKeyToLetterWithShift[191] = '?'
    }
    
    
    //开启监听键盘缓冲区服务
    func StartProviderService() error {
    	log.Println("[INFO]start barcode provider service")
    	QuitProvider = false
    	if err := keyboard.Install(nil, KeyBoardChan); err != nil {
    		return err
    	}
    	defer keyboard.Uninstall()
    	signalChan := make(chan os.Signal, 1)
    	signal.Notify(signalChan, os.Interrupt)
    	for !QuitProvider {
    		select {
    		case <-signalChan:
    			log.Println("[INFO]stop barcode provider service~")
    			return nil
    		case k := <-KeyBoardChan:
    			if k.Message == types.WM_KEYDOWN {
    				handle(k.VKCode)
    			}
    			continue
    		}
    	}
    	log.Println("[INFO] stop barcode provider service=")
    	return nil
    }
    
    
    //监听每一个字符
    func handle(code types.VKCode) {
    	if code == types.VK_SHIFT || code == types.VK_LSHIFT || code == types.VK_RSHIFT {
    		IsShift = true
    		return
    	}
    	if barcode.Len() == 0 {
    		start = time.Now().UnixMilli()
    	}
    	cost := time.Now().UnixMilli() - start
    
    	if cost > maxScanTime {
    		IsShift = false
    		barcode = bytes.Buffer{}
    		start = time.Now().UnixMilli()
    	}
    	c := uint32(code)
    	if isNumber(c) && !IsShift {
    
    	} else if isUpperLetter(c) {
    		c = c + 32
    		if IsShift {
    			c = c - 32
    		}
    	} else if code != types.VK_RETURN {
    		c = handleParticularCharacter(c)
    	} else {
    		if barcode.Len() > barcodeMinLength && cost < maxScanTime {
    			//	fmt.Println(barcode.String())
    			Provide(barcode.String())
    		}
    		barcode = bytes.Buffer{}
    		return
    	}
    	e := recover()
    	if e != nil {
    		log.Println("Erorr transfer key->", c)
    	}
    	//	fmt.Println(barcode.String())
    	barcode.WriteByte(byte(c))
    	IsShift = false
    }
    
    
    2.1.4.不足之处

    通过大量测试,发现使用键盘缓冲区的方式会有卡顿现象,即如果我们将光标聚焦于文本处,那输出的字符会很顺畅,程序正常运行;但当我们不将光标放在文本或输入框中,发现监听的字符会产生混乱,因此效果不尽人意,因此舍弃该种思路;

    2.2.读取串口

    通过仔细阅读扫码枪说明书,发现其可以变成串口模式,即使用串口的方式,扫码枪会将解析出来的字符串输出到串口中,此时我们读取该串口中的内容即可;

    2.2.1.具体实现
    //开启服务,将串口读取方式变为阻塞读模式,即未读到值则一致阻塞;
    var S *serial.Port
    var c = &serial.Config{Name: COM, Baud: 9600 /*毫秒*/}
    var tmpS *serial.Port
    func StartProviderService() error {
    	//如果provider已经开启了,就不用再开了
    	if IsRunningProvider {
    		return nil
    	}
    	//若未开启
    	if S==nil{
    		S, _ = serial.OpenPort(c)
    	}
    	logs.Info("start Barcode provider service")
    	QuitProvider = false
    	IsRunningProvider = true
    	signalChan := make(chan os.Signal, 1)
    	signal.Notify(signalChan, os.Interrupt)
    	//该bonux的意义是因为经过测试发现若扫描二维码,会出现分2次获取值的情况,即若读取的值为 http://www.bilibili.com
    	//则第一次获得的值为h
    	//第二次获取的值为 ttp://bilibili.com
    	//因此需要手动拼接
    	bonux := ""
    	for true {
    		select {
    		case <-signalChan:
    			logs.Info("stop Barcode provider service~")
    			return nil
    		default:
    			b := make([]byte, 300)
    			S.Read(b)
    			if QuitProvider {
    				continue
    			}
    			Barcode = trimBytes(b)
    			if len(Barcode) <= 1 {
    				bonux = Barcode
    				continue
    			}
    			Barcode = strings.TrimSpace(bonux + Barcode)
    			Provide(Barcode)
    			Barcode = ""
    			bonux = ""
    		}
    	}
    	logs.Info("stop Barcode provider service=")
    	return nil
    }
    

    2.2.2.不足之处

    仅测试,大部分电脑都可以正常安装扫码枪的驱动,但有那么几台win7的系统竟然安装不上扫码枪的驱动,这就意味着要么可能需要手写驱动,获取扫码枪的输入…

    展开全文
  • 霍利韦尔LXE MX7T 扫描枪API开发接口类库及VS2005示例,WINCE系统,API 仅一个DLL文件,来自霍利韦尔开发技术人员。
  • php+js扫码枪实现签到的功能

    千次阅读 2020-05-23 16:56:22
    扫码枪可以代替用户扫码,实现付款功能,实现签到功能,还有别的功能,有待发掘....

    扫码枪在生活中是很常见的工具,但是我从没想过它会和我的系统结合在一起,下面我们来康康如何进行前后端的交互.
    首先需要明白的一点是,当显示屏上有文本框时,扫描二维码或者条形码,成功后会把二维码中的信息展示在文本框中,并且触发enter事件(划重点要考)

    需求:点击页面的扫码签到按钮,弹窗,扫码,把信息展示在文本域中,将对应的用户信息展示在弹窗下方,点击确认签到按钮,实现签到功能.

    效果图
    初始图
    扫描成功后,按回车键,通过ajax调取接口,接收信息,展示在用户信息框中
    在这里插入图片描述
    下面来看具体实现的代码,首先是前端代码

    <a id="scanBtn" class="layui-btn layui-btn-primary layui-btn-sm">&nbsp;扫码签到</a>
    
    <form id="scanForm" class="layui-form" style="display: none; margin: 25px 25px 25px 0;">
        <div class="layui-form-item">
            <label class="layui-form-label">扫码枪签到</label>
            <div class="layui-input-inline">
                <input type="text" class="layui-input" name="content" autofocus lay-verify="required" autocomplete="off" id="content">
            </div>
            <div class="layui-form-mid layui-word-aux aux">:扫码前将鼠标放入上方文本框,点击获取光标焦点后开始扫码</div>
        </div>
    
        <table class="layui-table" lay-skin="nob">
            <tr style="border: none;">
                <th colspan="4">用户信息</th>
            </tr>
            <tbody>
            <tr>
                <td>姓名</td>
                <td id="scanName"><input type="text" class="layui-input"></td>
                <td>用户ID</td>
                <td id="scanID"><input type="text" class="layui-input"></td>
            </tr>
            <tr>
                <td>手机号</td>
                <td id="scanPhone"><input type="text"  class="layui-input"></td>
                <td>性别</td>
                <td id="scanSex"><input type="text"  class="layui-input"></td>
            </tr>
            <tr>
                <td>单位</td>
                <td id="scanCompany"><input type="text"  class="layui-input"></td>
                <td>部门</td>
                <td id="scanDepart"><input type="text"  class="layui-input"></td>
            </tr>
            <tr>
                <td>职务</td>
                <td id="scanPosition"><input type="text"  class="layui-input"></td>
                <td>邮箱</td>
                <td id="scanEmail"><input type="text" class="layui-input"></td>
            </tr>
    
            </tbody>
        </table>
    
        <input type="hidden" id="mid" name="mid" value="{$id}">
    </form>
    
    //扫码枪文本框
            $('#scanBtn').click(function () {
                layer.open({
                    title: '扫码信息',
                    type: 1,
                    area: ['700px', '650px'],
                    offset: ['25%', '20%'],
                    closeBtn: 1,
                    shade: 0,
                    shadeClose: true,
                    content: $('#scanForm')
                });
            });
    
    
            // $('#content').bind('input propertychange', function() {  //这样写也可以
            $('#content').bind('input keypress', function (event) {
                if (event.keyCode == '13') {
                    event.preventDefault(); //这一句 去掉默认的触发enter键事件
                    //先移除元素
                    $('.confirmSignItem').remove();
                    //再创建元素
                    var btns = '    <div class="layui-form-item confirmSignItem">\n' +
                        '        <div class="layui-input-block">\n' +
                        '            <a class="layui-btn" id="confirm_sign">确认签到</a>\n' +
                        '        </div>\n' +
                        '    </div>';
                    $('#scanForm').append(btns);
                    var val = $(this).val();
                    //用户信息
                    var loading = layer.load(3, {shade: [0.1, '#fff']}); //加载框
                    $.post('{:url("user")}', {val: val, mid: id}, function (res) {
                        layer.close(loading); //关闭加载框
                        if (res.code === 1) {
                            var scanData = res.data;
                            //赋值
                            $('#scanID input[type=text]').val(scanData.id);  //td值用text()
                            $('#scanName input[type=text]').val(scanData.username);
                            $('#scanPhone input[type=text]').val(scanData.phone);
                            $('#scanPosition input[type=text]').val(scanData.position);
                            $('#scanCompany input[type=text]').val(scanData.company);
                            $('#scanEmail input[type=text]').val(scanData.email);
                            $('#scanSex input[type=text]').val(scanData.sex);
                            return false;
                        } else {
                            layer.msg(res.msg, {time: 1000, icon: 2});
                            return false;
                        }
                    });
                    //调用接口
                    $('#confirm_sign').click(function () {
                        var val = $('#content').val();
                        var load=layer.load(1,{shade:[0.1,'#fff']})
                        $.post('{:url("scan")}', {val: val, mid: id}, function (res) {
                            layer.close(load);
                            $('#content').val('');
                            //移除确认元素
                            $('.confirmSignItem').remove();
                            //重置数值
                            $('#scanID input[type=text]').val('');
                            $('#scanName input[type=text]').val('');
                            $('#scanPhone input[type=text]').val('');
                            $('#scanPosition input[type=text]').val('');
                            $('#scanCompany input[type=text]').val('');
                            $('#scanEmail input[type=text]').val('');
                            $('#scanSex input[type=text]').val('');
                            if (res.code === 1) {
                                layer.msg(res.msg, {time: 1000, icon: 1});
                                return false;
                            } else {
                                layer.msg(res.msg, {time: 1000, icon: 2});
                                return false;
                            }
                        });
                        return false;
                    })
                }
            });
    

    再看PHP代码

        //扫码枪签到获取用户信息
        public function user()
        {
            $data = $this->request->param();
            $mid = $data['mid'];
            $val = $data['val'];
            $arr_query = parse_url($val);
    
            if (!isset($arr_query['query']) || empty(($arr_query['query']))) {
                return ['code' => 0, 'msg' => '信息错误'];
            }
            $queryArr = convertUrlQuery($arr_query['query']);
    
            //是否有uid和mid
            if (!array_key_exists('uid', $queryArr)) {
                return ['code' => 0, 'msg' => '用户参数错误'];
            }
            if (!array_key_exists('mid', $queryArr)) {
                return ['code' => 0, 'msg' => '会议参数错误'];
            }
            if ($queryArr['mid'] != $mid) {
                return ['code' => 0, 'msg' => '未报名该会议'];
            }
            $user = User::get($queryArr['uid']);
            if (empty($user)) {
                return ['code' => 0, 'msg' => '用户不存在'];
            }
            return ['code' => 1, 'data' => $user];
        }
    
        //扫码枪签到
        public function scan()
        {
            $data = $this->request->param();
            $mid = $data['mid'];
            $val = $data['val'];
            $arr_query = parse_url($val); //获取各个请求值
    
            if (!isset($arr_query['query']) || empty(($arr_query['query']))) {
                return ['code' => 0, 'msg' => '信息错误'];
            }
            $queryArr = convertUrlQuery($arr_query['query']);
    
            //是否有uid和mid
            if (!array_key_exists('uid', $queryArr)) {
                return ['code' => 0, 'msg' => '用户参数错误'];
            }
            if (!array_key_exists('mid', $queryArr)) {
                return ['code' => 0, 'msg' => '会议参数错误'];
            }
            if ($queryArr['mid'] != $mid) {
                return ['code' => 0, 'msg' => '未报名该会议'];
            }
            $model = new SceneSign();
            $res = $model->scene($queryArr['uid'], $queryArr, 3);
            if ($res === false) {
                return ['code' => 0, 'msg' => $model->getError()];
            } else {
                return ['code' => 1, 'msg' => '签到成功'];
            }
    
        }
            public function scene($uid, $param, $method = 1)
        {
            $rule = [
                'mid|会议编号' => 'require',
            ];
            $validate = new Validate($rule);
            if (!$validate->check($param)) {
                $this->error = $validate->getError();
                return false;
            }
            $res['uid'] = $uid;
            $res['mid'] = $param['mid'];
            $jid = Join::where($res)->value('id');
            if (empty($jid)) {
                $this->error = '您未报名此会议!';
                return false;
            }
            $where = $map = ['uid' => $uid, 'mid' => $param['mid'], 'jid' => $jid];
            //查看此大会是否已签到
            $signed = SceneSign::where($where)->find();
            if (!empty($signed)) {
                $this->error = '该大会已签到';
                return false;
            }
            $map['sign_time'] = time();
            $map['method'] = $method;
            $model = new SceneSign();
            $res = $model->allowField(true)->save($map);
            return $res;
        }
        
    function convertUrlQuery($query)
    
    {
        $query=htmlspecialchars_decode($query);  //将&使用&表示.避免转义
        $queryParts = explode('&', $query);
        $params = array();
        foreach ($queryParts as $param) {
            $item = explode('=', $param);
            $params[$item[0]] = $item[1];
        }
        return $params;
    
    }
    
    展开全文
  • HTML5扫描录入工具自动识别来自扫描录入的条码并进行提交,屏蔽来自键盘的录入。版本号命名规则X: 版本号, Y: 修订号, Z: 迭代次数如:Ver.X.Y.Z 代表第X版,第Y次修订,第Z次迭代。开源声明Given enough ...
  • Java生成二维码QRCode

    背景

    项目上对接一个支付渠道,C Scan B(用户扫商家收款码)场景下,我们会先调用Xx支付渠道,它返回给我一个收款码字符串,我需要把这个收款码搞成QRCode。

    代码

    1、Maven依赖

    <!--qrcode-->
    <dependency>
        <groupId>com.google.zxing</groupId>
        <artifactId>core</artifactId>
        <version>3.5.0</version>
    </dependency>
    <dependency>
        <groupId>com.google.zxing</groupId>
        <artifactId>javase</artifactId>
        <version>3.5.0</version>
    </dependency>
    

    2、工具类

    package com.saint.base.util;
    
    import com.google.zxing.BarcodeFormat;
    import com.google.zxing.WriterException;
    import com.google.zxing.client.j2se.MatrixToImageWriter;
    import com.google.zxing.common.BitMatrix;
    import com.google.zxing.qrcode.QRCodeWriter;
    import lombok.extern.slf4j.Slf4j;
    import sun.misc.BASE64Encoder;
    
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.nio.file.Paths;
    
    /**
     * generate QR Code
     *
     * @author Saint
     */
    @Slf4j
    public class GenerateQRCodeUtil {
    
        private static final String IMAGE_FORMAT = "PNG";
    
        private static final String PNG_BASE64_PRE = "data:image/png;base64,";
    
        public static String generateQRCodeToBase64(String text) {
            String qrCode = generateQRCodeToBase64(text, 360, 360);
            return qrCode;
        }
    
        /**
         * generate QR Code data, format --> data:image/png:base64
         */
        public static String generateQRCodeToBase64(String text, int width, int height) {
            byte[] bytes = generateQRCodeBytes(text, width, height);
            BASE64Encoder encoder = new BASE64Encoder();
    
            // bytes to base64 string, and delete \r\n
            String image_base64 = encoder.encodeBuffer(bytes).trim().replaceAll("\n", "").replaceAll("\r", "");
            String pngBase64 = PNG_BASE64_PRE + image_base64;
            return pngBase64;
        }
    
        /**
         * generate QR Code into Stream
         *
         * @param outputStream outputStream
         */
        public static void generateQRCodeToStream(String text, int width, int height, OutputStream outputStream) {
            BitMatrix bitMatrix = getQRCodeBitMatrix(text, width, height);
            try {
                // Write QR Code image into stream
                MatrixToImageWriter.writeToStream(bitMatrix, IMAGE_FORMAT, outputStream);
            } catch (IOException e) {
                log.error("Could not generate QRCode to Stream, ", e);
            }
        }
    
        /**
         * generate QR Code into file
         *
         * @param filePath file path
         */
        public static void generateQRCodeToFile(String text, int width, int height, String filePath) {
            BitMatrix bitMatrix = getQRCodeBitMatrix(text, width, height);
            try {
                // Write QR Code image into file
                MatrixToImageWriter.writeToPath(bitMatrix, IMAGE_FORMAT, Paths.get(filePath));
            } catch (IOException e) {
                log.error("Could not generate QRCode to FilePath: {}, ", filePath, e);
            }
        }
    
        /**
         * generate qrCode bitMatrix by text / width / height
         *
         * @param text   qrCode context
         * @param width  qrCode width
         * @param height qrCode height
         * @return BitMatrix
         */
        public static BitMatrix getQRCodeBitMatrix(String text, int width, int height) {
            QRCodeWriter qrCodeWriter = new QRCodeWriter();
            BitMatrix bitMatrix = null;
            try {
                bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height);
            } catch (WriterException e) {
                log.error("Could not generate QR Code, WriterException is : {}", e);
            }
            return bitMatrix;
        }
    
        /**
         * obtain QR Code bytes
         *
         * @return byte[]
         */
        public static byte[] generateQRCodeBytes(String text, int width, int height) {
            byte[] pngData;
            ByteArrayOutputStream pngOutputStream = new ByteArrayOutputStream();
            generateQRCodeToStream(text, width, height, pngOutputStream);
            pngData = pngOutputStream.toByteArray();
            return pngData;
        }
        
    
        public static void main(String[] args) {
            // 此处返回的PNG的图片base64数据,有需要自行换方式使用
            final String s = generateQRCodeToBase64("12434324");
            System.out.println(s);
            
        }
    }
    
    

    3、效果图

    。。。。很难受。。。。二维码挑不出来,CSDN会判断图片违规。

    展开全文
  • 二维码扫描枪对接手册

    万次阅读 2018-06-08 21:16:46
    本博客介绍二维码扫描枪对接,本博客仅仅写写实现过程,仅仅是给学习者作为一个了解,二维码扫描枪需要相关硬件厂家做好一些dll动态链接库,当然也有一些不需要dll动态链接库,动态链接库的需要厂家提供,各有不同,...
  • 手持扫描的接口程序

    热门讨论 2010-06-24 15:31:58
    手持扫描的接口程;卡西欧的,这也是我在实际项目用到的东西,保证可以用
  • 简单理解扫码枪 是一个文本输入设备,相当于一个键盘.扫码枪 有不同的模式 ,可以设置扫描条码之后带出的操作.一般 1.可以直接切换到下一个焦点 (输入框)2.可以带出回车键3.还有其他很多操作.这是得力扫码枪的一个文档...
  • 项目需求:使用条码进行商品编码扫描并录入商品信息 方法一: <input type="text"> <script type="text/javascript"> var a = []; var timeout; $("input").keyup(function(){ a.push($(this)....
  • java通过扫码枪获取数据

    千次阅读 2020-10-15 14:53:14
    2.扫描二维码或条形,并设置回车键(大部分扫描已自动设置) 3.在输入框设置回车 事件 4.获取输入框的值,将数据传入数据库 <script type="text/javascript"> function b1() { $("#p").focus(); $('#p'...
  • PHP可以直接获取到扫码枪的内容吗 是否有直接调用的接口去获取
  • 系统上需要使用到条形扫描,根据已获得的条形,通过扫描获取条形的内容,再进而触发下一个功能逻辑。 方案 遇到问题,肯定是先百度(毕竟这一方面的功能开发我是头一次),所以兜兜转转…最终确定使用Web ...
  • js读取usb扫码枪数据

    万次阅读 2017-12-21 15:15:31
    <!DOCTYPE html> , initial-scale=1, maximum-scale=1, user-scalable
  • php写二维码api
  • 支付宝扫码枪流程笔记

    千次阅读 2018-12-04 11:41:28
    商户使用扫码枪等条码识别设备扫描用户支付宝钱包上的条码/二维码,完成收款。用户仅需出示付款码,所有操作由商户端完成 调用流程 接口调用时序图: 1.商户系统将用户付款码与订单信息一起通过 交易支付接口...
  • USB扫码枪为即插即用,通过类似键盘的方式和系统进行交互,扫描出来的数据获取方式有两种实现方式。 (1)文本框输入获取焦点,扫描后自动显示在文本框内。 (2)使用键盘钩子,勾取扫描枪虚拟按键,进行键盘虚拟...
  • 支付宝接口对接流程

    2018-08-01 10:53:33
    此文档为一个餐饮系统与支付宝API接口对接说明,可做对接参考
  • Java整合支付宝扫码支付 1.支付宝开放平台注册账号,进入管理中心,找到研发服务 2.进入沙箱当面付引导流程 根据流程完成 1,2,3 1、下载支付宝密钥生成器: 2、密钥格式选择:PKCS8;密钥长度选择:2048;点击...
  • uni-app实现扫码的几种方式

    千次阅读 2021-10-29 14:54:10
    优点:uni.scanCode(OBJECT)就可以直接调用,方便快捷,支持安卓、ios,如果制作小程序,便可以直接转换成微信等官方扫码api。 缺点:安卓、ios端识别率非常差,并且扫码耗时很长,很多条件下,无法识别二维码。 2、...
  • 但是很容易让这个模型直接与java进行交互,而不是使用键盘钩子(如上所述在Java中使用条形作为变量)。该模型具有模拟串行端口的设置,然后可以使用javax.comm包读取扫描的数据。对我来说,这比键盘钩子好得...
  • 最近业务需求,需要做一个建行支付,其中分为主和被,主相对简单,先将主做一记录; 首先是配置一下主,这里仅将必须参数配置 <?php return [ 'bankUrl' => '...
  • 需要在公众号里面切入扫码功能 前段代码: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0,...
  • java调用支付宝扫码支付接口

    千次阅读 2021-09-01 11:07:42
    说明: ...在真实开发中将商户公钥等修改为真实的商户即可。 支付基本流程 用户下单 商户账号(收款方)在配置...用户扫码或者点击支付等完成支付。 第三方接口会检测到用户是否完成支付,然后返回一个结果到某个url(称
  • 产生条形的插件到是不少,但是能用针式打印机打印在合适表单上,而且能用常用的激光扫描器扫描出来的demo到不是很多。本文,所牵扯的代码与工具均亲测可用。使用工具:epson LQ-630K针式打印机honeywell ms9540 ...
  • 我们知道odoo登陆需要在系统中维护好用户账号后才能登陆,今天就跟大家分享一下另一种快捷的登陆方式,如何实现通过企业微信扫码登陆到odoo系统。需要源码的朋友可关注我们公众号(神州数码云基地,回复Odoo进群)...
  • zebra(斑马)PDA扫码uniapp程序小demo

    千次阅读 2020-11-17 08:32:29
    (参考官网https://techdocs.zebra.com/datawedge-cn/7-0/guide/api/tutorials/) 1.在设备上启动 DataWedge。 2.新建配置文件 3.配置 DataWedge 输入(条码扫描器)和输出 (Intent)。 其中配置 Intent 输出注意: ...
  • } 回调的意思是用户扫码付款成功后,会有一个异步通知,是支付宝官方通知我们用户已经支付成功了,我们需要给支付宝一个回调的地址让他有地方通知过来。然后我是写成了map,一个一个打印出来了。 详细的代码已经...
  • 但当前第三方在对支付宝扫码支付形式剖析研讨上并没有构成相应的研讨成果, 因而, 为了讨论二维码扫描支付形式, 剖析其开展方式, 本文经过对二维码扫码支付的开展进程停止剖析, 对支付宝扫码支付的两种方式停止...
  • } //扫码枪扫描到的用户手机钱包中的付款条码 AlipayTradePayContentBuilder builder = new AlipayTradePayContentBuilder(); //收款账号 builder.seller_id = Config.pid; //订单编号 builder.out_trade_no = out_...

空空如也

空空如也

1 2 3 4 5 6
收藏数 102
精华内容 40
关键字:

扫码枪对接api