最近在做一款微信小程序,需要获取用户手机号,具体步骤如下:

流程图:

1、首先,客户端调用wx.login,回调数据了包含jscode,用于获取openid(用户唯一标识)和sessionkey(会话密钥)。

2、拿到jscode后,将其发送给服务端,服务端拿它与微信服务端做交互获取openid和sessionkey。具体获取方法如下:

(1)需要写一个HttpUrlConnection工具类:

<span style="font-size:18px;">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)然后通过这个工具类与微信服务器建立连接,获取想要的数据:

<span style="font-size:18px;">  
    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");</span>

其中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解密方法进行解密:

<span style="font-size:18px;">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);  
}</span>

这样在返回的数据中就可以拿到用户的手机号。

微信小程序获取用户手机号详解的更多相关文章

  1. 微信小程序获取用户手机号

    获取微信用户绑定的手机号,需先调用wx.login接口. 小程序获取code. 后台得到session_key,openid. 组件触发getPhoneNumber 因为需要用户主动触发才能发起获取手 ...

  2. 微信小程序获取用户手机号,服务器解码demo

    原理:通过微信登陆接口wx.login得到encryptedData . iv  .code.经过接口处理code得到sessionkey.最后官方demo得到解密后的手机号.(接口处理这一步也可以在 ...

  3. 微信小程序获取用户手机号 记录 (PHP)

    1. 用户登录时需要获取 openid ,同时可以获取 session_key, 二者同时返回, 此时我们要将二者存储在服务端. 2. 小程序端 button 按钮拉起授权, 向api 传递 iv 和 ...

  4. [微信小程序] 微信小程序获取用户定位信息并加载对应城市信息,wx.getLocation,腾讯地图小程序api,微信小程序经纬度逆解析地理信息

    因为需要在小程序加个定位并加载对应城市信息 然而小程序自带api目前只能获取经纬度不能逆解析,虽然自己解析方式,但是同时也要调用地图,难道用户每次进小程序还要强行打开地图选择地址才定位吗?多麻烦也不利 ...

  5. 微信小程序 获取用户信息并保存登录状态

    微信小程序 获取用户信息并保存登录状态:http://www.360doc.com/content/18/0124/11/9200790_724662071.shtml

  6. Laravel wxxcx 微信小程序获取用户信息

    wxxcx 是Laravel5微信小程序登录获取用户信息扩展 部署 12345678 # 安装$ composer require iwanli/wxxcx# 注册服务# 在 /config/app. ...

  7. .Net之微信小程序获取用户UnionID

    前言: 在实际项目开发中我们经常会遇到账号统一的问题,如何在不同端或者是不同的登录方式下保证同一个会员或者用户账号唯一(便于用户信息的管理).这段时间就有一个这样的需求,之前有个客户做了一个微信小程序 ...

  8. 微信小程序--问题汇总及详解之form表单

    附上微信小程序开发文档链接:https://mp.weixin.qq.com/debug/wxadoc/dev/framework/MINA.html form表单: 当点击 <form/> ...

  9. 微信小程序获取登录手机号

    小程序获取登录用户手机号. 因为需要用户主动触发才能发起获取手机号接口,所以该功能不由 API 来调用,需用 <button> 组件的点击来触发. 首先,放置一个 button 按钮,将 ...

随机推荐

  1. session多服务器共享的方案梳理

    session的存储了解以前是怎么做的,搞清楚了来龙去脉,才会明白进行共享背后的思想和出发点.我喜欢按照这样的方式来问(或者去搞清楚):为什么要session要进行共享,不共享会什么问题呢? php中 ...

  2. spring boot 项目启动无任何反应

    遇到的问题 spring boot项目启动后无任何报错,ps有进程,nohub无日志 定位 更换jar包,问题依然存在,将jar包放到其他服务器,运行正常,排除打包问题 同服务器其他系统运行正常,但停 ...

  3. [Java并发编程(一)] 线程池 FixedThreadPool vs CachedThreadPool ...

    [Java并发编程(一)] 线程池 FixedThreadPool vs CachedThreadPool ... 摘要 介绍 Java 并发包里的几个主要 ExecutorService . 正文 ...

  4. hdoj:2083

    简易版之最短距离 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  5. test001

    #include <iostream> using namespace std; ][]; int main() { int num; ; ; i <= ; i++) dp[i][] ...

  6. SpringBoot2.X + SpringCache + redis解决乱码问题

    环境:SpringBoot2.X + SpringCache + Redis Spring boot默认使用的是SimpleCacheConfiguration,使用ConcurrentMapCach ...

  7. laravel5.8笔记五:基类控制器和基类模型

    建立基类的目的就是为了方便继承.比如:Admin模块访问,是否登陆.检测登陆可以写到基类里面 控制器基类 原始基类:app\Http\Controllers\Controller.php,我们下面要做 ...

  8. Centos 使用Systemctl报Error getting authority: Error initializing authority: Error calling StartServiceByName for org.freedesktop.PolicyKit1: Timeout was reached (g-io-error-quark, 24)

    在使用centos7.4 安装服务的时候报错: Error getting authority: Error initializing authority: Error calling StartSe ...

  9. Object.assign方法的使用

    https://www.cnblogs.com/chenyablog/p/6930596.html

  10. <转>牛顿法与拟牛顿法

    转自:http://blog.csdn.net/itplus/article/details/21896619 机器学习算法中经常碰到非线性优化问题,如 Sparse Filtering 算法,其主要 ...