java配置微信网页授权_微信公众号授权登录与服务器配置JAVA详细版

1.自己准备好公众号账号等东西,不懂的可以先百度一波

2.建立请求主体,微信会从这个入口来验证,是否token一致,一致才能配置成功package com.lh.lfeel.until.weixin;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

/**

* 说明:

*

* @author 夏奕敏

* @date 2018年4月8日 下午5:37:52

* @JDK 1.8.0_161

*/

@WebServlet("/wechat")

public class WechatConService extends HttpServlet {

private static final long serialVersionUID = 1L;

/**

* 确认请求来自微信服务器

*/

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

// 微信加密签名

String signature = request.getParameter("signature");

// 时间戳

String timestamp = request.getParameter("timestamp");

// 随机数

String nonce = request.getParameter("nonce");

// 随机字符串

String echostr = request.getParameter("echostr");

PrintWriter out = response.getWriter();

System.out.println(signature);

System.out.println(timestamp);

System.out.println(nonce);

System.out.println(echostr);

// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败

if (SignUtil.checkSignature(signature, timestamp, nonce)) {

out.print(echostr);

}

out.close();

out = null;

}

/**

* 处理微信服务器发来的消息

*/

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

}

}

3.写个工具类进行排序,和sha1加密package com.lh.lfeel.until.weixin;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

/**

* 说明:

*

* @author 夏奕敏

* @date 2018年4月8日 下午5:39:18

* @JDK 1.8.0_161

*/

public class SignUtil {

// 与接口配置信息中的Token要一致

private static String token = "这里写你自己的服务器的token";

public static boolean checkSignature(String signature, String timestamp,

String nonce) {

// 从请求中(也就是微信服务器传过来的)拿到的token, timestamp, nonce

String[] arr = new String[] { token, timestamp, nonce };

// 将token、timestamp、nonce三个参数进行字典序排序

sort(arr);

StringBuilder content = new StringBuilder();

for (int i = 0; i < arr.length; i++) {

content.append(arr[i]);

}

MessageDigest md = null;

String tmpStr = null;

try {

md = MessageDigest.getInstance("SHA-1");

// 将三个参数字符串拼接成一个字符串进行sha1加密

byte[] digest = md.digest(content.toString().getBytes());

// 将字节数组转成字符串

tmpStr = byteToStr(digest);

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

}

content = null;

// 将sha1加密后的字符串可与signature对比,标识该请求来源于微信

return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;

}

// 将加密后的字节数组变成字符串

private static String byteToStr(byte[] byteArray) {

String strDigest = "";

for (int i = 0; i < byteArray.length; i++) {

strDigest += byteToHexStr(byteArray[i]);

}

return strDigest;

}

private static String byteToHexStr(byte mByte) {

char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',

'B', 'C', 'D', 'E', 'F' };

char[] tempArr = new char[2];

tempArr[0] = Digit[(mByte >>> 4) & 0X0F];

tempArr[1] = Digit[mByte & 0X0F];

String s = new String(tempArr);

return s;

}

// 用于字典排序

public static void sort(String a[]) {

for (int i = 0; i < a.length - 1; i++) {

for (int j = i + 1; j < a.length; j++) {

if (a[j].compareTo(a[i]) < 0) {

String temp = a[i];

a[i] = a[j];

a[j] = temp;

}

}

}

}

}

4.把该项目仍到自己的服务器然后去公众号平台进行配置填写

0de9d1c0b9303dcb152af331b502314a.png这样就可以配置成功了。代码亲测有效。

--------------------------------------------------------------------------

接下来就做公众号登录授权认证

1.首先,在项目中准备个工具类package com.lh.lfeel.until.weixin;

import java.io.IOException;

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 com.alibaba.fastjson.JSON;

import com.alibaba.fastjson.JSONObject;

/**

* 说明:微信公众号请求工具类

*

* @author 夏奕敏

* @date 2018年4月8日 上午10:09:50

* @JDK 1.8.0_161

*/

public class WXAuthUtil {

public static final String APPID = "你的APPID";

public static final String APPSECRET = "你的AASECRET";

private static final String TOKEN = "你的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;

}

}

这个是在回调方法里把回调的结果转成JSON对象。

2.下面的类第一步是请求微信从而得到code,第二部用户点了授权确定的时候执行这个回调方法package com.lh.app.controller;

import java.io.IOException;

import java.io.UnsupportedEncodingException;

import java.net.URLEncoder;

import java.util.Map;

import java.util.UUID;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import com.lh.cmsmanagement.service.VipManagementSer;

import com.lh.lfeel.until.Helper;

import com.lh.lfeel.until.RedisToken;

import com.lh.lfeel.until.weixin.WXAuthUtil;

import com.sun.org.apache.xerces.internal.impl.xpath.regex.ParseException;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.ui.ModelMap;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import com.alibaba.fastjson.JSONObject;

/**

* 说明:

*

* @author 夏奕敏

* @date 2018年4月8日 上午10:15:09

* @JDK 1.8.0_161

*/

@Controller

@RequestMapping("/wx")

public class WXLoginController {

@Autowired

VipManagementSer vipSer;

/**

* 公众号微信登录授权

*

* @param request

* @param response

* @return

* @throws ParseException

* @author 夏奕敏

* @throws UnsupportedEncodingException

* @date 2018年4月8日 上午10:15:09

*/

@RequestMapping(value = "/wxLogin", method = RequestMethod.GET)

public String wxLogin(HttpServletRequest request,

HttpServletResponse response) throws ParseException,

UnsupportedEncodingException {

// 这个url的域名必须要在公众号中进行注册验证,这个地址是成功后的回调地址

String backUrl = "http://www.你的域名/lfeel/wx/callBack";

// 第一步:用户同意授权,获取code

String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid="

+ WXAuthUtil.APPID

+ "&redirect_uri="

+ URLEncoder.encode(backUrl, "UTF-8")

+ "&response_type=code"

+ "&scope=snsapi_userinfo" + "&state=STATE#wechat_redirect";

// response.sendRedirect(url);

return "redirect:" + url;// 必须重定向,否则不能成功

}

/**

* 公众号微信登录授权回调函数

*

* @param modelMap

* @param req

* @param resp

* @return

* @throws ServletException

* @throws IOException

* @author 夏奕敏

* @date 2018年4月8日 上午10:15:09

*/

@RequestMapping(value = "/callBack", method = RequestMethod.GET)

public void callBack(ModelMap modelMap, HttpServletRequest req,

HttpServletResponse resp) throws ServletException, IOException {

/*

* start 获取微信用户基本信息

*/

String code = req.getParameter("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";

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);

// System.out.println(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" }

// */

// System.out.println(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";

JSONObject userInfo = WXAuthUtil.doGetJson(infoUrl);

System.out.println(userInfo.toString());

Object unionid = userInfo.get("userInfo");

/*

* end 获取微信用户基本信息,这里就结束了,下面的可以写自己的逻辑代码或者重定向页面

*/

resp.sendRedirect("http://www.baidu.com/index.html" );

}

}

3.到公众号平台填写域名

203b2c4db12b4766514acb084fbd897a.png

至此已经全部结束,如果有什么不懂可以下面留言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值