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

流程图:

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. x-www-form-urlencoded与multipart/form-data区别

    转载声明: http://blog.chinaunix.net/uid-7210505-id-329700.html 在Flex中,UrlRequest中的contentType默认值为 applic ...

  2. mvc webapi路由重写

    修改app_start/webapiconfig.cs using System.Web.Http; using System.Web.Routing; using Ninject; using Tx ...

  3. go语言调用append之后是否重新分配内存?

    查看tidb源代码:::util/charset/charset.go,下面有段代码: // GetAllCharsets gets all charset descriptions in the l ...

  4. Git:git diff 命令详解

    工作目录 vs 暂存区 $ git diff <filename> 意义:查看文件在工作目录与暂存区的差别.如果还没 add 进暂存区,则查看文件自身修改前后的差别.也可查看和另一分支的区 ...

  5. SpringBoot 推荐博客

    http://412887952-qq-com.iteye.com/category/356333

  6. java jdk 打开出错 Failed to load the JNI shared library

    ``` Failed to load the JNI shared library 解决方法 换了JDK 32位x86的 打开32位 eclipse 2017 oxygen 出现这个问题,修改 配置文 ...

  7. 手机配置代理报错invalid host header

    手机配置代理后浏手机弹出页面报错invalid host header,因为我是用fiddler配置的,所以这时候就要看下自己配置完之后,是否重启,重启之后就没问题了. fiddle配置参考:http ...

  8. ZIP解压缩工具类

    import java.io.File; import org.apache.tools.ant.Project; import org.apache.tools.ant.taskdefs.Expan ...

  9. array_walk与array_map的区别

    1.array_walk是用于用户自定义的函数,所以想用array_walk($aIds, "trim");去掉数据元素中的空格是达不到目的的只能用array_walk($aIds ...

  10. 11.15luffycity(7)

    2018-11-15 17:43:50 还有一点路飞项目就结束啦! 周日打算回去! 双十一的耳机到啦,音质确实不错!2333! 等着项目做完,完整总结一下! 越努力,越幸运!永远不要高估自己!!!! ...