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


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也能使用EXTJS视频演示
Dec 29 Javascript
JavaScript中OnLoad几种使用方法
Dec 15 Javascript
多个js与css文件的合并方法详细说明
Dec 26 Javascript
jQuery实现将页面上HTML标签换成另外标签的方法
Jun 09 Javascript
jQuery实现仿百度首页滑动伸缩展开的添加服务效果代码
Sep 09 Javascript
javascript代码调试之console.log 用法图文详解
Sep 30 Javascript
详解在Angular项目中添加插件ng-bootstrap
Jul 04 Javascript
react native仿微信PopupWindow效果的实例代码
Aug 07 Javascript
详解vue-cil和webpack中本地静态图片的路径问题解决方案
Sep 27 Javascript
axios的拦截请求与响应方法
Aug 11 Javascript
JavaScript监听触摸事件代码实例
Dec 30 Javascript
javascript设计模式 ? 享元模式原理与用法实例分析
Apr 15 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
flash用php连接数据库的代码
2011/04/21 PHP
微信扫描二维码登录网站代码示例
2013/12/30 PHP
ThinkPHP分组下自定义标签库实例
2014/11/01 PHP
php以post形式发送xml的方法
2014/11/04 PHP
浅析php适配器模式(Adapter)
2014/11/25 PHP
javascript中的window.location.search方法简介
2013/09/02 Javascript
javascript在子页面中函数无法调试问题解决方法
2014/01/17 Javascript
jQuery中slideUp()方法用法分析
2014/12/24 Javascript
jQuery中$.extend()用法实例
2015/06/24 Javascript
基于javascript编写简单日历
2016/05/02 Javascript
移动端jQuery修正Web页面滑动时div问题的两则实例
2016/05/30 Javascript
浅谈JavaScript函数的四种存在形态
2016/06/08 Javascript
JavaScript之Vue.js【入门基础】
2016/12/06 Javascript
微信小程序 高德地图SDK详解及简单实例(源码下载)
2017/01/11 Javascript
JavaScript在form表单中使用button按钮实现submit提交方法
2017/01/23 Javascript
vue 请求后台数据的实例代码
2017/06/22 Javascript
Vue SPA单页应用首屏优化实践
2018/06/28 Javascript
ES6知识点整理之Proxy的应用实例详解
2019/04/16 Javascript
Vue安装浏览器开发工具的步骤详解
2019/05/12 Javascript
JavaScript实现动态留言板
2020/03/16 Javascript
编写Python脚本把sqlAlchemy对象转换成dict的教程
2015/05/29 Python
Python实现matplotlib显示中文的方法详解
2018/02/06 Python
基于python list对象中嵌套元组使用sort时的排序方法
2018/04/18 Python
python+OpenCV实现车牌号码识别
2019/11/08 Python
如何提高python 中for循环的效率
2020/04/15 Python
python使用正则表达式匹配txt特定字符串(有换行)
2020/12/09 Python
加拿大城市本地限时优惠:Buytopia.ca
2018/09/19 全球购物
美国在线鞋类零售商:LifeStride
2019/06/09 全球购物
介绍一下如何优化MySql
2016/12/20 面试题
员工拾金不昧表扬信
2014/01/09 职场文书
环保专项行动方案
2014/05/12 职场文书
2014年优秀党员材料
2014/12/18 职场文书
Python time库的时间时钟处理
2021/05/02 Python
Python面向对象之内置函数相关知识总结
2021/06/24 Python
简单聊一聊SQL注入及防止SQL注入
2022/03/23 MySQL
Java代码规范与质量检测插件SonarLint的使用
2022/08/05 Java/Android