微信小程序获取手机号流程

1.先调用微信登录wx.login()获取code,通过code在后台获取session_key和openid(为了安全方面的原因,请不要直接使用这些信息作为你小程序的用户标识和session标识回传到小程序客户端中去)

2.用户点击允许授权按钮,将后台获取的session_key 和 js获取的加密数据,做为参数和自定义标识传给后台

3.后台接收到参数后,进行加密数据解密算法,最后取得手机号


1.调用微信登录wx.login()获取code,通过code调用后台,获取信息sessionId

    /*** 获取微信小程序session_key** @param jsonStr* @return*/@RequestMapping(value = "/getSessionKey", method = RequestMethod.POST, produces = "application/json;charset=utf-8")@ResponseBodypublic JSONObject getSessionKey(@RequestBody String jsonStr) {JSONObject result = new JSONObject();JSONObject object = JSON.parseObject(jsonStr);String code = object.getString("code");if (StringUtil.isBlank(code)) {return ApiResult.fail("参数为空");}// appidString appId ="" //公众号appid// 微信密匙String appSecret ="" //密匙String res = SendHttps.sendGet("https://api.weixin.qq.com/sns/jscode2session", "appid=" + appId + "&secret=" + appSecret + "&js_code=" + code + "&grant_type=authorization_code");net.sf.json.JSONObject resultObject = net.sf.json.JSONObject.fromObject(res);if (resultObject.containsKey("errcode")) {int errcode = resultObject.getInt("errcode");result.put("message","获取access_token出错!错误信息为:" + resultObject.get("errmsg").toString(), "" + errcode);} else {String sessionKey = resultObject.get("session_key").toString();String openId = resultObject.get("openid").toString();RedisClient.set(openId + "session_key", sessionKey, 600);result.put("sessionId", openId + "session_key");}return result;}

2.前台通过js获取到微信服务器返回的加密数据,结合sessionId解密得到手机号。官方连接:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html

    /*** 微信小程序获取手机号** @param jsonStr* @return*/@RequestMapping(value = "/getPhoneNumber", method = RequestMethod.POST, produces = "application/json;charset=utf-8")@ResponseBodypublic JSONObject getPhoneNumber(@RequestBody String jsonStr) {JSONObject object = JSON.parseObject(jsonStr);String encryptedData = object.getString("encryptedData");String iv = object.getString("iv");String sessionId = object.getString("sessionId");// 获取session_keyString session_key = RedisClient.get(sessionId);if (StringUtil.isEmpty(session_key)) {return ApiResult.fail("session已失效,请重试");}// 被加密的数据byte[] dataByte = Base64.decode(encryptedData);// 加密秘钥byte[] keyByte = Base64.decode(session_key);// 偏移量byte[] ivByte = Base64.decode(iv);try {// 如果密钥不足16位,那么就补足.  这个if 中的内容很重要int base = 16;if (keyByte.length % base != 0) {int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);byte[] temp = new byte[groups * base];Arrays.fill(temp, (byte) 0);System.arraycopy(keyByte, 0, temp, 0, keyByte.length);keyByte = temp;}// 初始化Security.addProvider(new BouncyCastleProvider());Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");parameters.init(new IvParameterSpec(ivByte));cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化byte[] resultByte = cipher.doFinal(dataByte);if (null != resultByte && resultByte.length > 0) {String result = new String(resultByte, "UTF-8");return JSONObject.parseObject(result);}} catch (Exception e) {e.printStackTrace();}return "获取手机号失败";}

3.后台通过url请求

public class SendHttps {/*** 向指定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(), "utf-8"));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;}
}

java微信小程序授权微信登录获取手机号相关推荐

  1. 微信小程序授权手机号码登录

    文章目录 前言 一.需求描述:授权获取手机号码登录 二.具体操作 1.引入相关依赖 2.步骤 3.相关代码 3.1 微信小程序开发的相关配置 3.2创建配置文件 3.3 实例化WxMaService ...

  2. Uniapp微信小程序授权的登录前后端全套

    前言 用Uniapp写的小程序要上线了,结果微信不过审,我也觉得很奇怪!驳回信息如下 这么一说的话确实,因为之前的写的代码获取用户openid的时候必须要是调试模式,我还以为是没上线的问题!这下好了, ...

  3. 微信小程序授权微信手机号踩坑,第一次无法获取到手机号,第二次成功的解决方案

    开发工具:uniApp 使用场景:点击按钮一键获取微信用户号手机号,并进行登录. 过程解析: 要获得手机号,前端需要实现以下的代码: <button open-type="getPho ...

  4. uniapp微信小程序授权微信头像昵称

    自微信废弃uni.getUserInfo和uni.getUserProfile授权登录只能使用手机号授权了,头像和昵称则是改成了上传的方式 代码写的虽然比较low但是很实用的,可以借鉴一下 html ...

  5. SpringCloud 微信小程序授权登录 获取openId SessionKey【SpringCloud系列13】

    SpringCloud 大型系列课程正在制作中,欢迎大家关注与提意见. 自我提升方法推荐:神奇的早起 早上 5:00 -5:20 起床刷牙 5:30-6:00 晨练(跑步.跳绳.骑自行车.打球等等) ...

  6. 微信小程序如何进行登录授权和获取用户信息

    微信小程序如何进行登录授权和获取用户信息

  7. uniapp微信小程序授权登录和获取微信绑定的手机号码

    uniapp微信小程序授权登录和获取微信绑定的手机号码 弹出授权的弹框 <view class="weixinOk" @tap="getUserProfile&qu ...

  8. 微信小程序授权登录+获取手机号

    微信小程序授权登录+获取手机号 一.官方文档背景: 小程序登录的链接: 微信小程序获取手机号的链接: 二.微信小程序授权登录+获取手机号 1.简单说明官方文档的操作:先授权登录后拿手机号 2.前端代码 ...

  9. SpringBoot微信小程序授权登录

    SpringBoot微信小程序授权登录 一.appId 1.1.自己是管理者:微信公众平台,申请或登录自己的微信小程序,在开发者管理中即可看到 2.2.自己是开发者:让管理员将自己加入到小程序开发者管 ...

最新文章

  1. Nat Rev Genet发表房刚组细菌表观组综述论文
  2. const volatile同时限定一个类型int a = 10
  3. Google 的 QUIC 华丽转身成为下一代网络协议: HTTP/3.0
  4. Python3高并发定时更新任务进程池和线程池的使用
  5. 【STM32 .Net MF开发板学习-14】红外遥控器编码识别
  6. nyoj--120--校园网络(scc+缩点)
  7. nginx+PHP+PHP-FPM(FastCGI)在Ubuntu上的安装和配置
  8. [openjudge] 2797最短前缀 Trie
  9. 经济学家忽悠老百姓的“万能公式”
  10. Vue第一部分(6):Vue的生命周期
  11. HTTP 错误 403.6 - Forbidden 解决方案
  12. 适合建索引?不适合建索引?分析
  13. java 的记住用户名和密码,JAVA--高级基础开发Cookie实现记住用户名和密码
  14. 数据挖掘二手车价格预测 Task05:模型融合
  15. OO CSS的个人理解
  16. jQuery和asp.net mvc相关资源链接
  17. 华为防火墙easy-ip配置
  18. windows10 开启热点
  19. 如何扩展关键词,以及使用python多线程爬取bing搜索结果
  20. GP技术的展望——道生一,一生二

热门文章

  1. Faster-Rcnn 网络训练医学乳腺DDSM图像不能预测到定位框问题及其训练问题
  2. ym——android源代码大放送(实战开发必备)
  3. 网易云邮箱如何添加网页企业级账号
  4. 打印机墨水添加方法(二)
  5. Java与WCF交互(一)补充:用WSImport生成WSDL的Java客户端代码
  6. Dev中GridView——背景颜色改变
  7. 前台使用viewbag
  8. AIGC神器 Midjourney 强势更新!逼真到令人发指!文心一言紧跟其后
  9. r语言做绘制精美pcoa图_三分钟绘制一张优美的PCoA图 | 云平台
  10. HackerRank - C语言 - Introduction - Playing With Characters