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


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 相关文章推荐
slice函数的用法 之不错的应用
Dec 29 Javascript
将HTMLCollection/NodeList/伪数组转换成数组的实现方法
Jun 20 Javascript
jquery异步请求实例代码
Jun 21 Javascript
jquery随意添加移除html的实现代码
Jun 21 Javascript
jQuery基础知识小结
Dec 22 Javascript
javascript中基本类型和引用类型的区别分析
May 12 Javascript
JavaScript数组合并的多种方法
May 22 Javascript
详解自动生成博客目录案例
Dec 09 Javascript
JavaScript实现微信红包算法及问题解决方法
Apr 26 Javascript
jquery判断滚动条距离顶部的距离方法
Sep 05 jQuery
Electron-vue脚手架改造vue项目的方法
Oct 22 Javascript
在Vue中实现随hash改变响应菜单高亮
Mar 09 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
用PHP的反射实现委托模式的讲解
2019/03/22 PHP
如何用js控制css中的float的代码
2007/08/16 Javascript
Javascript this指针
2009/07/30 Javascript
通过jquery的$.getJSON做一个跨域ajax请求试验
2011/05/03 Javascript
使用javascript实现有效时间的控制,并显示将要过期的时间
2014/01/02 Javascript
js获取当前路径的简单示例代码
2014/01/08 Javascript
jQuery中scrollLeft()方法用法实例
2015/01/16 Javascript
深入理解JavaScript系列(42):设计模式之原型模式详解
2015/03/04 Javascript
JavaScript获取伪元素(Pseudo-Element)属性的方法技巧
2015/03/13 Javascript
JS组件系列之Bootstrap Icon图标选择组件
2016/01/28 Javascript
jQuery 常见小例汇总
2016/12/14 Javascript
vue2.x select2 指令封装详解
2017/10/12 Javascript
详解如何实现一个简单的Node.js脚手架
2017/12/04 Javascript
详解微信小程序工程化探索之webpack实战
2020/04/20 Javascript
vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)
2021/03/01 Vue.js
python中sys.argv参数用法实例分析
2015/05/20 Python
在Django的form中使用CSS进行设计的方法
2015/07/18 Python
Python Cookie 读取和保存方法
2018/12/28 Python
python+selenium 定位到元素,无法点击的解决方法
2019/01/30 Python
Python利用heapq实现一个优先级队列的方法
2019/02/03 Python
Python和Go语言的区别总结
2019/02/20 Python
Python3.5迭代器与生成器用法实例分析
2019/04/30 Python
python模拟点击网页按钮实现方法
2020/02/25 Python
TensorFlow打印输出tensor的值
2020/04/19 Python
利用Python中的Xpath实现一个在线汇率转换器
2020/09/09 Python
python通过cython加密代码
2020/12/11 Python
Python爬虫制作翻译程序的示例代码
2021/02/22 Python
需要知道的CSS3动画技术
2010/01/01 HTML / CSS
法律专业推荐信范文
2013/11/29 职场文书
标准化管理实施方案
2014/02/25 职场文书
知识就是力量演讲稿
2014/09/13 职场文书
医生个人自我剖析材料
2014/10/08 职场文书
七年级地理教学计划
2015/01/22 职场文书
单身狗福利?Python爬取某婚恋网征婚数据
2021/06/03 Python
python中opencv实现图片文本倾斜校正
2021/06/11 Python
springboot入门 之profile设置方式
2022/04/04 Java/Android