微信小程序如何获取用户手机号


Posted in Javascript onJanuary 26, 2018

最近在做一款微信小程序,需要获取用户手机号,具体步骤如下:

流程图:

微信小程序如何获取用户手机号

1、首先,客户端调用wx.login,回调数据了包含jscode,用于获取openid(用户唯一标识)和sessionkey(会话密钥)。

2、拿到jscode后,将其发送给服务端,服务端拿它与微信服务端做交互获取openid和sessionkey。具体获取方法如下:

(1)需要写一个HttpUrlConnection工具类:

public class MyHttpUrlConnection { 
 private final int mTimeout = 10000; // 超时时间 
 /** 
 * get访问 
 */ 
 public String[] requestJson(String url) { 
 return request(url); 
 } 
 private String[] request(String connurl) { 
 String[] resultStr = new String[]{"", ""}; 
 StringBuilder resultData = new StringBuilder(""); 
 HttpURLConnection conn = null; 
 try { 
  URL url = new URL(connurl); 
  conn = (HttpURLConnection) url.openConnection(); 
  conn.setRequestMethod("GET"); 
  conn.setUseCaches(false); 
  conn.setConnectTimeout(mTimeout); 
  conn.connect(); 
  int resultCode = conn.getResponseCode(); 
  InputStreamReader in; 
  if (resultCode == 200) { 
  in = new InputStreamReader(conn.getInputStream()); 
  BufferedReader buffer = new BufferedReader(in); 
  String inputLine; 
  while ((inputLine = buffer.readLine()) != null) { 
   resultData.append(inputLine); 
   resultData.append("\n"); 
  } 
  buffer.close(); 
  in.close(); 
  } 
  resultStr[0] = resultData.toString(); 
  resultStr[1] = resultCode + ""; 
 } catch (Exception e) { 
  e.printStackTrace(); 
 } finally { 
  if (conn != null) { 
  conn.disconnect(); 
  } 
 } 
 return resultStr; 
 } 
}

(2)然后通过这个工具类与微信服务器建立连接,获取想要的数据:

String url = "https://api.weixin.qq.com/sns/jscode2session?appid=""&secret=""&js_code=" 
   + jsCode + "&grant_type=authorization_code"; 
 String res[] = connection.requestJson(url); 
 System.out.println(res[0]); 
 JSONObject object = JSON.parseObject(res[0]); 
 String openId = object.getString("openid"); 
 String session_key = object.getString("session_key");

其中appid和secret都是自己开发者账号里可以查询到的,js_code是客户端发过来的,这样在返回的数据中就可以获取sessionkey。

3、服务器A拿到sessionkey后,生成一个随机数我们叫3rdsession,以3rdSessionId为key,以sessionkey + openid为value缓存到redis或memcached中;因为微信团队不建议直接将sessionkey在网络上传输,由开发者自行生成唯一键与sessionkey关联。其作用是: (1)、将3rdSessionId返回给客户端,维护小程序登录态。

(2)、通过3rdSessionId找到用户sessionkey和openid。

4、客户端拿到3rdSessionId后缓存到storage,
5、通过wx.getUserIinfo可以获取到用户敏感数据encryptedData 。
6、客户端将encryptedData、3rdSessionId和偏移量一起发送到服务器A
7、服务器A根据3rdSessionId从缓存中获取session_key
8、在服务器A使用AES解密encryptedData,从而实现用户敏感数据解密。

解密数据需要用到的参数有三个,分别是:

1、encryptedData(密文)
2、iv(向量)
3、aesKey(密钥)也就是sessionkey

在解密的时候要将上述三个变量做Base64解码:

byte[] encrypData = UtilEngine.decode(encData); 
byte[] ivData = UtilEngine.decode(iv); 
byte[] sessionKey = UtilEngine.decode(session_key);

然后使用AES解密方法进行解密:

public static byte[] decrypt(byte[] key, byte[] iv, byte[] encData) 
 throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, 
 InvalidKeyException, BadPaddingException, IllegalBlockSizeException { 
 AlgorithmParameterSpec ivSpec = new IvParameterSpec(iv); 
 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
 SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); 
 cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec); 
 return cipher.doFinal(encData); 
}

