微信小程序授权获取用户信息和手机号码
微信小程序授权获取用户信息和手机号码
1.微信官方文档
登录:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
手机号:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html
2.获取用户手机号步骤
3.java后台 直接上干活
3.1 ApiLoginController
import com.alibaba.fastjson.JSONObject;
import com.dyt.common.HttpClientUtils;
import com.dyt.common.exception.DYTException;
import com.dyt.config.WeixinLoginProperties;
import com.dyt.utils.WXBizDataCrypt;
import com.dyt.vo.R;
import com.google.gson.Gson;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;@Api(tags = "微信小程序登录、获取手机号")
@RestController
public class ApiLoginController {@ApiOperation(value = "登录")@PostMapping("/wxlogin")public R callback(String code,String encryptedData,String iv){System.out.println("----------------------------------------------");//1.判断code是否合法if(StringUtils.isEmpty(code)){throw new DYTException(22008,"登录失败,尝试刷新重新登录!");}//2:通过code获取access_tokenString baseAccessTokenUrl = WeixinLoginProperties.WX_OPEN_GATEWAY+"?appid=%s" +"&secret=%s" +"&js_code=%s" +"&grant_type=authorization_code";String accessTokenUrl = String.format(baseAccessTokenUrl, WeixinLoginProperties.WX_OPEN_APP_ID, WeixinLoginProperties.WX_OPEN_APP_SECRET, code);String result = null;try {//执行请求,获取微信请求返回得数据 RestTemplate httpClientUtilsresult = new HttpClientUtils().get(accessTokenUrl);//对微信返回得数据进行转换Gson gson = new Gson();Map<String, Object> resultMap = gson.fromJson(result, HashMap.class);if (resultMap.get("errcode") != null) {throw new DYTException(22006,"微信登录出错!");}//解析微信用户得唯一凭证openidString openid = (String) resultMap.get("openid");if (StringUtils.isEmpty(openid)) {throw new DYTException(22009,"登录失败,尝试刷新重新登录!");}String session_key =(String)resultMap.get("session_key");String res = WXBizDataCrypt.decrypt1(encryptedData,session_key,iv);JSONObject json=JSONObject.parseObject(res);System.out.println("-----------json------------------"+json);if (!StringUtils.isEmpty(res)&&res.length()>0){String sex="0";if(json.getInteger("gender")==1){sex="男";}else if(json.getInteger("gender")==2){sex="女";}resultMap.put("avatarUrl",json.getString("avatarUrl"));resultMap.put("nickName",json.getString("nickName"));resultMap.put("sex",sex);}//封装返回return R.ok().data("resultMap",resultMap);}catch (Exception e){return R.error().code(601).message("微信解析失败");}}/*** 小程序授权获取手机号*/@ApiOperation(value = "获取手机号")@PostMapping("/getPhoneNumber")@ResponseBodypublic 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;}}
3.2 解密工具类
import org.apache.commons.codec.binary.Base64;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.AlgorithmParameterSpec;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;}
}
微信小程序授权获取用户信息和手机号码相关推荐
- Java-(二)微信小程序授权获取用户信息和手机号码
第一篇我们已经知道了微信小程序怎么授权登录获取用户信息. openId 和 unionId .下面将高速告诉大家,微信小程序如何授权获取用户信息和手机号码. 微信官方文档:https://develo ...
- 微信小程序授权 获取用户信息
微信小程序授权 获取用户信息 小程序昵称突然变成了"微信用户",头像也不显示, <!-- 近期很多小伙伴通过该方法获取头像和昵称,代码也没有做改变,突然就变成了下面这样子 - ...
- uniapp微信小程序授权获取用户信息封装
根据平台公告信息,2022年底wx.getUserProfile 与 wx.getUserInfo 接口被回收.新的小程序不能再授权获取头像和昵称:可以通过wx.login 接口直接获取用户的 ope ...
- 微信小程序制作——获取用户信息
微信小程序制作--获取用户信息 1.获取用户信息 方式一 wxml <view bindtap="getUserName">获取当前用户名</view> j ...
- 支付宝小程序授权/获取用户信息
支付宝小程序授权/获取用户信息 目录: 文章目录 支付宝小程序授权/获取用户信息 获取支付宝小程序授权token 解析支付宝小程序接口响应加密数据 获取支付宝小程序授权token 前提准备工作: ...
- 【微信小程序】获取用户信息
文章目录 获取用户信息 组件open-data button组件中的open-type 接口getUserProfile 查看授权结果 获取用户信息 组件open-data 组件 open-data用 ...
- 微信小程序如何获取用户信息
自我介绍 我是IT果果日记,微信公众号请搜索 IT果果日记 一个普通的技术宅,定期分享技术文章,欢迎点赞.关注和转发,请多关照. 微信小程序用户基本信息有哪些? 除了基本信息,微信还会提供openId ...
- 玩转微信小程序 之 获取用户信息以及玩转基本列表渲染(2019/04/14)
LZ-Says:总是要各种颠沛流离,才能换得片刻安宁.努力让自己变得更好,加油- 前言 前几天,完成了微信小程序的首章,学习起来,还是多多少少有点坑,不舒服. 今天我们继续开启微信小程序 Study ...
- 微信小程序开发----获取用户信息
今天介绍两种微信小程序获取用户信息的方法 第一中直接授权获取(在同一页面之中): 首先在微信程序一个页面的WXML文件写入获取用户信息的按钮 <!-- bindTap用于绑定事件 --> ...
最新文章
- GARFIELD@01-18-2005
- hdu4685 最大匹配可能性
- Leecode之翻转整数
- OpenGL屏幕空间环境光遮挡的实例
- HDU - 6203 ping ping ping(LCA+dfs序+线段树)
- STL 之随机访问迭代器
- P1092虫食算-深度优先搜索+玄学剪枝
- protobuf java文档_Java中使用Protobuf
- html怎么把字转换为行内元素,什么是行内元素?
- AI初学者用什么软件?适合AI新手的9款人工智能开源软件
- 【学习笔记】尚硅谷-AJAX
- Cocos2D场景编辑器
- window certutil查看文件md5,校验文件MD5
- Nginx 限流配置-令牌桶算法
- 《打地鼠》游戏简单制作
- java 将doc格式的文档转化为pdf格式(实现Word文件预览)
- tp6动态连接数据库
- 数据科学中的离散概率分布与连续概率分布
- 离开外包之后,花了10000小时,最后我走进字节跳动拿到了offer
- 更快、更 Pythonic 的 PyTorch 2.0 | 非常值得期待
热门文章
- Windows CE在嵌入式工业控制系统中的应用思考
- php aes padding,PHP中的AES算法
- uniapp中的input,输入input回车事件和输入input事件
- 普通大学生自学java,怎样才能进入大厂?
- MySQL中的锁机制详细说明
- 爱施德继续盈利背后:业绩波动明显,投资一公司累计亏损约4亿元
- 认证性 不可否认性_一次性密码不提供不可否认性
- linux mutt安装配置_Linux配置msmtp+mutt发送邮件(可放在脚本中定时发送邮件)
- 暴走英雄坛服务器维护时间,暴走英雄坛1.4.1版本维护公告 两段前期支线剧情更新...
- 能用foreach遍历访问的对象需要实现____接口或声明____方法的类型