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


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 相关文章推荐
jquery ajax return没有返回值的解决方法
Oct 20 Javascript
解决jquery异步按一定的时间间隔刷新问题
Dec 10 Javascript
js将iframe中控件的值传到主页面控件中的实现方法
Mar 11 Javascript
jquery 添加节点的几种方法介绍
Sep 04 Javascript
jQuery切换网页皮肤并保存到Cookie示例代码
Jun 16 Javascript
jquery实现的树形目录实例
Jun 26 Javascript
javascript实现3D切换焦点图
Oct 16 Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
Nov 25 Javascript
浅谈JavaScript中promise的使用
Jan 11 Javascript
angular.fromJson与toJson方法用法示例
May 17 Javascript
vue引入axios同源跨域问题
Sep 27 Javascript
如何用RxJS实现Redux Form
Dec 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
PHP set_time_limit(0)长连接的实现分析
2010/03/02 PHP
php递归删除目录下的文件但保留的实例分享
2014/05/10 PHP
Yii核心组件AssetManager原理分析
2014/12/02 PHP
在Thinkphp中使用ajax实现无刷新分页的方法
2016/10/25 PHP
PHP加MySQL消息队列深入理解
2021/02/27 PHP
javascript实现划词标记+划词搜索功能
2007/03/06 Javascript
js实现双向链表互联网机顶盒实战应用实现
2011/10/28 Javascript
JS实现点击下载的小例子
2013/07/10 Javascript
js获取url参数代码实例分享(JS操作URL)
2013/12/13 Javascript
基于jQuery实现收缩展开功能
2016/03/18 Javascript
基于JS如何实现给字符加千分符(65,541,694,158)
2016/08/03 Javascript
网络传输协议(http协议)
2016/11/18 Javascript
Bootstrap下拉菜单Dropdowns的实现代码
2017/03/17 Javascript
vue2.0多条件搜索组件使用详解
2020/03/26 Javascript
基于jquery日历价格、库存等设置插件
2020/07/05 jQuery
JavaScript之DOM插入更新删除_动力节点Java学院整理
2017/07/03 Javascript
Vue中computed与methods的区别详解
2018/03/24 Javascript
vue2.0 使用element-ui里的upload组件实现图片预览效果方法
2018/09/04 Javascript
浅谈JS的原型和继承
2019/05/08 Javascript
javascript定时器的简单应用示例【控制方块移动】
2019/06/17 Javascript
jQuery zTree插件使用简单教程
2019/08/16 jQuery
layui前端时间戳转化实例
2019/11/15 Javascript
vue addRoutes路由动态加载操作
2020/08/04 Javascript
在Windows8上的搭建Python和Django环境
2014/07/03 Python
Python构建XML树结构的方法示例
2017/06/30 Python
Python3.5装饰器典型案例分析
2019/04/30 Python
Python递归函数特点及原理解析
2020/03/04 Python
浅谈html5 video 移动端填坑记
2018/01/15 HTML / CSS
Wilson体育用品官网:美国著名运动器材品牌
2019/05/12 全球购物
药品质量检测应届生求职信
2013/11/14 职场文书
学生喝酒检讨书
2014/02/06 职场文书
留学经费担保书
2014/05/12 职场文书
销售团队激励口号
2014/06/06 职场文书
2014年创卫工作总结
2014/11/24 职场文书
检讨书模板大全
2015/05/07 职场文书
方法汇总:Python 安装第三方库常用
2022/04/26 Python