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


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下过滤数组重复值的代码
Sep 10 Javascript
javascript call和apply方法
Nov 24 Javascript
javascript实现的在当前窗口中漂浮框的代码
Mar 15 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
May 14 Javascript
JavaScript中用于四舍五入的Math.round()方法讲解
Jun 15 Javascript
轻松实现JavaScript图片切换
Jan 12 Javascript
深入理解jQuery 事件处理
Jun 14 Javascript
Bootstrap框架结合jQuery仿百度换肤功能实例解析
Sep 17 Javascript
关于Angular2 + node接口调试的解决方案
May 28 Javascript
Bootstrap table 实现树形表格联动选中联动取消功能
Sep 30 Javascript
浅谈JavaScript窗体Window.ShowModalDialog使用
Jul 22 Javascript
vue3.0搭配.net core实现文件上传组件
Oct 29 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
丧钟首部独立剧集《丧钟:骑士与龙》北美正式开播,场面血腥
2020/04/09 欧美动漫
php将fileterms函数返回的结果变成可读的形式
2011/04/21 PHP
PHP常用的文件操作函数经典收藏
2013/04/02 PHP
关于shopex同步ucenter的redirect问题,导致script不运行
2013/04/10 PHP
php实现批量压缩图片文件大小的脚本
2014/07/04 PHP
利用 fsockopen() 函数开放端口扫描器的实例
2017/08/19 PHP
Docker搭建自己的PHP开发环境
2018/02/24 PHP
Javascript - HTML的request类
2006/07/15 Javascript
浅析document.createDocumentFragment()与js效率
2013/07/08 Javascript
javascript继承机制实例详解
2014/11/20 Javascript
jquery+CSS实现的水平布局多级网页菜单效果
2015/08/24 Javascript
node.js 中国天气预报 简单实现
2016/06/06 Javascript
JavaScript之WebSocket技术详解
2016/11/18 Javascript
微信小程序  http请求封装详解及实例代码
2017/02/15 Javascript
Angular.js实现多个checkbox只能选择一个的方法示例
2017/02/24 Javascript
Bootstrap fileinput文件上传组件使用详解
2017/06/06 Javascript
Javascript ES6中对象类型Sets的介绍与使用详解
2017/07/17 Javascript
jQuery EasyUI开发技巧总结
2017/09/26 jQuery
浅谈在vue中使用mint-ui swipe遇到的问题
2018/09/27 Javascript
微信小程序如何实现五星评价功能
2019/10/15 Javascript
VUE实现强制渲染,强制更新
2019/10/29 Javascript
图解JS原型和原型链实现原理
2020/09/15 Javascript
你不知道的SpringBoot与Vue部署解决方案
2020/11/09 Javascript
ES6学习教程之Promise用法详解
2020/11/22 Javascript
在Python的Flask框架中实现全文搜索功能
2015/04/20 Python
Python3.x版本中新的字符串格式化方法
2015/04/24 Python
Python+PIL实现支付宝AR红包
2018/02/09 Python
Django Aggregation聚合使用方法解析
2019/08/01 Python
python实现高斯(Gauss)迭代法的例子
2019/11/20 Python
对Tensorflow中tensorboard日志的生成与显示详解
2020/02/04 Python
django有外键关系的两张表如何相互查找
2020/02/10 Python
大学生工作求职信
2014/06/23 职场文书
体育专业求职信
2014/07/16 职场文书
三八妇女节趣味活动方案
2014/08/23 职场文书
2014年纪检监察工作总结
2014/11/11 职场文书
2015年调度员工作总结
2015/04/30 职场文书