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


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 相关文章推荐
利用js跨页面保存变量做菜单的方法
Jan 17 Javascript
JQuery Dialog的内存泄露问题解决方法
Jun 18 Javascript
JS操作Cookies包括(读取添加与删除)
Dec 26 Javascript
js确认删除对话框适用于a标签及submit
Jul 10 Javascript
jquery图片倾斜层叠切换特效代码分享
Aug 27 Javascript
深入浅出讲解ES6的解构
Aug 03 Javascript
jQuery插件jqGrid动态获取列和列字段的方法
Mar 03 Javascript
关于JS与jQuery中的文档加载问题
Aug 22 jQuery
详解微信小程序input标签正则初体验
Aug 18 Javascript
浅入深出Vue之自动化路由
Aug 06 Javascript
layer 刷新某个页面的实现方法
Sep 05 Javascript
vue中解决拖拽改变存在iframe的div大小时卡顿问题
Jul 22 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删除文件夹的三种方法
2013/06/09 PHP
thinkphp诸多限制条件下如何getshell详解
2020/12/09 PHP
JavaScript 设计模式 富有表现力的Javascript(一)
2010/05/26 Javascript
Pro JavaScript Techniques学习笔记
2010/12/28 Javascript
jquery中ajax学习笔记3
2011/10/16 Javascript
javascript实现表单提交后,提交按钮不可用的方法
2015/04/18 Javascript
基于jquery实现可定制的web在线富文本编辑器附源码下载
2015/11/17 Javascript
JS中call/apply、arguments、undefined/null方法详解
2016/02/15 Javascript
Angularjs CURD 详解及实例代码
2016/09/14 Javascript
使用bootstrap实现多窗口和拖动效果
2016/09/22 Javascript
原生js实现放大镜
2017/02/20 Javascript
jQuery滚动监听实现商城楼梯式导航效果
2017/03/06 Javascript
PM2自动部署代码步骤流程总结
2018/12/10 Javascript
微信小程序常用简易小函数总结
2019/02/01 Javascript
JavaScript实现英语单词题库
2019/12/24 Javascript
JavaScript回调函数callback用法解析
2020/01/14 Javascript
Vue实现input宽度随文字长度自适应操作
2020/07/29 Javascript
python将unicode转为str的方法
2017/06/21 Python
利用Pandas读取文件路径或文件名称包含中文的csv文件方法
2018/07/04 Python
Python实现的连接mssql数据库操作示例
2018/08/17 Python
pip指定python位置安装软件包的方法
2019/07/12 Python
Python中os模块功能与用法详解
2020/02/26 Python
Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能
2020/12/21 Python
css3和jquery实现的可折叠导航菜单适合放在手机网页的导航菜单
2014/09/02 HTML / CSS
如何利用find命令查找文件
2015/02/07 面试题
大学同学聚会邀请函
2014/01/19 职场文书
网络工程师专家职业发展路线
2014/02/14 职场文书
绩效工资实施方案
2014/03/15 职场文书
主要负责人任命书
2014/06/06 职场文书
大学生考试作弊检讨书
2014/09/21 职场文书
违章停车检讨书
2014/10/21 职场文书
党的群众路线教育实践活动学习笔记范文
2014/11/06 职场文书
拾金不昧表扬信
2015/01/16 职场文书
首都博物馆观后感
2015/06/05 职场文书
国庆阅兵观后感
2015/06/15 职场文书
2019学校运动会开幕词
2019/05/13 职场文书