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


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语句中的CDATA标签的意义
May 09 Javascript
非常漂亮的JS代码经典广告
Oct 21 Javascript
一些mootools的学习资源
Feb 07 Javascript
jquery 多级下拉菜单核心代码
May 21 Javascript
基于jquery的表格排序
Sep 11 Javascript
js 火狐下取本地路径实现思路
Apr 02 Javascript
jquery ajax,ashx,json的用法总结
Feb 12 Javascript
jquery结婚电子请柬特效源码分享
Aug 21 Javascript
移动端js触摸事件详解
Sep 18 Javascript
利用Vue实现移动端图片轮播组件的方法实例
Aug 23 Javascript
layui表格 返回的数据状态异常的解决方法
Sep 10 Javascript
js实现小时钟效果
Mar 25 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
服务器端解压缩zip的脚本
2006/12/22 PHP
PHP运行出现Notice : Use of undefined constant 的完美解决方案分享
2012/03/05 PHP
php递归法读取目录及文件的方法
2015/01/30 PHP
php创建多级目录的方法
2015/03/24 PHP
Smarty模板常见的简单应用分析
2016/11/15 PHP
Swoole4.4协程抢占式调度器详解
2019/05/23 PHP
PHP针对redis常用操作实例详解
2019/08/17 PHP
Thinkphp 框架扩展之类库扩展操作详解
2020/04/23 PHP
JavaScript 继承的实现
2009/07/09 Javascript
Jquery Select操作方法集合脚本之家特别版
2010/05/17 Javascript
用js小类库获取浏览器的高度和宽度信息
2012/01/15 Javascript
JavaScript在XHTML中的用法详解
2013/04/11 Javascript
jQuery随便控制任意div隐藏的方法
2013/06/28 Javascript
js Object2String方便查看js对象内容
2014/11/24 Javascript
JS+CSS实现鼠标经过弹出一个DIV框完整实例(带缓冲动画渐变效果)
2016/03/25 Javascript
简单谈谈关于Angular Cli打包的事
2017/09/05 Javascript
Vue.js组件通信的几种姿势
2017/10/23 Javascript
微信小程序使用radio显示单选项功能【附源码下载】
2017/12/11 Javascript
Node.js assert断言原理与用法分析
2019/01/04 Javascript
Python中Continue语句的用法的举例详解
2015/05/14 Python
200行自定义python异步非阻塞Web框架
2017/03/15 Python
Python3.5集合及其常见运算实例详解
2019/05/01 Python
python实现雪花飘落效果实例讲解
2019/06/18 Python
python 基于opencv去除图片阴影
2021/01/26 Python
HTML5拖拽文件到浏览器并实现文件上传下载功能代码
2013/06/06 HTML / CSS
猫途鹰:全球领先的旅游点评社区
2017/04/07 全球购物
大唐面试试题(CPU,UNIX等等)
2012/01/11 面试题
食堂个人先进事迹
2014/01/22 职场文书
幼儿园小班教师寄语
2014/04/03 职场文书
内蒙古鄂尔多斯市市长寄语
2014/04/10 职场文书
优秀教师自我评价范文
2014/09/27 职场文书
2015年乡镇扶贫工作总结
2015/04/08 职场文书
2015小学五年级班主任工作总结
2015/05/21 职场文书
小学开学典礼新闻稿
2015/07/17 职场文书
党员反邪教心得体会
2016/01/15 职场文书
德劲DE1102数字调谐收音机机评
2022/04/07 无线电