微信官方文档:
https://developers.weixin.qq.com/miniprogram/dev/api/
B站视频教程地址:
https://www.bilibili.com/video/BV1MV411y7cH
说到微信小程序,不可避免会触及到微信账号的授权登录,现在来说说一下哈!
首先需要自己的一个小程序,可以到微信公众平台注册一个自己的小程序:https://mp.weixin.qq.com/wxopen/waregister?action=step1
注册后会获取到一个APPID和SECRET两个参数,这两个要好好保存。
说明:首先需要小程序端触发
wx.login方法拿到code,将code传到后台服务器,后台服务器结合小程序的appid和appsecret去请求微信接口服务器,微信接口服务器返回openid和session_key给后台服务器,然后进行自己的业务办理。
/**
* 微信授权时录入用户数据
*/
@RequestMapping(value = "wxLogin")
@ResponseBody
@Transactional
public Map<String,Object> insert(@RequestParam("code")String code, HttpSession session) throws ClientProtocolException, IOException {
//返回map
System.err.println("微信授权登录");
System.err.println("code值: "+code);
Map<String,Object> resultMap = new HashMap<>();
String appid = WXPayConstants.APP_ID; //自己的APPID
String secret = WXPayConstants.SECRET; //自己小程序的SECRET
String loginUrl="https://api.weixin.qq.com/sns/jscode2session?appid="+appid+"&secret="+secret+"&js_code="+code+"&grant_type=authorization_code";
try {
CloseableHttpClient client = null;
CloseableHttpResponse response = null;
try {
// 创建http GET请求
HttpGet httpGet = new HttpGet(loginUrl);
client = HttpClients.createDefault();
// 执行请求
response = client.execute(httpGet);
HttpEntity entity = response.getEntity();//得到返回数据
String result = EntityUtils.toString(entity);
System.err.println("微信返回的结果"+result);
resultMap.put("data", result);//进行封装
System.err.println(resultMap);
JSONObject json_test = JSONObject.parseObject(result);
String wxOpenid = json_test.getString("openid");
String sessionKey = json_test.getString("session_key");
System.err.println("openid值: "+wxOpenid);//得到微信openID
System.err.println("sessionKey值: "+sessionKey);
//根据id数据库数据查询
WxUser user = wxUserService.selectByid(wxOpenid); System.err.println("用户信息: "+user);
if (user == null){//如果user等于null说明该用户第一次登录,数据库没有该用户信息。
resultMap.put("state", 2000);
resultMap.put("data", wxOpenid);
resultMap.put("sessionKey", sessionKey);
resultMap.put("message", "未查询到用户信息");
}else {
resultMap.put("state", 2000);
resultMap.put("data", wxOpenid);//查找的用户信息进行封装返回
resultMap.put("sessionKey", sessionKey);
resultMap.put("user", user);//查找的用户信息进行封装返回
resultMap.put("message", "该用户已存在");
return resultMap;
}
if(StringUtils.isEmpty(wxOpenid)){
resultMap.put("state", 2000);
resultMap.put("message", "未获取到openid");
return resultMap;
}
} finally {
if (response != null) {
response.close();
}
if (client != null) {
client.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return resultMap;
}
说明:如果数据库没有查到该用户的数据就让前端去调取获取微信用户信息接口,然后把拿到的信息调用下边的接口往数据库保存微信用户的信息。
/*保存微信用户信息*/
@RequestMapping("/insertWxUser")
@ResponseBody
public JsonResult<WxUser> insertUser(WxUser user){
JsonResult result = new JsonResult();
System.out.println("微信用户信息保存");
String username = user.getUsername();
String avatar = user.getAvatar();
String wxOpenid = user.getOpenid();
System.out.println("用户名: "+username);
System.out.println("头像: "+avatar);
System.out.println("openid: "+wxOpenid);
try {
WxUser user1 = wxUserService.selectByid(wxOpenid);//根据id数据库数据查询
if (user1==null) {
wxUserService.insertWxUser(username, avatar, wxOpenid);
result.setState(SUCCESS);
}
else {
wxUserService.updateWxUser(username, avatar, wxOpenid);
result.setState(SUCCESS);
}
}catch (Exception e){
result.setMessage("保存用户信息失败,请重新尝试");
}
return result;
}
说明:获取微信用户绑定的手机号信息,往数据库保存时需要对电话号解析后才能获取电话。
@PostMapping("/getphone")
@ResponseBody
public String mini_getPhone(HttpServletRequest request,@Param("encryptedData")String encryptedData,@Param("iv")String iv,@Param("sessionKey")String sessionKey)
{
//
System.out.println("encryptedData= "+encryptedData);
System.out.println("iv= "+iv);
System.out.println("sessionKey= "+sessionKey);
JSONObject obj=getPhoneNumber(sessionKey,encryptedData,iv);//解密电话号码
//System.out.println(obj);
String sphone=obj.get("phoneNumber").toString();
System.err.println("sphone= "+sphone);
return sphone;
}
//解析电话号码
public JSONObject getPhoneNumber(String session_key, String encryptedData, String iv) {
byte[] dataByte = Base64.decode(encryptedData);
byte[] keyByte = Base64.decode(session_key);
byte[] ivByte = Base64.decode(iv);
try {
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 null;
}
有任何问题不会的,都可以加我微信,单独给你讲解。
> *版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处,否则侵权告之!