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


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 30 Javascript
基于jQuery中对数组进行操作的方法
Apr 16 Javascript
JavaScript获取onclick、onchange等事件值的代码
Jul 22 Javascript
jQuery实现图片左右滚动特效
Apr 20 Javascript
Jquery获取第一个子元素简单实例
Jun 02 Javascript
javascript中Number的方法小结
Nov 21 Javascript
jQuery html表格排序插件tablesorter使用方法详解
Feb 10 Javascript
基于Vue实现页面切换左右滑动效果
Jun 29 Javascript
微信上传视频文件提示(推荐)
Nov 22 Javascript
jQuery实现的五星点评功能【案例】
Feb 18 jQuery
微信小程序实现的绘制table表格功能示例
Apr 26 Javascript
对layer弹出框中icon数字参数的说明介绍
Sep 04 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
一个显示天气预报的程序
2006/10/09 PHP
PHP编程中八种常见的文件操作方式
2006/11/19 PHP
使ecshop模板中可引用常量的实现方法
2011/06/02 PHP
解析thinkphp import 文件内容变量失效的问题
2013/06/20 PHP
php动态读取数据清除最右边距的方法
2017/04/12 PHP
PHP封装的完整分页类示例
2018/08/21 PHP
不常用但很实用的PHP预定义变量分析
2019/06/25 PHP
Javascript String对象扩展HTML编码和解码的方法
2009/06/02 Javascript
Javascript 遮罩层和加载效果代码
2013/08/01 Javascript
javascript中直接引用Microsoft的COM生成Word
2014/01/20 Javascript
禁用Enter键表单自动提交实现代码
2014/05/22 Javascript
QQ登录背景闪动效果附效果演示源码下载
2015/09/22 Javascript
javascript新闻跑马灯实例代码
2020/07/29 Javascript
AngularJS表单详解及示例代码
2016/08/17 Javascript
react-router JS 控制路由跳转实例
2017/06/15 Javascript
jquery 输入框查找关键字并提亮颜色的实例代码
2018/01/23 jQuery
微信小程序 setData 对 data数据影响问题
2019/04/18 Javascript
wx-charts 微信小程序图表插件的具体使用
2019/08/18 Javascript
JS如何生成动态列表
2020/09/22 Javascript
一起深入理解js中的事件对象
2021/02/06 Javascript
微信跳一跳自动运行python脚本
2018/01/08 Python
jupyter notebook引用from pyecharts.charts import Bar运行报错
2020/04/23 Python
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
2018/12/05 Python
python查询文件夹下excel的sheet名代码实例
2019/04/02 Python
python获取栅格点和面值的实现
2020/03/10 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
2020/04/16 Python
phonegap常用事件总结(必看篇)
2017/03/31 HTML / CSS
优质有机椰子产品:Dr. Goerg
2019/09/24 全球购物
基层干部十八大感言
2014/01/19 职场文书
组工干部对照检查材料
2014/08/25 职场文书
2014年十一国庆节活动方案
2014/09/16 职场文书
新教师2015年度工作总结
2015/07/22 职场文书
成本低的5个创业项目:投资小、赚钱快
2019/08/20 职场文书
读《茶花女》有感:山茶花的盛开与凋零
2020/01/17 职场文书
Python办公自动化之Excel(中)
2021/05/24 Python
分布式架构Redis中有哪些数据结构及底层实现原理
2022/03/13 Redis