首先说一下,这里的获取用户信息是从微信公众号跳转到第三方网站然后根据微信的api获取用户昵称,头像,手机号,地址,openid,unionid等信息。
1.服务器配置
首先登陆你的公众号,左下角的开发->基本配置,其中的服务器配置,点击添加或者修改,这里是必须配了公网解析,并且服务器nginx配置跳转
URL填写验证token的接口地址:你的网址/接口名称
Token随意填写,但是需要和你程序中验证的Token相同
点击随机生成,生成加密密钥
点击提交会向你的程序发送验证,需要按照微信的要求返回密文才能提交成功。
下面是我的controller
@ResponseBody
@GetMapping("/check")
public String check(HttpServletRequest request) {
// 微信加密签名
String signature = request.getParameter("signature");
// 时间戳
String timestamp = request.getParameter("timestamp");
// 随机数
String nonce = request.getParameter("nonce");
// 随机字符串
String echostr = request.getParameter("echostr");
// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
if (SignUtil.checkSignature(signature, timestamp, nonce)) {
log.info("echostr=" + echostr);
return echostr;
} else {
return "fail";
}
}
其中的加密方法如下
public class SignUtil {
// 与接口配置信息中的Token要一致
private static final String TOKEN = "targetToken";
/**
* 方法名:checkSignature</br>
* 详述:验证签名</br>
* 开发人员:souvc</br>
* 创建时间:2015-9-29 </br>
* @param signature
* @param timestamp
* @param nonce
* @return
* @throws
*/
public static boolean checkSignature(String signature, String timestamp,String nonce) {
// 1.将token、timestamp、nonce三个参数进行字典序排序
String[] arr = new String[] { TOKEN, timestamp, nonce };
Arrays.sort(arr);
// 2. 将三个参数字符串拼接成一个字符串进行sha1加密
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;
// 3.将sha1加密后的字符串可与signature对比,标识该请求来源于微信
return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
}
/**
* 方法名:byteToStr</br>
* 详述:将字节数组转换为十六进制字符串</br>
* 开发人员:souvc </br>
* 创建时间:2015-9-29 </br>
* @param byteArray
* @return
* @throws
*/
private static String byteToStr(byte[] byteArray) {
String strDigest = "";
for (int i = 0; i < byteArray.length; i++) {
strDigest += byteToHexStr(byteArray[i]);
}
return strDigest;
}
/**
* 方法名:byteToHexStr</br>
* 详述:将字节转换为十六进制字符串</br>
* 开发人员:souvc</br>
* 创建时间:2015-9-29 </br>
* @param mByte
* @return
* @throws
*/
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;
}
}
即可提交成功
2.测试环境开发
微信是提供了测试环境公众号的
https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
3.跳转外链
微信开发文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 微信网页开发下的微信网页授权。
从公众号跳转外链,直接填外链是打不开的,需要先像上面一样配置服务器,然后就可以打开这台服务器上的页面了,然后跳转的链接是这样的:
其中redirect_uri就是你要跳转的链接
4.获取用户信息
微信开发文档https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140839 下面微信网页开发/微信网页授权下面有5步:
1 第一步:用户同意授权,获取code
2 第二步:通过code换取网页授权access_token
3 第三步:刷新access_token(如果需要)
4 第四步:拉取用户信息(需scope为 snsapi_userinfo)
5 附:检验授权凭证(access_token)是否有效
根据说明发送http请求就行,这里代码就不全展示了,
如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。
举例根据code获取access_token:
public Map<String, String> getAccessToken(String code) throws Exception {
HttpUriRequest request = RequestBuilder.get("https://api.weixin.qq.com/sns/oauth2/access_token" + "?appid=" + APPID + "&secret=" + APPSECRET + "&code=" + code + "&grant_type=authorization_code").setConfig(HttpClientFactory.getDefaultRequestConfig()).build();
HttpResponse response = client.execute(request);
//EntityUtils.consumeQuietly(response.getEntity());
int rspCode = response.getStatusLine().getStatusCode();
log.info("rsqcode" + rspCode);
Map<String, String> result = JSON.read(EntityUtils.toString(response.getEntity()), Map.class);
log.info("" + result);
if (rspCode / 100 != 2) {
throw new IOException("unexpectedresponsecode:" + rspCode);
} else {
EntityUtils.consumeQuietly(response.getEntity());
}
return result;
}
这里都返回成map,根据需要再取,取不到就抛出异常
大致就是这样,希望看到这里你有所得。
欢迎关注我的微博@住街对面的查理,我的生活很有趣,你要不要来看一看。