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

流程图:

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. angularjs中的路由介绍详解 ui-route(转)

    http://www.cnblogs.com/littlemonk/p/5500801.html 这篇文章主要介绍了Angularjs中UI Router全攻略,涉及到angularjs ui rou ...

  2. 最简单的设计模式——单例模式的演进和推荐写法(Java 版)

    前言 如下是之前总结的 C++ 版的:软件开发常用设计模式—单例模式总结(c++版),对比发现 Java 实现的单例模式和 C++ 的在线程安全上还是有些区别的. 概念不多说,没意思,我自己总结就是: ...

  3. 通过java递归思想实现以树形方式展现出该目录中的所有子目录和文件

    当初在开始接触Java时  学习File部分的一个小练习  挺有意思 一开始是通过看 北京圣思园 张龙老师的视频开始学校java的,必须强烈推荐,真很棒. 功能实现:主要实现以树形方式展现出该目录中的 ...

  4. MongoDB学习总结(二)

    前言:学习札记! MongoDB学习总结(二) 1.  安装.初识 之前写过一篇MongoDB的快速上手文章,里边详细的讲了如何安装.启动MongoDB,这里就不再累述安装过程,简单介绍一下Mongo ...

  5. Mixed Content: xxx This request has been blocked; the content must be served over HTTPS.

    在升级https的过程中,出现如下问题: Mixed Content: The page at 'https://www.xxx.com/denglu.html' was loaded over HT ...

  6. 【Android Studio】Gradle配置及问题解决

    Error:Failed to open zip file.Gradle's dependency cache may be corrupt (this sometimes occurs after ...

  7. JS备忘

    1. Promise用法 js异步调用较多,如果某个操作是基于上个异步结果才能执行的,再有一个操作又是基于此操作的,则需要嵌套多层代码,在ES6中引入了Promise写法,可以比较优雅的解决这个问题: ...

  8. 如何查找Power BI本地报表服务器产品密钥

     Power BI 报表服务器产品密钥,以便在生产环境中安装服务器. 已下载 Power BI 报表服务器,并已购买 SQL Server Enterprise 软件保障协议. 或者,已购买 Powe ...

  9. git 创建新分支并推送到远程分支

      git branch test git checkout test git push origin test:test git branch --set-upstream-to origin/te ...

  10. java课程课后作业05之动手动脑

    一.使用Files. walkFileTree()找出指定文件夹下所有大于指定大小(比如1M)的文件 此代码没有使用walkfiletree,两者的差别在于walkfiletree在遍历文件的时候有一 ...