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


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 innerHTML、outerHTML、innerText、outerText的区别
Nov 24 Javascript
javascript Array.remove() 数组删除
Aug 06 Javascript
IE8 chrome中table隔行换色解决办法
Jul 09 Javascript
Jquery.LazyLoad.js修正版下载,实现图片延迟加载插件
Mar 12 Javascript
jQuery数组处理代码详解(含实例演示)
Feb 03 Javascript
JavaScript中用sort()方法对数组元素进行排序的操作
Jun 09 Javascript
jQuery增加、删除及修改select option的方法
Aug 19 Javascript
JavaScript事件对象event用法分析
Jul 27 Javascript
vue实现todolist功能、todolist组件拆分及todolist的删除功能
Apr 11 Javascript
百度小程序之间的页面通信过程详解
Jul 18 Javascript
浅谈对于“不用setInterval,用setTimeout”的理解
Aug 28 Javascript
vue 项目中当访问路由不存在的时候默认访问404页面操作
Aug 31 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 IN_ARRAY 函数使用注意事项
2010/07/24 PHP
php使用strtotime和date函数判断日期是否有效代码分享
2013/12/25 PHP
PHP人民币金额转大写实例代码
2015/10/02 PHP
Zend Framework教程之Zend_Form组件实现表单提交并显示错误提示的方法
2016/03/21 PHP
php断点续传之文件分割合并详解
2016/12/13 PHP
Javascript Global对象
2009/08/13 Javascript
JS面向对象编程之对象使用分析
2010/08/19 Javascript
封装的原生javascript弹出层代码
2010/09/24 Javascript
JavaScript操作DOM元素的childNodes和children区别
2015/04/01 Javascript
基于jquery实现可定制的web在线富文本编辑器附源码下载
2015/11/17 Javascript
JavaScript实现打开链接页面的方式汇总
2016/06/02 Javascript
jQuery绑定事件方法及区别(bind,click,on,live,one)
2017/08/14 jQuery
了解前端理论:rscss和rsjs
2019/05/23 Javascript
vue实现的上拉加载更多数据/分页功能示例
2019/05/25 Javascript
浅谈VUE中演示v-for为什么要加key
2020/01/16 Javascript
手把手教您实现react异步加载高阶组件
2020/04/07 Javascript
jQuery cookie的公共方法封装和使用示例
2020/06/01 jQuery
详解Vue之计算属性
2020/06/20 Javascript
javascript实现前端分页功能
2020/11/26 Javascript
python的绘图工具matplotlib使用实例
2014/07/03 Python
总结Python中逻辑运算符的使用
2015/05/13 Python
Django REST为文件属性输出完整URL的方法
2017/12/18 Python
浅谈Python基础—判断和循环
2019/03/22 Python
pytorch三层全连接层实现手写字母识别方式
2020/01/14 Python
Python作用域与名字空间原理详解
2020/03/21 Python
python 日志 logging模块详细解析
2020/03/31 Python
Java ExcutorService优雅关闭方式解析
2020/05/30 Python
英国第一的滑雪服装和装备零售商:Snow+Rock
2020/02/01 全球购物
linux系统都有哪些运行级别
2016/03/26 面试题
庆祝教师节活动方案
2014/01/31 职场文书
小学生美德少年事迹
2014/02/02 职场文书
十佳美德少年事迹材料
2014/02/05 职场文书
用人单位终止解除劳动合同证明书
2014/10/06 职场文书
2015年设计师个人工作总结
2015/04/25 职场文书
小学语文课《掌声》教学反思
2016/03/03 职场文书
导游词之西湖雷峰塔
2019/09/18 职场文书