+
95
-

回答

在微信 H5 页面中调用微信扫码接口,需要使用微信 JS-SDK 提供的 wx.scanQRCode API。

步骤如下:

1. 绑定域名:

在微信公众平台后台的 "设置" -> "公众号设置" -> "功能设置" 中配置 "JS 接口安全域名"。 你需要将你的 H5 页面所在域名添加到该列表中,并且需要下载校验文件放到对应目录下。

2. 引入 JS 文件:

在你的 H5 页面中引入微信 JS-SDK 文件,可以使用如下代码:

<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>

(请注意版本号,可能会有更新)

3. 通过 wx.config 接口注入权限验证配置:

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

其中:

debug:调试模式,建议开发时开启,发布时关闭。appId,timestamp,nonceStr,signature 这几个参数需要通过调用你的服务器端接口来获取,用于验证你的网页授权。 signature 的计算方法可以参考微信官方文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#6 jsApiList: 表示你要调用的接口列表,这里需要包含 scanQRCode。

4. 处理 wx.ready 和 wx.error 事件:

   wx.ready(function(){
       // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
       // 在这里调用微信扫码接口
       wx.scanQRCode({
           needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
           scanType: ["qrCode","barCode"], // 可以指定扫二维码还是一维码,默认二者都有
           success: function (res) {
               var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
               // 处理扫码结果
           }
       });
   });

   wx.error(function(res){
      // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
   });
在 wx.ready 回调函数中,表示 wx.config 验证成功,可以调用微信扫码接口。在 wx.error 回调函数中,表示 wx.config 验证失败,需要根据错误信息进行排查和处理。

代码示例:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>微信扫码示例</title>
  <script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
</head>
<body>
  <button id="scanBtn">扫一扫</button>

  <script>
    document.getElementById('scanBtn').onclick = function() {
      // 获取签名等配置信息
      // (这里需要调用你的服务器端接口,代码示例仅供参考)
      fetch('/get-wx-config')
        .then(response => response.json())
        .then(data => {
          wx.config({
            debug: false,
            appId: data.appId,
            timestamp: data.timestamp,
            nonceStr: data.nonceStr,
            signature: data.signature,
            jsApiList: ['scanQRCode']
          });

          wx.ready(function() {
            wx.scanQRCode({
              needResult: 1,
              scanType: ["qrCode", "barCode"],
              success: function (res) {
                var result = res.resultStr;
                alert("扫描结果:" + result);
              }
            });
          });

          wx.error(function(res) {
            console.error('微信JS-SDK初始化失败:', res);
          });
        });
    }
  </script> 
</body>
</html>

请注意,以上代码只是一个示例,实际开发中你需要根据自己的业务逻辑进行调整。

网友回复

我知道答案,我要回答