最近尝试了一下网站应用走微信的第三方授权登录,在这里记录一下
一、如何开通微信公众号、微信开发平台、授权认证、接口权限申请等等,这些不在本文描述,请参考官方资料。
二、假设已顺利完成第一步的工作,现在需要在自己开发的网站(PC端、移动端,注意两者略有不同,下文有描述)接入微信登录功能。
进入真正的开发之前,需要在这里先申请一下测试号
过程之中,可以看一看微信开发文档
微信授权登录的时序图
第一次开发之前,我们可以先验证一下
/**
* 排序方法
*/
private String sort(String token, String timestamp, String nonce) {
String[] strArray = {token, timestamp, nonce};
Arrays.sort(strArray);
StringBuilder sb = new StringBuilder();
for (String str : strArray) {
sb.append(str);
}
return sb.toString();
}
/**
* 将字符串进行sha1加密
*
* @param str 需要加密的字符串
* @return 加密后的内容
*/
private String sha1(String str) {
try {
MessageDigest digest = MessageDigest.getInstance("SHA-1");
digest.update(str.getBytes());
byte[] messageDigest = digest.digest();
// Create Hex String
StringBuffer hexString = new StringBuffer();
// 字节数组转换为 十六进制 数
for (int i = 0; i < messageDigest.length; i++) {
String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
if (shaHex.length() < 2) {
hexString.append(0);
}
hexString.append(shaHex);
}
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
/**
* 微信公众号验证,接收并校验四个请求参数
*
* @param signature 参数1
* @param timestamp 参数2
* @param nonce 参数3
* @param echostr 参数4
* @param response http/
* @throws IOException 抛出异常
*/
@RequestMapping(value = "/chk", method = RequestMethod.GET)
public String checkName(@RequestParam(name = "signature") String signature,
@RequestParam(name = "timestamp") String timestamp,
@RequestParam(name = "nonce") String nonce,
@RequestParam(name = "echostr") String echostr, HttpServletResponse response) {
System.out.println("-----------------------开始校验------------------------");
System.out.println(signature);
System.out.println(timestamp);
System.out.println(nonce);
System.out.println(echostr);
//排序
String sortString = sort(WXAuthUtil.TOKEN, timestamp, nonce);
//加密
String myString = sha1(sortString);
//校验
if (myString != null && !myString.isEmpty() && myString.equals(signature)) {
System.out.println("签名校验通过");
System.out.println(echostr);
//如果检验成功原样返回echostr,微信服务器接收到此输出,才会确认检验完成。
return echostr;
} else {
System.out.println("签名校验失败");
return "";
}
}
工具类
/**
* 说明:微信公众号请求工具类
*/
public class WXAuthUtil {
public static final String APPID = "这里填开发测试号的appid";
public static final String APPSECRET = "这里填开发测试号的appsecret";
public 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;
}
}