微信公众号获取定位

移动端网页有时需要用到定位功能,而现代浏览器的定位请求需要站点升级到HTTPS才能保证成功率和精度。如果你的站点不是HTTPS,那么可以使用微信公众号的地理位置接口。

1、创建公众号

登录你的公众号,点击【接口权限】查看是否获得相关权限
在这里插入图片描述

2、绑定域名

点击【公众号设置】 - 【功能设置】 - 【JS接口安全域名】绑定安全域名。安全域名注意事项如下:
在这里插入图片描述

3、引入 JS 文件

通过 CDN 安装(支持https)

http://res.wx.qq.com/open/js/jweixin-1.6.0.js

如需进一步提升服务稳定性,当上述资源不可访问时,可改访问:

http://res2.wx.qq.com/open/js/jweixin-1.6.0.js

通过 NPM 安装

npm install weixin-js-sdk

4、通过 config 接口注入权限验证配置

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

参数都通过后端接口返回,签名算法见官网的附录1

5、通过 ready 接口处理成功验证

wx.ready(function(){
    
    
  // config信息验证后会执行 ready 方法,所有接口调用都必须在 config 接口获得结果之后,
  // config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在 ready 函数中调用来确保正确执行。
  // 对于用户触发时才调用的接口,则可以直接调用,不需要放在 ready 函数中。
});

6、获取地理位置接口

wx.getLocation({
    
    
  type: 'wgs84', // 默认为wgs84的 gps 坐标,如果要返回直接给 openLocation 用的火星坐标,可传入'gcj02'
  success: function (res) {
    
    
    var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
    var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
    var speed = res.speed; // 速度,以米/每秒计
    var accuracy = res.accuracy; // 位置精度
  }
});

实际案例

项目使用 vue + ts

async function handleGetLocation(index: number) {
    
    
  // 调用接口返回 config
  const {
    
     code, data } = await getConfigApi()
  if (code === 200) {
    
    
    wx.config({
    
    
      debug: false, //开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
      appId: data.appId, //必填,公众号的唯一标识
      timestamp: data.timestamp, // 必填,生成签名的时间戳
      nonceStr: data.nonceStr, //必填,生成签名的随机串
      signature: data.signature,// 必填,签名,见附录1
      jsApiList: ["getLocation"] //必填,需要使用的JS接口列表,所有JS接口列表 见附录2
    });
    // 注入配置信息
    wx.ready(() => {
    
    
      // 判断当前客户端版本是否支持指定 JS 接口
      wx.checkJsApi({
    
    
        jsApiList: ['getLocation'],
        success: function (res: any) {
    
    
          // 以键值对的形式返回,可用的api值true,不可用为false
          // 如:{"checkResult":{"getLocation":true},"errMsg":"checkJsApi:ok"}
          if (res.checkResult.getLocation == false) {
    
    
            alert('你的微信版本太低,不支持微信JS接口,请升级到最新的微信版本!');
            return;
          }
        }
      });
      wx.getLocation({
    
    
        type: 'wgs84',
        success: (res: any) => {
    
    
          console.log(`${
      
      res.longitude},${
      
      res.latitude}`)
        },
        cancel: function (res: any) {
    
    
          alert('用户拒绝授权获取地理位置');
        }
      });
    })
    wx.error(function (err: any) {
    
    
      console.log('err', err);
    });
  }
}

注意:在开发服务器无法调用接口,需要在正式服务器上使用。

猜你喜欢

转载自blog.csdn.net/sunddy_x/article/details/129403156