移动端网页有时需要用到定位功能,而现代浏览器的定位请求需要站点升级到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);
});
}
}
注意:在开发服务器无法调用接口,需要在正式服务器上使用。