赞
踩
第一篇我们已经知道了微信小程序怎么授权登录获取用户信息、 openId 和 unionId 。下面将高速告诉大家,微信小程序如何授权获取用户信息和手机号码。
微信官方文档: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>
通过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); } }); }
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; }
授权登录成功返回状态消息‘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; } }
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; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。