这样在返回的数据中就可以拿到用户的手机号。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript仿PHP $_GET获取URL中的参数
May 12 Javascript
《JavaScript函数式编程》读后感
Aug 07 Javascript
javascript中this指向详解
Apr 23 Javascript
bootstrap和jQuery.Gantt的css冲突 如何解决
May 29 Javascript
AngularJS 整理一些优化的小技巧
Aug 18 Javascript
jQuery实现可拖动进度条实例代码
Jun 21 jQuery
JavaScript通过mouseover()实现图片变大效果的示例
Dec 20 Javascript
原生js实现移动端触摸轮播的示例代码
Dec 22 Javascript
vue-content-loader内容加载器的使用方法
Aug 05 Javascript
微信小程序时间选择插件使用详解
Dec 28 Javascript
js实现九宫格抽奖
Mar 19 Javascript
TypeScript 内置高级类型编程示例
Sep 23 Javascript
Vue header组件开发详解
Jan 26 #Javascript
Vue shopCart 组件开发详解
Jan 26 #Javascript
jquery写出PC端轮播图实例
Jan 26 #jQuery
深入理解vue中slot与slot-scope的具体使用
Jan 26 #Javascript
从零开始最小实现react服务器渲染详解
Jan 26 #Javascript
微信小程序模版渲染详解
Jan 26 #Javascript
微信小程序如何获取用户信息
Jan 26 #Javascript
You might like
linux下 C语言对 php 扩展
2008/12/14 PHP
使用PHP备份MySQL和网站发送到邮箱实例代码
2013/11/28 PHP
php实现数字补零的方法总结
2018/09/12 PHP
php提高脚本性能的4个技巧
2020/08/18 PHP
让iframe框架网页在任何浏览器下自动伸缩
2006/08/18 Javascript
Using the TextRange Object
2006/10/14 Javascript
使用jQuery Ajax功能时需要注意的一个问题(内存溢出)
2012/05/30 Javascript
js 距离某一时间点时间是多少实现代码
2013/10/14 Javascript
js父页面与子页面不同时显示的方法
2014/10/16 Javascript
Jquery中巧用Ajax的beforeSend方法
2016/01/20 Javascript
完美实现js焦点轮播效果(二)(图片可滚动)
2017/03/07 Javascript
详解React中的组件通信问题
2017/07/31 Javascript
浅谈vue中数据双向绑定的实现原理
2017/09/14 Javascript
在vue里使用codemirror遇到的问题
2018/11/01 Javascript
jQuery事件多次绑定与解绑问题实例分析
2019/02/19 jQuery
js实现点击选项置顶动画效果
2020/08/25 Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
2020/10/12 Javascript
[02:40]DOTA2英雄基础教程 巨牙海民
2013/12/23 DOTA
[03:52]显微镜下的DOTA2第三期——英雄在无聊的时候干什么
2014/06/20 DOTA
跟老齐学Python之有容乃大的list(4)
2014/09/28 Python
一个基于flask的web应用诞生(1)
2017/04/11 Python
Python 对象中的数据类型
2017/05/13 Python
python判断设备是否联网的方法
2018/06/29 Python
Laravel框架表单验证格式化输出的方法
2019/09/25 Python
python tkinter之顶层菜单、弹出菜单实例
2020/03/04 Python
Django模板获取field的verbose_name实例
2020/05/19 Python
python等待10秒执行下一命令的方法
2020/07/19 Python
python 基于Apscheduler实现定时任务
2020/12/15 Python
迪卡侬荷兰官网:Decathlon荷兰
2017/10/29 全球购物
求职面试个人自我评价
2014/02/28 职场文书
竞选学习委员演讲稿
2014/09/01 职场文书
2015年管理人员工作总结
2015/05/13 职场文书
安全第一课观后感
2015/06/18 职场文书
课文《燕子》教学反思
2016/02/17 职场文书
nginx lua 操作 mysql
2022/05/15 Servers
详解Anyscript开发指南绕过typescript类型检查
2022/09/23 Javascript