H5扫码整理

前置条件

.....必须部署在https的环境下才能扫码.....

html-qrcode扫码

<div>
<span>页面加载成功时、调用getCamera()获取摄像头并开始扫码</span>
<span>参考地址:https://unpkg.com/browse/html5-qrcode@2.3.7/README.md</span>
</div>
<!-- =============== PAGE SCRIPTS ===============-->
<script type="text/javascript" src="https://unpkg.com/html5-qrcode"></script>
<script>

    window.addEventListener("load", (event) => {
        getCamera()
    });


    let html5QrCode = null;

    let equipInfo = {equipId: "",aid:""}

    function getCamera() {
        console.log("开始获取摄像头------")
        Html5Qrcode.getCameras()
            .then((devices) => {
                console.log("获取摄像头信息",devices)
                if (devices && devices.length) {
                    html5QrCode = new Html5Qrcode("reader")
                    //console.log("创建扫码对象",html5QrCode)
                    start()
                }
            })
            .catch((err) => {
                // handle err
                console.log("获取摄像头异常信息",err)
                html5QrCode = new Html5Qrcode("reader")
                // this.$toast('您需要授予相机访问权限')
            })
    }

    function stop() {
        html5QrCode.stop().then((ignore) => {
            // QR Code scanning is stopped.
            console.log("QR Code scanning stopped.")
        }).catch((err) => {
            // Stop failed, handle it.
            console.log("Unable to stop scanning.")
        })

    }

    function start() {
        {
            html5QrCode.start(
                // environment后置摄像头 user前置摄像头
                {facingMode: "environment"},
                {
                    fps: 2, // 可选,每秒帧扫描二维码
                    qrbox: {width: 300, height: 300} // 可选,如果你想要有界框UI
                    // aspectRatio: 1.777778 // 可选,视频馈送需要的纵横比,(4:3--1.333334, 16:9--1.777778, 1:1--1.0)传递错误的纵横比会导致视频不显示
                },
                (decodedText, decodedResult) => {
                    // do something when code is read
                  
                    alert(decodedText);

                }, (errMsg) => {
                    console.log('扫码errMsg: ', errMsg)
                }
            )
                .catch((err) => {
                    console.log('调用扫码错误信息', err)
                    
                })

        }
    }


</script>

微信扫一扫

1、注册一个公众号

注册地址:https://mp.weixin.qq.com/

2、获取自己公众号的appid、appsecurity

公众号左边菜单栏 设置与开发 - 基本配置

3、引入jssdk

参考官方文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html
3.1、配置access_toekn获取的白名单
公众号左边菜单栏 设置与开发 - 基本配置 - IP白名单
配置成功如图
在这里插入图片描述
不配置调用accsstoken接口会返回异常:

{	
	"errcode":40164,
	"errmsg":"invalid ip **** ipv6 ::ffff:****, not in whitelist rid: 61323f9-402gref3-016bgr27"
}

3.2、根据appId和AppSecret获取微信签名

先获取token、再获取票据、最后签名加密供wxjs初始化使用

JS-SDK使用权限签名算法:
accesstoken接口:
https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html
签名接口:
https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#62

3.3、设置JS安全域名接口

公众号左边菜单栏  设置与开发  -  公众号设置  -  功能设置  -  JS接口安全域名

在这里插入图片描述
在这里插入图片描述

3.4、注意事项

wx.config({
  debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  appId: '', // 必填,公众号的唯一标识
  timestamp: , // 必填,生成签名的时间戳
  nonceStr: '', // 必填,生成签名的随机串
  signature: '',// 必填,签名
  jsApiList: [] // 必填,需要使用的JS接口列表
});

timestamp 为时间戳除1000

config:fail invalid url domain JS安全域名配置异常、参考 3.3
config:fail,invalid signature 签名算法异常、参考3.2

初始化完成截图、pc使用 微信开发者工具,验证
在这里插入图片描述

4、扫码代码

<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
<script>

    let wxConfig;

    //初始化后调用wx接口
    window.addEventListener("load", (event) => {
        alert(location.href.split('#')[0])
        let url = location.href.split('#')[0]
        let req = {timeStamp: Math.floor(Date.now() / 1000),nonceStr:'chargeService',signature:'',url:url}
        //1、获取验签
        $.ajax({
            url: "/wx",
            type: "POST", //数据发送的方式(POST或者GET)
            data: JSON.stringify(req), //需要传递的参数
            contentType: "application/json",
            dataType: "json", //后端返回的数据格式
            success: function (res) {
                console.log('微信签名',res)
                if (res.respCode !== "0000") {
                    alert(res.respInfo)
                }else {
                    //2、初始化微信对象
                    wx.config({
                        debug: false,
                        appId: res.obj.appId,
                        timestamp:req.timeStamp ,
                        nonceStr: req.nonceStr,
                        signature: res.obj.sign,
                        jsApiList: ['scanQRCode','JSAPI']
                    });
                    console.log("微信对象初始化完成",wx)
                    //3、微信初始化
                    wx.ready(function (){
                        //4、调用扫码
                        wx.scanQRCode({
                            needResult: 1,
                            scanType: ['qrCode', 'barCode'],
                            success: function (res) {
                                let decodedText = res.resultStr; // 获取扫描结果
                                // 处理扫描结果的逻辑
                                alert("扫码结果:"+decodedText)
                            },
                            fail:function (res){
                                console.log("扫码失败.......",res)
                            }

                        });
                    })


                }

            }
        });


    });
