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


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 自动完成 AutoComplete(Ajax 查询)
Jul 07 Javascript
JS控制输入框内字符串长度
May 21 Javascript
js换图片效果可进行定时操作
Jun 09 Javascript
jQuery插件zoom实现图片全屏放大弹出层特效
Apr 15 Javascript
js库Modernizr的介绍和使用
May 07 Javascript
可以浮动某个物体的jquery控件用法实例
Jul 24 Javascript
15个常用的jquery代码片段
Dec 19 Javascript
Vue.JS入门教程之处理表单
Dec 01 Javascript
微信小程序图片右边加两行文字的代码
Apr 23 Javascript
Vue发布订阅模式实现过程图解
Apr 30 Javascript
浅谈JavaScript中的“!!”作用
Aug 03 Javascript
详解JavaScript中的执行上下文及调用堆栈
Apr 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与SQL注入攻击[二]
2007/04/17 PHP
PHP标准库(PHP SPL)详解
2019/03/16 PHP
jquery显示loading图片直到网页加载完成的方法
2015/06/25 Javascript
JS实现超精简的链接列表在固定区域内滚动效果代码
2015/11/04 Javascript
Node.js测试中的Mock文件系统详解
2016/11/21 Javascript
jQuery图片瀑布流的简单实现代码
2017/03/15 Javascript
angular $watch 一个变量的变化(实例讲解)
2017/08/02 Javascript
React中上传图片到七牛的示例代码
2017/10/10 Javascript
js 取消页面可以选中文字的功能方法
2018/01/02 Javascript
原生js实现form表单序列化的方法
2018/08/02 Javascript
对Vue beforeRouteEnter 的next执行时机详解
2018/08/25 Javascript
[48:05]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VGJ.T vs VP
2018/03/31 DOTA
关于python pyqt5安装失败问题的解决方法
2017/08/08 Python
Python操作Excel插入删除行的方法
2018/12/10 Python
Python二进制文件读取并转换为浮点数详解
2019/06/25 Python
Python求离散序列导数的示例
2019/07/10 Python
用Anaconda安装本地python包的方法及路径问题(图文)
2019/07/16 Python
python异常触发及自定义异常类解析
2019/08/06 Python
python二维键值数组生成转json的例子
2019/12/06 Python
通过实例解析python描述符原理作用
2020/01/22 Python
Python图像阈值化处理及算法比对实例解析
2020/06/19 Python
详解python算法常用技巧与内置库
2020/10/17 Python
Python基于内置函数type创建新类型
2020/10/22 Python
一个不错的HTML5 Canvas多层点击事件监听实例
2014/04/29 HTML / CSS
ONLY德国官方在线商店:购买时尚女装
2017/09/21 全球购物
Booking.com西班牙:全球酒店预订
2018/03/30 全球购物
水产养殖学应届生求职信
2013/09/29 职场文书
幼儿园长自我鉴定
2013/10/17 职场文书
教师岗位职责
2013/11/17 职场文书
应用外语系自荐信
2014/06/26 职场文书
英语课前三分钟演讲稿
2014/08/19 职场文书
销售经理岗位职责
2015/01/31 职场文书
北京天坛导游词
2015/02/12 职场文书
2015年终个人政治思想工作总结
2015/11/24 职场文书
2016年“世界气象日”广播稿
2015/12/17 职场文书
纯CSS如何禁止用户复制网页的内容
2021/11/01 HTML / CSS