当前位置:   article > 正文

Java-(二)微信小程序授权获取用户信息和手机号码_基于java开发的小程序授权获取用户的信息和手机号

基于java开发的小程序授权获取用户的信息和手机号

第一篇我们已经知道了微信小程序怎么授权登录获取用户信息openIdunionId 。下面将高速告诉大家,微信小程序如何授权获取用户信息和手机号码

微信官方文档https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html

获取用户手机号需要以下几个步骤:

1.小程序客户端先调用wx.login(),获取到票据code。

2.将code传到Java后台调用code2Session接口获取到session_key,将session_key存进缓存或是数据库中(不建议直接将session_key在网络上传输),为了方便这里直接将session_key传回小程序端。

3.小程序端调用wx.getUserInfo(),将encryptedData、iv和session_key传到后台获取手机号。

下面代码只显示如何授权手机号,获取session_key请查看上一篇文章:Java-(一)微信小程序实现授权登录获取openId和unionId

小程序端

用户点击授权手机号按钮,弹出授权窗口 <button open-type=“getUserInfo”/ >

<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button> 
  • 1

通过getPhoneNumber可以获取到用户敏感数据encryptedData

 //获取手机号
  getPhoneNumber: function(e) {
    var that = this;
    console.log(e);
    wx.request({
      url: "https://www.test.cn/miniprogram/getPhoneNumber",
      method: 'POST',
      header: {
        'content-type': 'application/json'
      },
      data: {
        encryptedData: e.detail.encryptedData,
        iv: e.detail.iv,
        session_key: that.data.key
      },
      success: function (res) {
        console.log(res);
      },
      fail: function (error) {
        console.log(error);
      }
    });
  }
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

Java后台

MiniProgramLogin 类


public class MiniProgramLogin {

	//小程序 AppID
  	private static final String appid = "xxxxxxxxxxxxxx";
  	//小程序 AppSecret
    private static final String secret = "xxxxxxxxxxxxxxxxxxxxxxxx";


	/**
     * 小程序授权获取手机号
     */
    @RequestMapping(value="/getPhoneNumber")
    @ResponseBody
    public  Map<String,Object> getPhoneNumber(String encryptedData, String iv, String session_key) {
        Map<String,Object> map=new HashMap<>();
        
        String result=WXBizDataCrypt.decrypt1(encryptedData,session_key,iv);
        JSONObject json=JSONObject.parseObject(result);
        
        if (!StringUtils.isEmpty(result)&&result.length()>0) {
        	map.put("purePhoneNumber", json.getString("purePhoneNumber"));
        	map.put("phoneNumber", json.getString("phoneNumber"));
        	map.put("countryCode", json.getString("countryCode"));
        	map.put("msg","success");
        }
        map.put("msg","error");
        return map;
    }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

授权登录成功返回状态消息‘success’ ,授权不成功返回状态消息‘error’

HttpUtil Http响应工具类


public class HttpUtil {

    /**
     * 向指定URL发送GET方法的请求
     *
     * @param url 发送请求的URL
     * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
     * @return URL 所代表远程资源的响应结果
     */
    public static String sendGet(String url, String param) {
        String result = "";
        BufferedReader in = null;
        try {
            String urlNameString = url + "?" + param;
            URL realUrl = new URL(urlNameString);
            // 打开和URL之间的连接
            URLConnection connection = realUrl.openConnection();
            // 设置通用的请求属性
            connection.setRequestProperty("accept","*/*");
            connection.setRequestProperty("connection","Keep-Alive");
            connection.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            // 建立实际的连接
            connection.connect();
            // 获取所有响应头字段
            Map<String, List<String>> map = connection.getHeaderFields();
            // 遍历所有的响应头字段
            for (String key : map.keySet()) {
                System.out.println(key + "--->" + map.get(key));
            }
            // 定义 BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(
                    connection.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            System.out.println("发送GET请求出现异常!" + e);
            e.printStackTrace();
        }
        // 使用finally块来关闭输入流
        finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return result;
    }

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

WXBizDataCrypt 解密工具类


public class WXBizDataCrypt {

    /**
     * AES解密
     *
     * @param data   //密文,被加密的数据
     * @param key    //秘钥
     * @param iv     //偏移量
     * @return
     * @throws Exception
     */
    public static String decrypt1(String data, String key,String iv){
        //被加密的数据
        byte[] dataByte = Base64.decodeBase64(data);
        //加密秘钥
        byte[] keyByte = Base64.decodeBase64(key);
        //偏移量
        byte[] ivByte = Base64.decodeBase64(iv);
        try {
        	AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivByte);
        	Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        	SecretKeySpec keySpec = new SecretKeySpec(keyByte, "AES");
        	cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
        	return new String(cipher.doFinal(dataByte),"UTF-8");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (InvalidAlgorithmParameterException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
     }

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

上一篇文章:Java-(一)微信小程序实现授权登录获取openId和unionId

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/388048
推荐阅读
相关标签
  

闽ICP备14008679号