</script>
<think>好的,我现在需要帮助用户解决如何在UniApp的H5页面和应用之间传递数据的问题。首先,我得回顾一下用户提供的引用内容,看看里面有哪些可用的信息。 用户提到了引用[1]中的示例项目,展示了如何在H5页面调用UniApp的功能,并通过回调传递数据。这说明可以通过uni.postMessage或自定义事件来传递数据。引用[2]则提到了H5与App通信的方法,特别是使用uni.postMessage和监听事件,比如uni.onNeedNavigateBack。引用[3]虽然主要讨论返回问题,但也涉及页面间通信的问题,可能需要考虑参数传递时的注意事项。 接下来,我需要整理出几种常用的数据传递方法。首先想到的是使用UniApp的JS桥接,比如uni.postMessage和uni.getEnv。然后是URL参数传递,这在跳转页面时比较直接。还有Webview通信,通过uni.webview.js中的API进行交互。另外,可能还有localStorage或Cookie的方式,但需要考虑平台兼容性。 需要确保示例代的正确性。比如,在H5页面中调用uni.postMessage,然后在UniApp的页面监听消息。同时,要处理不同环境下的兼容问题,比如在非UniApp环境下可能需要降级处理。另外,URL参数传递时,UniApp页面如何接收并解析参数,比如在onLoad生命周期中获取options。 还要注意用户可能遇到的问题,比如在UC浏览器中的返回问题,虽然主要不是数据传递的问题,但可能影响用户体验,需要提醒用户测试不同环境。另外,多次传递相同参数可能导致的问题,如引用[3]中提到的,需要避免参数重复或缓存问题。 最后,生成相关问题时要涵盖不同方法、兼容性处理、错误排查和性能优化等方面,帮助用户全面了解可能的后续问题。</think>### UniApp H5页面与原生应用数据传递方法 在UniApp中实现H5页面与原生应用的数据传递,可通过以下方法实现: --- #### 方法一:UniApp JS桥接通信 **实现原理**:通过`uni.postMessage`接口发送消息,原生页面通过监听`UniAppJSBridgeReady`事件接收数据。 **H5页面发送数据**: ```javascript // H5页面代 if (typeof uni !== 'undefined') { uni.postMessage({ data: { type: 'scanResult', content: '成功' } }); } ``` **UniApp页面接收数据**: ```javascript // UniApp页面代 mounted() { document.addEventListener('UniAppJSBridgeReady', (e) => { const message = e.detail.data; console.log('接收H5数据:', message); // 输出:{type: 'scanResult', content: '成功'} }); } ``` *注:需在`manifest.json`中启用`"JSBridge"`配置[^1]。* --- #### 方法二:URL参数传递 **场景**:适用于H5跳转回UniApp页面时携带简单参数。 **H5页面操作**: ```javascript // H5页面跳转回UniApp页面并传参 window.location.href = 'uniapp://navigateBack?result=success&data=123'; ``` **UniApp页面接收参数**: ```javascript // UniApp页面通过onLoad接收参数 onLoad(options) { console.log('接收参数:', options.result, options.data); // 输出:success 123 } ``` --- #### 方法三:Webview双向通信 **实现步骤**: 1. **引入Webview SDK**: ```html <!-- H5页面引入uni.webview.js --> <script src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.4.js"></script> ``` 2. **H5发送数据到UniApp**: ```javascript uni.webView.postMessage({ action: 'updateData', payload: { value: 42 } }); ``` 3. **UniApp监听消息**: ```javascript // pages/native-page.vue export default { onLoad() { uni.onNativeEventReceive = (e) => { console.log('收到H5数据:', e.data); // 输出:{action: 'updateData', payload: {value:42}} }; } } ``` *适用于需要双向实时通信的场景[^2]。* --- #### 注意事项 1. **环境判断**:在H5中需先检测运行环境: ```javascript if (uni.getEnv().app === true) { // 执行原生相关操作 } ``` 2. **数据大小限制**:URL传参不适合超过2KB的复杂数据。 3. **编处理**:URL传参需使用`encodeURIComponent`: ```javascript const data = encodeURIComponent(JSON.stringify({key: '值'})); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值