首页 学海无涯 微信小程序 小程序黑科技之获取手机号码、通讯地址、地理位置
小程序黑科技之获取手机号码、通讯地址、地理位置
摘要 本文为大家介绍微信小程序提供的比较实用的几个黑科技,主要包括导入通讯地址、获取手机号码、获取地理位置。

黑科技之一:获取手机号

简介:

        获取微信用户绑定的手机号,需先调用wx.login接口。

        因为需要用户主动触发才能发起获取手机号接口,所以该功能不由API来调用,需要用<button>组件的点击来触发。

使用方法:

        1.页面放置一个button,使用户手动触发接口.

<button class='getPhone' open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">获取手机号</button>

        注:必须是微信的<button>组件,且必须加上open-type="getPhoneNumber"。用户点击按钮后会弹出一个确认框,确认或拒绝都会进入bindgetphonenumber中填写的函数。

        2.编写回调函数。

Page({
  getPhoneNumber: function(e) {
    console.log(e.detail.errMsg); //用户不同意授权返回的是:getPhoneNumber:fail user deny
    console.log(e.detail.iv); //加密算法的初始向量
    console.log(e.detail.encryptedData); //包括敏感数据在内的完整用户信息的加密数据
    if (e.detail.errMsg == "getPhoneNumber:ok") {
      wx.request({
        url: 'https://api.qq.com/user/getPhoneNumber', //仅为示例,后台接口地址
        data: {
          iv: e.detail.iv,
          encrytedData: e.detail.encryptedData
        },
        success(res) {
          //后台将加密数据进行解密后即可获得用户手机号码
          console.log(res.data)
        }
      })
    } else {
      wx.showModal({
        title: '提示',
        showCancel: false,
        content: '获取失败',
        success: function(res) {}
      })
    }
  }
})

        用户同意授权后,我们可以获取到iv、encryptedData,再加上之前通过wx.login步骤获取到的session_key,即可解密用户数据获取到手机号码。

        3.关于后台如何解密,还请各位大胸弟移步官方文档,微信官方提供了多种编程语言的示例代码供参考。

        传送门:加密数据解密算法

        encryptedData解密后为以下json结构:

{
    "phoneNumber": "13580006666",  
    "purePhoneNumber": "13580006666", 
    "countryCode": "86",
    "watermark":
    {
        "appid":"APPID",
        "timestamp":TIMESTAMP
    }
}

        4.注意:getPhoneNumber回调中使用wx.login获取session_key的话会刷新登录态,而获取到的加密数据是旧的登录态,会出现解密失败。所以wx.login步骤必须提前使用,提前换区到session_key。

黑科技之二:导入通讯地址

简介:

        获取用户通讯地址需要调用wx.chooseAddress。

        该方法会调起用户编辑收货地址的原生界面,并在编辑完成后返回用户选择的地址。

代码实现:

Page({
  importWXAddr: function() {
    var that = this;
    if (wx.chooseAddress) {
      wx.chooseAddress({
        success: function(res) {
          if (res.errMsg === 'chooseAddress:ok') {
            var userName = res.userName, //收货人姓名
              telNumber = res.telNumber, //收货人手机号码
              detailInfo = res.detailInfo, //详细收货地址信息
              provinceName = res.provinceName, //国标收货地址第一级地址
              cityName = res.cityName, //国标收货地址第二级地址
              countyName = res.countyName; //国标收货地址第三级地址
          }
        },
        fail: function(err) {
          //用户未选择或者拒绝授权
          if (err.errMsg === 'chooseAddress:fail auth deny') {
              //此时可以提示用户打开授权
          }
        }
      })
    } else {
      console.log('当前微信版本不支持chooseAddress');
    }
  }
})

注意事项:

        调用该API之前需要用户授权,用户从未操作该项授权时(未拒绝、未同意、未手动打开),调用该API会默认弹出一个询问框,询问用户是否进行授权,用户确定后会进入success回调,拒绝则会进入fail回调。而一旦用户操作过该项授权(拒绝、同意、手动打开),调用该API将不会弹出询问框,而是直接采用上次用户的操作情况,也就是说,用户上次是拒绝那么这次默认也是拒绝。所以这个地方需要开发者灵活处理,办法有很多,在此暂时不做描述。


黑科技之三:获取地理位置

简介:

        获取用户地理位置需要调用wx.chooseLocation。

        该方法会打开地图,并在用户选择位置后返回地理位置信息。

代码实现:

Page({
  chooseLocation: function () {
    var that = this;
    wx.chooseLocation({
      success: function (res) {
        console.log(res);
        //地址数据处理
        var regex = /^(北京市|天津市|重庆市|上海市|香港特别行政区|澳门特别行政区)/;
        var REGION_PROVINCE = [];
        var addressBean = {
          REGION_PROVINCE: null,
          REGION_COUNTRY: null,
          REGION_CITY: null,
          ADDRESS: null
        };

        function regexAddressBean(address, addressBean) {
          regex = /^(.*?[市州]|.*?地区|.*?特别行政区)(.*?[市区县])(.*?)$/g;
          var addxress = regex.exec(address);
          addressBean.REGION_CITY = addxress[1];
          addressBean.REGION_COUNTRY = addxress[2];
          addressBean.ADDRESS = addxress[3] + "(" + res.name + ")";
        }
        if (!(REGION_PROVINCE = regex.exec(res.address))) {
          regex = /^(.*?(省|自治区))(.*?)$/;
          REGION_PROVINCE = regex.exec(res.address);
          addressBean.REGION_PROVINCE = REGION_PROVINCE[1];
          regexAddressBean(REGION_PROVINCE[3], addressBean);
        } else {
          addressBean.REGION_PROVINCE = REGION_PROVINCE[1];
          regexAddressBean(res.address, addressBean);
        }
        //设置数据
        console.log(addressBean);
      },
      fail: function (err) {
        // fail
      },
      complete: function () {
        // complete
      }
    })
  }
})

        很多时候我们需要把省、市、区、详细地址独立出来,所以上述代码对wx.chooseLocation返回的地址数据进行了处理。

        下面分别是原始数据和处理后的数据:


注意事项:

        同获取通讯地址

结语

以上只是简单介绍了三种黑科技,但要完整使用还需要很重要的一步,那就是用户拒绝授权的后续处理,具体做法会在下一篇文章介绍。


版权声明:本文由不落阁原创出品,转载请注明出处!

本文链接:http://www.leo96.com/article/detail/36

本文配乐
来说两句吧
最新评论
  • BEIMING
    BEIMING
    [可怜]hhh

    Emil
    Emil 回复 BEIMING 二维

    2019-03-22 09:37回复

    Emil
    Emil 回复 Emil 儿童

    2019-03-30 14:37回复

    Emil
    Emil 回复 Emil 二温热热若问

    2019-03-30 14:37回复

    Emil
    Emil 回复 Emil 3任然 去

    2019-04-09 00:02回复

    Emil
    Emil 回复 Emil 是的

    2019-04-09 00:23回复

    Emil
    Emil 回复 Emil EES

    2019-04-09 12:43回复

    Emil
    Emil 回复 Emil 计划

    2019-04-10 01:04回复

  • 墨殇
    墨殇
    12212

    墨殇
    墨殇 回复 墨殇 222

    2019-01-07 10:25回复

  • 思君满月
    思君满月
    你好啊