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


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 应用类库代码
Jun 02 Javascript
创建公共调用 jQuery Ajax 带返回值
Aug 01 Javascript
用显卡加速,轻松把笔记本打造成取暖器的办法!
Apr 17 Javascript
JQuery 文本框回车跳到下一个文本框示例代码
Aug 30 Javascript
JavaScript中的getTime()方法使用详解
Jun 10 Javascript
JS实现的鼠标跟随代码(卡通手型点击效果)
Oct 26 Javascript
ui组件之input多选下拉实现方法(带有搜索功能)
Jul 14 Javascript
AngularJS实现标签页的两种方式
Sep 05 Javascript
jQuery表单元素选择器代码实例
Feb 06 Javascript
JavaScript实现秒杀时钟倒计时
Sep 29 Javascript
Vue-cli 移动端布局和动画使用详解
Aug 10 Javascript
关于JavaScript中异步/等待的用法与理解
Nov 18 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 MemCached高级缓存配置图文教程
2010/08/05 PHP
php中使用Ajax时出现Error(c00ce56e)的详细解决方案
2014/11/03 PHP
Yii2中如何使用modal弹窗(基本使用)
2016/05/30 PHP
PHP性能测试工具xhprof安装与使用方法详解
2018/04/29 PHP
判断是否输入完毕再激活提交按钮
2006/06/26 Javascript
理解 JavaScript 预解析
2009/10/25 Javascript
jQuery编写widget的一些技巧分享
2010/10/28 Javascript
Nodejs使用mysql模块之获得更新和删除影响的行数的方法
2014/03/18 NodeJs
node.js中的fs.utimes方法使用说明
2014/12/15 Javascript
详解JavaScript对W3C DOM模版的支持情况
2015/06/16 Javascript
AngularJS单选框及多选框实现双向动态绑定
2016/01/13 Javascript
详解JavaScript表单验证(E-mail 验证)
2016/03/31 Javascript
jQuery+ajax+asp.net获取Json值的方法
2016/06/08 Javascript
jQuery实现ajax无刷新分页页码控件
2017/02/28 Javascript
angularjs ui-router中路由的二级嵌套
2017/03/10 Javascript
vue实现微信二次分享以及自定义分享的示例
2019/03/20 Javascript
js实现窗口全屏示例详解
2019/09/17 Javascript
JavaScript数组排序小程序实现解析
2020/01/13 Javascript
Bootstrap FileInput实现图片上传功能
2021/01/28 Javascript
让python的Cookie.py模块支持冒号做key的方法
2010/12/28 Python
itchat接口使用示例
2017/10/23 Python
python合并同类型excel表格的方法
2018/04/01 Python
对python遍历文件夹中的所有jpg文件的实例详解
2018/12/08 Python
python-numpy-指数分布实例详解
2019/12/07 Python
python如何通过pyqt5实现进度条
2020/01/20 Python
Python sublime安装及配置过程详解
2020/06/29 Python
python-图片流传输的思路及示例(url转换二维码)
2020/12/21 Python
使用HTML5捕捉音频与视频信息概述及实例
2018/08/22 HTML / CSS
百思买美国官网:Best Buy
2016/07/28 全球购物
服务中心夜班服务员岗位职责
2013/11/27 职场文书
土木工程专业推荐信
2014/02/19 职场文书
怎样写辞职信
2015/02/27 职场文书
2015年超市工作总结
2015/04/09 职场文书
cf战队宣传语
2015/07/13 职场文书
大队委员竞选稿
2015/11/20 职场文书
python 管理系统实现mysql交互的示例代码
2021/12/06 Python