问题:这几天公司要搞一个微信授权验证,之前没有接触过,不过没有办法,只能够自己硬着头皮去看,幸好文档很多很丰富,最后这几天终于搞出来了,下面的代码还需要进行一些封装以便日后重复使用!
第一:微信公众平台API地址点击打开链接
第二:手机微信扫码登录申请测试账号APPID APPSERCET等点击打开链接
第三:还需要一个域名可以实现内网穿透做本地测试!点击打开链接
第四:具体的开发步骤看第一步,下面是具体的代码,可以借鉴!但是不要复制
<!--微信使用的maven包-->
<dependencies>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
</dependencies>
package com.chaimao.base.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
/**
* 微信开发工具
* @author hp
* @data 2018/4/4
*/
public class WXAuthUtil {
public static final String APPID="";
public static final String APPSECRET ="";
private static final String TOKEN = "";
public static JSONObject doGetJson(String url) throws ClientProtocolException, IOException {
JSONObject jsonObject =null;
DefaultHttpClient client = new DefaultHttpClient();
HttpGet httpGet =new HttpGet(url);
HttpResponse response = client.execute(httpGet);
HttpEntity entity =response.getEntity();
if(entity!=null)
{
//把返回的结果转换为JSON对象
String result = EntityUtils.toString(entity, "UTF-8");
jsonObject = JSON.parseObject(result);
}
return jsonObject;
}
}
package com.publish.weixin.controller;
import com.alibaba.fastjson.JSONObject;
import com.chaimao.base.utils.Sha1Degist;
import com.chaimao.base.utils.Utils;
import com.chaimao.base.utils.WXAuthUtil;
import com.publish.user.UserService;
import com.publish.weixin.WeiXinService;
import org.apache.http.ParseException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* 微信接口开发
* @author gwm
* @data 2018/4/4
*/
@CrossOrigin
@RestController
@RequestMapping("/weixin")
public class WeiXinController {
@Autowired
private WeiXinService weixinService;
@Autowired
private UserService userService;
//这个token是自己随便生成的token
public static final String TOKEN="gwm0818";
private static Logger logger= LoggerFactory.getLogger(WeiXinController.class);
//验证这个url是否正确
@RequestMapping("/init")
public void init(HttpServletRequest request, HttpServletResponse response){
// timestamp 时间戳
// signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
logger.info("微信init开始");
// nonce 随机数
// echostr
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
String[] arrs = {WeiXinController.TOKEN,nonce,timestamp};
Arrays.sort(arrs);
StringBuffer sb = new StringBuffer();
for(String a:arrs) {
sb.append(a);
}
String sha1 = Sha1Degist.getString(sb.toString());
logger.info("sha1="+sha1.equals(signature));
if(sha1.equals(signature)) {
try {
response.getWriter().println(echostr);
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 公众号微信登录授权
* @param request
* @param response
* @return
* @throws ParseException
* @author lbh
* @date 创建时间:2018年1月18日 下午7:33:59
* @parameter
*/
@RequestMapping(value = "/wxLogin", method = RequestMethod.GET)
public void wxLogin(HttpServletRequest request,
HttpServletResponse response)
throws ParseException {
//这个url的域名必须要进行再公众号中进行注册验证,这个地址是成功后的回调地址
String backUrl="http://你的域名/weixin/callBack";
// 第一步:用户同意授权,获取code
String url ="https://open.weixin.qq.com/connect/oauth2/authorize?appid="+ WXAuthUtil.APPID
+ "&redirect_uri="+ URLEncoder.encode(backUrl)
+ "&response_type=code"
+ "&scope=snsapi_userinfo"
+ "&state=STATE#wechat_redirect";
try {
logger.info("微信重定向");
response.sendRedirect(url);
logger.info("现在回调");
} catch (IOException e) {
e.printStackTrace();
}
//return "redirect:"+url;//必须重定向,否则不能成功
}
/**
* 公众号微信登录授权回调函数
* @param req
* @param resp
* @return
* @throws ServletException
* @throws IOException
* @author lbh
* @date 创建时间:2018年1月18日 下午7:33:53
* @parameter
*/
@RequestMapping(value = "/callBack", method = RequestMethod.GET)
public void callBack(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*
* start 获取微信用户基本信息
*/
String code =req.getParameter("code");
logger.info("//"+code);
//第二步:通过code换取网页授权access_token
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+WXAuthUtil.APPID
+ "&secret="+WXAuthUtil.APPSECRET
+ "&code="+code
+ "&grant_type=authorization_code";
logger.info("url:"+url);
JSONObject jsonObject = WXAuthUtil.doGetJson(url);
/*返回的样式
{ "access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
*/
String openid = jsonObject.getString("openid");
String access_token = jsonObject.getString("access_token");
String refresh_token = jsonObject.getString("refresh_token");
//第五步验证access_token是否失效;展示都不需要
String chickUrl="https://api.weixin.qq.com/sns/auth?access_token="+access_token+"&openid="+openid;
JSONObject chickuserInfo = WXAuthUtil.doGetJson(chickUrl);
logger.info(chickuserInfo.toString());
if(!"0".equals(chickuserInfo.getString("errcode"))){
// 第三步:刷新access_token(如果需要)-----暂时没有使用,参考文档https://mp.weixin.qq.com/wiki,
String refreshTokenUrl="https://api.weixin.qq.com/sns/oauth2/refresh_token?appid="+openid+"&grant_type=refresh_token&refresh_token="+refresh_token;
JSONObject refreshInfo = WXAuthUtil.doGetJson(chickUrl);
/*
* { "access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE" }
*/
logger.info(refreshInfo.toString());
access_token=refreshInfo.getString("access_token");
}
// 第四步:拉取用户信息(需scope为 snsapi_userinfo)
String infoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token="+access_token
+ "&openid="+openid
+ "&lang=zh_CN";
logger.info("infoUrl:"+infoUrl);
JSONObject userInfo = WXAuthUtil.doGetJson(infoUrl);
/*
{ "openid":" OPENID",
" nickname": NICKNAME,
"sex":"1",
"province":"PROVINCE"
"city":"CITY",
"country":"COUNTRY",
"headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
"privilege":[ "PRIVILEGE1" "PRIVILEGE2" ],
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
*/
logger.info("JSON-----"+userInfo.toString());
logger.info("名字-----"+userInfo.getString("nickname"));
logger.info("头像-----"+userInfo.getString("headimgurl"));
/*
* end 获取微信用户基本信息
* 将用户信息存入数据库
*/
Map<String,Object> params=new HashMap<String,Object>();
params.put("openid",userInfo.getString("openid"));
params.put("nickname",userInfo.getString("nickname"));
params.put("headimgurl",userInfo.getString("headimgurl"));
params.put("sex",userInfo.getString("sex"));
params.put("city",userInfo.getString("city"));
params.put("unionid",userInfo.getString("unionid"));
params.put("province",userInfo.getString("province"));
params.put("country",userInfo.getString("country"));
//开始赋值ID给weixin_user_id;
Utils.WEIXIN_USER_ID=Utils.createID();
params.put("user_id",Utils.WEIXIN_USER_ID);
logger.info("微信用户的ID"+Utils.WEIXIN_USER_ID);
try{
if(userService.getUserInfoById(params.get("openid")+"")==null){
userService.addUserInfo(params);
}
//获取到用户信息后就可以进行重定向,实现自己业务逻辑了。。。。。。
//接来的逻辑就是系统逻辑
resp.sendRedirect("http://localhost:8080/HUARUN_project/index.html");
System.out.println("重定向到自己的页面!");
}catch (Exception e){
e.printStackTrace();
return ;
}
}
/**
* 查询所有的用户信息
* @return
*/
@PostMapping("/getAllUserInfo")
public Object getAllUserInfo(@RequestBody Map<String,Object> params) {
logger.info("user_id="+params.get("user_id"));
Utils.myTrimAndLike(params, "nickname");
return userService.getAllUserInfo(params);
}
@RequestMapping("/testStr")
public String testStr(){
Map<String,Object> params=new HashMap<String,Object>();
params.put("openid","openid");
params.put("nickname","nkname");
params.put("headimgurl","headimgurl");
params.put("sex","sex");
params.put("city","city");
params.put("unionid","unionid");
params.put("province","province");
params.put("country","country");
//开始赋值ID给weixin_user_id;
Utils.WEIXIN_USER_ID=Utils.createID();
params.put("user_id",Utils.WEIXIN_USER_ID);
try{
//插入之前先查询有没有该用户存在
if(userService.getUserInfoById(params.get("openid")+"")!=null){
return "userIsExist";
}
if(userService.addUserInfo(params)>0){
//获取到用户信息后就可以进行重定向,实现自己业务逻辑了。。。。。。
//接来的逻辑就是系统逻辑
logger.info("验证登录成功!");
//resp.sendRedirect("我自己的上传页面!");
}
}catch (Exception e){
e.printStackTrace();
return "errors";
}
return "errors";
}
}
☞☛总结:微信授权无非就是第三方请求我们获取返回数据然后处理自己的业务,不要看得太难!