阿里云部署Java网站和微信开发调试心得技巧(下)
五、微信测试号的申请与连接以获取微信用户信息
在咱们自己的程序里面编写servlet以响应微信号
在接下来的步骤中,我们将在测试号里面设置接口配置信息的URL,一经设置,微信公众号便会发请求到我们设置好的URL去,我们必须编写程序应答才能顺利连通微信公众号,因此咱们需要编写相应的响应程序
需要编写两个类
【SignUtil】
package com.imooc.o2o.util.weixin;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
/**
* 微信请求校验工具类
*/
public class SignUtil {
// 与接口配置信息中的Token要一致
private static String token = "myo2o";
/**
* 验证签名
*
* @param signature
* @param timestamp
* @param nonce
* @return
*/
public static boolean checkSignature(String signature, String timestamp, String nonce) {
String[] arr = new String[] { token, timestamp, nonce };
// 将token、timestamp、nonce三个参数进行字典序排序
Arrays.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;
}
/**
* 将字节数组转换为十六进制字符串
*
* @param byteArray
* @return
*/
private static String byteToStr(byte[] byteArray) {
String strDigest = "";
for (int i = 0; i < byteArray.length; i++) {
strDigest += byteToHexStr(byteArray[i]);
}
return strDigest;
}
/**
* 将字节转换为十六进制字符串
*
* @param mByte
* @return
*/
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;
}
}
【WechatController】
package com.imooc.o2o.web.wechat;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.imooc.o2o.util.wechat.SignUtil;
@Controller
//一会在设置的URL里面就设置上这个路由
@RequestMapping(“wechat”)
public class WechatController {
</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="typ">Logger</span><span class="pln"> log </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LoggerFactory</span><span class="pun">.</span><span class="pln">getLogger</span><span class="pun">(</span><span class="typ">WechatController</span><span class="pun">.</span><span class="kwd">class</span><span class="pun">);</span><span class="pln">
</span><span class="lit">@RequestMapping</span><span class="pun">(</span><span class="pln">method </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">RequestMethod</span><span class="pun">.</span><span class="pln">GET </span><span class="pun">})</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> doGet</span><span class="pun">(</span><span class="typ">HttpServletRequest</span><span class="pln"> request</span><span class="pun">,</span><span class="pln"> </span><span class="typ">HttpServletResponse</span><span class="pln"> response</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
log</span><span class="pun">.</span><span class="pln">debug</span><span class="pun">(</span><span class="str">"weixin get..."</span><span class="pun">);</span><span class="pln">
</span><span class="com">// 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。</span><span class="pln">
</span><span class="typ">String</span><span class="pln"> signature </span><span class="pun">=</span><span class="pln"> request</span><span class="pun">.</span><span class="pln">getParameter</span><span class="pun">(</span><span class="str">"signature"</span><span class="pun">);</span><span class="pln">
</span><span class="com">// 时间戳</span><span class="pln">
</span><span class="typ">String</span><span class="pln"> timestamp </span><span class="pun">=</span><span class="pln"> request</span><span class="pun">.</span><span class="pln">getParameter</span><span class="pun">(</span><span class="str">"timestamp"</span><span class="pun">);</span><span class="pln">
</span><span class="com">// 随机数</span><span class="pln">
</span><span class="typ">String</span><span class="pln"> nonce </span><span class="pun">=</span><span class="pln"> request</span><span class="pun">.</span><span class="pln">getParameter</span><span class="pun">(</span><span class="str">"nonce"</span><span class="pun">);</span><span class="pln">
</span><span class="com">// 随机字符串</span><span class="pln">
</span><span class="typ">String</span><span class="pln"> echostr </span><span class="pun">=</span><span class="pln"> request</span><span class="pun">.</span><span class="pln">getParameter</span><span class="pun">(</span><span class="str">"echostr"</span><span class="pun">);</span><span class="pln">
</span><span class="com">// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败</span><span class="pln">
</span><span class="typ">PrintWriter</span><span class="pln"> </span><span class="kwd">out</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">out</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> response</span><span class="pun">.</span><span class="pln">getWriter</span><span class="pun">();</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">SignUtil</span><span class="pun">.</span><span class="pln">checkSignature</span><span class="pun">(</span><span class="pln">signature</span><span class="pun">,</span><span class="pln"> timestamp</span><span class="pun">,</span><span class="pln"> nonce</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
log</span><span class="pun">.</span><span class="pln">debug</span><span class="pun">(</span><span class="str">"weixin get success...."</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">out</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">echostr</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="typ">IOException</span><span class="pln"> e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
e</span><span class="pun">.</span><span class="pln">printStackTrace</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">finally</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">out</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">close</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
}
之后重新部署一版最新的程序
访问微信测试号登录页面,通过打开自己手机的微信,扫一扫登录
https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.imooc.o2o.dto.UserAccessToken;
import com.imooc.o2o.dto.WechatUser;
import com.imooc.o2o.util.wechat.WeiXinUserUtil;
@Controller
@RequestMapping(“wechatlogin”)
/**
- 获取关注公众号之后的微信用户信息的接口,如果在微信浏览器里访问
- https://open.weixin.qq.com/connect/oauth2/authorize?appid=您的appId&redirect_uri=http://o2o.yitiaojieinfo.com/o2o/wechatlogin/logincheck&role_type=1&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect
- 则这里将会获取到code,之后再可以通过code获取到access_token 进而获取到用户信息
- @author xiangze
*/
public class WechatLoginController {
</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="typ">Logger</span><span class="pln"> log </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LoggerFactory</span><span class="pun">.</span><span class="pln">getLogger</span><span class="pun">(</span><span class="typ">WechatLoginController</span><span class="pun">.</span><span class="kwd">class</span><span class="pun">);</span><span class="pln">
</span><span class="lit">@RequestMapping</span><span class="pun">(</span><span class="pln">value </span><span class="pun">=</span><span class="pln"> </span><span class="str">"/logincheck"</span><span class="pun">,</span><span class="pln"> method </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">RequestMethod</span><span class="pun">.</span><span class="pln">GET </span><span class="pun">})</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> doGet</span><span class="pun">(</span><span class="typ">HttpServletRequest</span><span class="pln"> request</span><span class="pun">,</span><span class="pln"> </span><span class="typ">HttpServletResponse</span><span class="pln"> response</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
log</span><span class="pun">.</span><span class="pln">debug</span><span class="pun">(</span><span class="str">"weixin login get..."</span><span class="pun">);</span><span class="pln">
</span><span class="com">// 获取微信公众号传输过来的code,通过code可获取access_token,进而获取用户信息</span><span class="pln">
</span><span class="typ">String</span><span class="pln"> code </span><span class="pun">=</span><span class="pln"> request</span><span class="pun">.</span><span class="pln">getParameter</span><span class="pun">(</span><span class="str">"code"</span><span class="pun">);</span><span class="pln">
</span><span class="com">// 这个state可以用来传我们自定义的信息,方便程序调用,这里也可以不用</span><span class="pln">
</span><span class="com">// String roleType = request.getParameter("state");</span><span class="pln">
log</span><span class="pun">.</span><span class="pln">debug</span><span class="pun">(</span><span class="str">"weixin login code:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> code</span><span class="pun">);</span><span class="pln">
</span><span class="typ">WechatUser</span><span class="pln"> user </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
</span><span class="typ">String</span><span class="pln"> openId </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">null</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> code</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="typ">UserAccessToken</span><span class="pln"> token</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="com">// 通过code获取access_token</span><span class="pln">
token </span><span class="pun">=</span><span class="pln"> </span><span class="typ">WeiXinUserUtil</span><span class="pun">.</span><span class="pln">getUserAccessToken</span><span class="pun">(</span><span class="pln">code</span><span class="pun">);</span><span class="pln">
log</span><span class="pun">.</span><span class="pln">debug</span><span class="pun">(</span><span class="str">"weixin login token:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> token</span><span class="pun">.</span><span class="pln">toString</span><span class="pun">());</span><span class="pln">
</span><span class="com">// 通过token获取accessToken</span><span class="pln">
</span><span class="typ">String</span><span class="pln"> accessToken </span><span class="pun">=</span><span class="pln"> token</span><span class="pun">.</span><span class="pln">getAccessToken</span><span class="pun">();</span><span class="pln">
</span><span class="com">// 通过token获取openId</span><span class="pln">
openId </span><span class="pun">=</span><span class="pln"> token</span><span class="pun">.</span><span class="pln">getOpenId</span><span class="pun">();</span><span class="pln">
</span><span class="com">// 通过access_token和openId获取用户昵称等信息</span><span class="pln">
user </span><span class="pun">=</span><span class="pln"> </span><span class="typ">WeiXinUserUtil</span><span class="pun">.</span><span class="pln">getUserInfo</span><span class="pun">(</span><span class="pln">accessToken</span><span class="pun">,</span><span class="pln"> openId</span><span class="pun">);</span><span class="pln">
log</span><span class="pun">.</span><span class="pln">debug</span><span class="pun">(</span><span class="str">"weixin login user:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> user</span><span class="pun">.</span><span class="pln">toString</span><span class="pun">());</span><span class="pln">
request</span><span class="pun">.</span><span class="pln">getSession</span><span class="pun">().</span><span class="pln">setAttribute</span><span class="pun">(</span><span class="str">"openId"</span><span class="pun">,</span><span class="pln"> openId</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="typ">IOException</span><span class="pln"> e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
log</span><span class="pun">.</span><span class="pln">error</span><span class="pun">(</span><span class="str">"error in getUserAccessToken or getUserInfo or findByOpenId: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">toString</span><span class="pun">());</span><span class="pln">
e</span><span class="pun">.</span><span class="pln">printStackTrace</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="com">// ======todo begin======</span><span class="pln">
</span><span class="com">// 前面咱们获取到openId后,可以通过它去数据库判断该微信帐号是否在我们网站里有对应的帐号了,</span><span class="pln">
</span><span class="com">// 没有的话这里可以自动创建上,直接实现微信与咱们网站的无缝对接。</span><span class="pln">
</span><span class="com">// ======todo end======</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">user </span><span class="pun">!=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="com">// 获取到微信验证的信息后返回到指定的路由(需要自己设定)</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> </span><span class="str">"frontend/index"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
}
【UserAccessToken】用户AccessToken实体类,用来接收accesstoken以及openid等信息
package com.imooc.o2o.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
/**
- 用户授权token
- @author xiangze
*/
public class UserAccessToken {
</span><span class="com">// 获取到的凭证</span><span class="pln">
</span><span class="lit">@JsonProperty</span><span class="pun">(</span><span class="str">"access_token"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> accessToken</span><span class="pun">;</span><span class="pln">
</span><span class="com">// 凭证有效时间,单位:秒</span><span class="pln">
</span><span class="lit">@JsonProperty</span><span class="pun">(</span><span class="str">"expires_in"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> expiresIn</span><span class="pun">;</span><span class="pln">
</span><span class="com">// 表示更新令牌,用来获取下一次的访问令牌,这里没太大用处</span><span class="pln">
</span><span class="lit">@JsonProperty</span><span class="pun">(</span><span class="str">"refresh_token"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> refreshToken</span><span class="pun">;</span><span class="pln">
</span><span class="com">// 该用户在此公众号下的身份标识,对于此微信号具有唯一性</span><span class="pln">
</span><span class="lit">@JsonProperty</span><span class="pun">(</span><span class="str">"openid"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> openId</span><span class="pun">;</span><span class="pln">
</span><span class="com">// 表示权限范围,这里可省略</span><span class="pln">
</span><span class="lit">@JsonProperty</span><span class="pun">(</span><span class="str">"scope"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> scope</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> getAccessToken</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> accessToken</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setAccessToken</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> accessToken</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">accessToken </span><span class="pun">=</span><span class="pln"> accessToken</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> getExpiresIn</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> expiresIn</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setExpiresIn</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> expiresIn</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">expiresIn </span><span class="pun">=</span><span class="pln"> expiresIn</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> getRefreshToken</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> refreshToken</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setRefreshToken</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> refreshToken</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">refreshToken </span><span class="pun">=</span><span class="pln"> refreshToken</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> getOpenId</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> openId</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setOpenId</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> openId</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">openId </span><span class="pun">=</span><span class="pln"> openId</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> getScope</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> scope</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setScope</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> scope</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">scope </span><span class="pun">=</span><span class="pln"> scope</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="lit">@Override</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> toString</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> </span><span class="str">"accessToken:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">getAccessToken</span><span class="pun">()</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">",openId:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">getOpenId</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
}
【WechatUser】微信用户实体类,用来接收昵称 openid等用户信息
package com.imooc.o2o.dto;
import java.io.Serializable;
import com.fasterxml.jackson.annotation.JsonProperty;
/**
- 微信用户实体类
- @author xiangze
*/
public class WechatUser implements Serializable {
</span><span class="com">/**
*
*/</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">final</span><span class="pln"> </span><span class="kwd">long</span><span class="pln"> serialVersionUID </span><span class="pun">=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">4684067645282292327L</span><span class="pun">;</span><span class="pln">
</span><span class="com">// openId,标识该公众号下面的该用户的唯一Id</span><span class="pln">
</span><span class="lit">@JsonProperty</span><span class="pun">(</span><span class="str">"openid"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> openId</span><span class="pun">;</span><span class="pln">
</span><span class="com">// 用户昵称</span><span class="pln">
</span><span class="lit">@JsonProperty</span><span class="pun">(</span><span class="str">"nickname"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> nickName</span><span class="pun">;</span><span class="pln">
</span><span class="com">// 性别</span><span class="pln">
</span><span class="lit">@JsonProperty</span><span class="pun">(</span><span class="str">"sex"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> sex</span><span class="pun">;</span><span class="pln">
</span><span class="com">// 省份</span><span class="pln">
</span><span class="lit">@JsonProperty</span><span class="pun">(</span><span class="str">"province"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> province</span><span class="pun">;</span><span class="pln">
</span><span class="com">// 城市</span><span class="pln">
</span><span class="lit">@JsonProperty</span><span class="pun">(</span><span class="str">"city"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> city</span><span class="pun">;</span><span class="pln">
</span><span class="com">// 区</span><span class="pln">
</span><span class="lit">@JsonProperty</span><span class="pun">(</span><span class="str">"country"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> country</span><span class="pun">;</span><span class="pln">
</span><span class="com">// 头像图片地址</span><span class="pln">
</span><span class="lit">@JsonProperty</span><span class="pun">(</span><span class="str">"headimgurl"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> headimgurl</span><span class="pun">;</span><span class="pln">
</span><span class="com">// 语言</span><span class="pln">
</span><span class="lit">@JsonProperty</span><span class="pun">(</span><span class="str">"language"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> language</span><span class="pun">;</span><span class="pln">
</span><span class="com">// 用户权限,这里没什么作用</span><span class="pln">
</span><span class="lit">@JsonProperty</span><span class="pun">(</span><span class="str">"privilege"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> privilege</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> getOpenId</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> openId</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setOpenId</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> openId</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">openId </span><span class="pun">=</span><span class="pln"> openId</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> getNickName</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> nickName</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setNickName</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> nickName</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">nickName </span><span class="pun">=</span><span class="pln"> nickName</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> getSex</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> sex</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setSex</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> sex</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">sex </span><span class="pun">=</span><span class="pln"> sex</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> getProvince</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> province</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setProvince</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> province</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">province </span><span class="pun">=</span><span class="pln"> province</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> getCity</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> city</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setCity</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> city</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">city </span><span class="pun">=</span><span class="pln"> city</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> getCountry</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> country</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setCountry</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> country</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">country </span><span class="pun">=</span><span class="pln"> country</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> getHeadimgurl</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> headimgurl</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setHeadimgurl</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> headimgurl</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">headimgurl </span><span class="pun">=</span><span class="pln"> headimgurl</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> getLanguage</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> language</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setLanguage</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> language</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">language </span><span class="pun">=</span><span class="pln"> language</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> getPrivilege</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> privilege</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> setPrivilege</span><span class="pun">(</span><span class="typ">String</span><span class="pun">[]</span><span class="pln"> privilege</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">privilege </span><span class="pun">=</span><span class="pln"> privilege</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="lit">@Override</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> toString</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> </span><span class="str">"openId:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">getOpenId</span><span class="pun">()</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">",nikename:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">getNickName</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
}
【WechatUtil】主要用来提交https请求给微信获取用户信息
package com.imooc.o2o.util.wechat;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.imooc.o2o.dto.UserAccessToken;
import com.imooc.o2o.dto.WechatUser;
/**
- 微信工具类
- @author xiangze
*/
public class WechatUtil {
</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="typ">Logger</span><span class="pln"> log </span><span class="pun">=</span><span class="pln"> </span><span class="typ">LoggerFactory</span><span class="pun">.</span><span class="pln">getLogger</span><span class="pun">(</span><span class="typ">WechatUtil</span><span class="pun">.</span><span class="kwd">class</span><span class="pun">);</span><span class="pln">
</span><span class="com">/**
* 获取UserAccessToken实体类
*
* @param code
* @return
* @throws IOException
*/</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="typ">UserAccessToken</span><span class="pln"> getUserAccessToken</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> code</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">throws</span><span class="pln"> </span><span class="typ">IOException</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="com">// 测试号信息里的appId</span><span class="pln">
</span><span class="typ">String</span><span class="pln"> appId </span><span class="pun">=</span><span class="pln"> </span><span class="str">"您的appId"</span><span class="pun">;</span><span class="pln">
log</span><span class="pun">.</span><span class="pln">debug</span><span class="pun">(</span><span class="str">"appId:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> appId</span><span class="pun">);</span><span class="pln">
</span><span class="com">// 测试号信息里的appsecret</span><span class="pln">
</span><span class="typ">String</span><span class="pln"> appsecret </span><span class="pun">=</span><span class="pln"> </span><span class="str">"您的appsecret"</span><span class="pun">;</span><span class="pln">
log</span><span class="pun">.</span><span class="pln">debug</span><span class="pun">(</span><span class="str">"secret:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> appsecret</span><span class="pun">);</span><span class="pln">
</span><span class="com">// 根据传入的code,拼接出访问微信定义好的接口的URL</span><span class="pln">
</span><span class="typ">String</span><span class="pln"> url </span><span class="pun">=</span><span class="pln"> </span><span class="str">"https://api.weixin.qq.com/sns/oauth2/access_token?appid="</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> appId </span><span class="pun">+</span><span class="pln"> </span><span class="str">"&secret="</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> appsecret
</span><span class="pun">+</span><span class="pln"> </span><span class="str">"&code="</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> code </span><span class="pun">+</span><span class="pln"> </span><span class="str">"&grant_type=authorization_code"</span><span class="pun">;</span><span class="pln">
</span><span class="com">// 向相应URL发送请求获取token json字符串</span><span class="pln">
</span><span class="typ">String</span><span class="pln"> tokenStr </span><span class="pun">=</span><span class="pln"> httpsRequest</span><span class="pun">(</span><span class="pln">url</span><span class="pun">,</span><span class="pln"> </span><span class="str">"GET"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">);</span><span class="pln">
log</span><span class="pun">.</span><span class="pln">debug</span><span class="pun">(</span><span class="str">"userAccessToken:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> tokenStr</span><span class="pun">);</span><span class="pln">
</span><span class="typ">UserAccessToken</span><span class="pln"> token </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">UserAccessToken</span><span class="pun">();</span><span class="pln">
</span><span class="typ">ObjectMapper</span><span class="pln"> objectMapper </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ObjectMapper</span><span class="pun">();</span><span class="pln">
</span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="com">// 将json字符串转换成相应对象</span><span class="pln">
token </span><span class="pun">=</span><span class="pln"> objectMapper</span><span class="pun">.</span><span class="pln">readValue</span><span class="pun">(</span><span class="pln">tokenStr</span><span class="pun">,</span><span class="pln"> </span><span class="typ">UserAccessToken</span><span class="pun">.</span><span class="kwd">class</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="typ">JsonParseException</span><span class="pln"> e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
log</span><span class="pun">.</span><span class="pln">error</span><span class="pun">(</span><span class="str">"获取用户accessToken失败: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">getMessage</span><span class="pun">());</span><span class="pln">
e</span><span class="pun">.</span><span class="pln">printStackTrace</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="typ">JsonMappingException</span><span class="pln"> e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
log</span><span class="pun">.</span><span class="pln">error</span><span class="pun">(</span><span class="str">"获取用户accessToken失败: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">getMessage</span><span class="pun">());</span><span class="pln">
e</span><span class="pun">.</span><span class="pln">printStackTrace</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="typ">IOException</span><span class="pln"> e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
log</span><span class="pun">.</span><span class="pln">error</span><span class="pun">(</span><span class="str">"获取用户accessToken失败: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">getMessage</span><span class="pun">());</span><span class="pln">
e</span><span class="pun">.</span><span class="pln">printStackTrace</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">token </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
log</span><span class="pun">.</span><span class="pln">error</span><span class="pun">(</span><span class="str">"获取用户accessToken失败。"</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> token</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="com">/**
* 获取WechatUser实体类
*
* @param accessToken
* @param openId
* @return
*/</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="typ">WechatUser</span><span class="pln"> getUserInfo</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> accessToken</span><span class="pun">,</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> openId</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="com">// 根据传入的accessToken以及openId拼接出访问微信定义的端口并获取用户信息的URL</span><span class="pln">
</span><span class="typ">String</span><span class="pln"> url </span><span class="pun">=</span><span class="pln"> </span><span class="str">"https://api.weixin.qq.com/sns/userinfo?access_token="</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> accessToken </span><span class="pun">+</span><span class="pln"> </span><span class="str">"&openid="</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> openId
</span><span class="pun">+</span><span class="pln"> </span><span class="str">"&lang=zh_CN"</span><span class="pun">;</span><span class="pln">
</span><span class="com">// 访问该URL获取用户信息json 字符串</span><span class="pln">
</span><span class="typ">String</span><span class="pln"> userStr </span><span class="pun">=</span><span class="pln"> httpsRequest</span><span class="pun">(</span><span class="pln">url</span><span class="pun">,</span><span class="pln"> </span><span class="str">"GET"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">);</span><span class="pln">
log</span><span class="pun">.</span><span class="pln">debug</span><span class="pun">(</span><span class="str">"user info :"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> userStr</span><span class="pun">);</span><span class="pln">
</span><span class="typ">WechatUser</span><span class="pln"> user </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">WechatUser</span><span class="pun">();</span><span class="pln">
</span><span class="typ">ObjectMapper</span><span class="pln"> objectMapper </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ObjectMapper</span><span class="pun">();</span><span class="pln">
</span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="com">// 将json字符串转换成相应对象</span><span class="pln">
user </span><span class="pun">=</span><span class="pln"> objectMapper</span><span class="pun">.</span><span class="pln">readValue</span><span class="pun">(</span><span class="pln">userStr</span><span class="pun">,</span><span class="pln"> </span><span class="typ">WechatUser</span><span class="pun">.</span><span class="kwd">class</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="typ">JsonParseException</span><span class="pln"> e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
log</span><span class="pun">.</span><span class="pln">error</span><span class="pun">(</span><span class="str">"获取用户信息失败: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">getMessage</span><span class="pun">());</span><span class="pln">
e</span><span class="pun">.</span><span class="pln">printStackTrace</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="typ">JsonMappingException</span><span class="pln"> e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
log</span><span class="pun">.</span><span class="pln">error</span><span class="pun">(</span><span class="str">"获取用户信息失败: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">getMessage</span><span class="pun">());</span><span class="pln">
e</span><span class="pun">.</span><span class="pln">printStackTrace</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="typ">IOException</span><span class="pln"> e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
log</span><span class="pun">.</span><span class="pln">error</span><span class="pun">(</span><span class="str">"获取用户信息失败: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> e</span><span class="pun">.</span><span class="pln">getMessage</span><span class="pun">());</span><span class="pln">
e</span><span class="pun">.</span><span class="pln">printStackTrace</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">user </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
log</span><span class="pun">.</span><span class="pln">error</span><span class="pun">(</span><span class="str">"获取用户信息失败。"</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> user</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="com">/**
* 发起https请求并获取结果
*
* @param requestUrl
* 请求地址
* @param requestMethod
* 请求方式(GET、POST)
* @param outputStr
* 提交的数据
* @return json字符串
*/</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> httpsRequest</span><span class="pun">(</span><span class="typ">String</span><span class="pln"> requestUrl</span><span class="pun">,</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> requestMethod</span><span class="pun">,</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> outputStr</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="typ">StringBuffer</span><span class="pln"> buffer </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StringBuffer</span><span class="pun">();</span><span class="pln">
</span><span class="kwd">try</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="com">// 创建SSLContext对象,并使用我们指定的信任管理器初始化</span><span class="pln">
</span><span class="typ">TrustManager</span><span class="pun">[]</span><span class="pln"> tm </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">MyX509TrustManager</span><span class="pun">()</span><span class="pln"> </span><span class="pun">};</span><span class="pln">
</span><span class="typ">SSLContext</span><span class="pln"> sslContext </span><span class="pun">=</span><span class="pln"> </span><span class="typ">SSLContext</span><span class="pun">.</span><span class="pln">getInstance</span><span class="pun">(</span><span class="str">"SSL"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"SunJSSE"</span><span class="pun">);</span><span class="pln">
sslContext</span><span class="pun">.</span><span class="pln">init</span><span class="pun">(</span><span class="kwd">null</span><span class="pun">,</span><span class="pln"> tm</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">security</span><span class="pun">.</span><span class="typ">SecureRandom</span><span class="pun">());</span><span class="pln">
</span><span class="com">// 从上述SSLContext对象中得到SSLSocketFactory对象</span><span class="pln">
</span><span class="typ">SSLSocketFactory</span><span class="pln"> ssf </span><span class="pun">=</span><span class="pln"> sslContext</span><span class="pun">.</span><span class="pln">getSocketFactory</span><span class="pun">();</span><span class="pln">
URL url </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> URL</span><span class="pun">(</span><span class="pln">requestUrl</span><span class="pun">);</span><span class="pln">
</span><span class="typ">HttpsURLConnection</span><span class="pln"> httpUrlConn </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">HttpsURLConnection</span><span class="pun">)</span><span class="pln"> url</span><span class="pun">.</span><span class="pln">openConnection</span><span class="pun">();</span><span class="pln">
httpUrlConn</span><span class="pun">.</span><span class="pln">setSSLSocketFactory</span><span class="pun">(</span><span class="pln">ssf</span><span class="pun">);</span><span class="pln">
httpUrlConn</span><span class="pun">.</span><span class="pln">setDoOutput</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">);</span><span class="pln">
httpUrlConn</span><span class="pun">.</span><span class="pln">setDoInput</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">);</span><span class="pln">
httpUrlConn</span><span class="pun">.</span><span class="pln">setUseCaches</span><span class="pun">(</span><span class="kwd">false</span><span class="pun">);</span><span class="pln">
</span><span class="com">// 设置请求方式(GET/POST)</span><span class="pln">
httpUrlConn</span><span class="pun">.</span><span class="pln">setRequestMethod</span><span class="pun">(</span><span class="pln">requestMethod</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="str">"GET"</span><span class="pun">.</span><span class="pln">equalsIgnoreCase</span><span class="pun">(</span><span class="pln">requestMethod</span><span class="pun">))</span><span class="pln">
httpUrlConn</span><span class="pun">.</span><span class="pln">connect</span><span class="pun">();</span><span class="pln">
</span><span class="com">// 当有数据需要提交时</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">null</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> outputStr</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="typ">OutputStream</span><span class="pln"> outputStream </span><span class="pun">=</span><span class="pln"> httpUrlConn</span><span class="pun">.</span><span class="pln">getOutputStream</span><span class="pun">();</span><span class="pln">
</span><span class="com">// 注意编码格式,防止中文乱码</span><span class="pln">
outputStream</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="pln">outputStr</span><span class="pun">.</span><span class="pln">getBytes</span><span class="pun">(</span><span class="str">"UTF-8"</span><span class="pun">));</span><span class="pln">
outputStream</span><span class="pun">.</span><span class="pln">close</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="com">// 将返回的输入流转换成字符串</span><span class="pln">
</span><span class="typ">InputStream</span><span class="pln"> inputStream </span><span class="pun">=</span><span class="pln"> httpUrlConn</span><span class="pun">.</span><span class="pln">getInputStream</span><span class="pun">();</span><span class="pln">
</span><span class="typ">InputStreamReader</span><span class="pln"> inputStreamReader </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">InputStreamReader</span><span class="pun">(</span><span class="pln">inputStream</span><span class="pun">,</span><span class="pln"> </span><span class="str">"utf-8"</span><span class="pun">);</span><span class="pln">
</span><span class="typ">BufferedReader</span><span class="pln"> bufferedReader </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">BufferedReader</span><span class="pun">(</span><span class="pln">inputStreamReader</span><span class="pun">);</span><span class="pln">
</span><span class="typ">String</span><span class="pln"> str </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">while</span><span class="pln"> </span><span class="pun">((</span><span class="pln">str </span><span class="pun">=</span><span class="pln"> bufferedReader</span><span class="pun">.</span><span class="pln">readLine</span><span class="pun">())</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
buffer</span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="pln">str</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
bufferedReader</span><span class="pun">.</span><span class="pln">close</span><span class="pun">();</span><span class="pln">
inputStreamReader</span><span class="pun">.</span><span class="pln">close</span><span class="pun">();</span><span class="pln">
</span><span class="com">// 释放资源</span><span class="pln">
inputStream</span><span class="pun">.</span><span class="pln">close</span><span class="pun">();</span><span class="pln">
inputStream </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
httpUrlConn</span><span class="pun">.</span><span class="pln">disconnect</span><span class="pun">();</span><span class="pln">
log</span><span class="pun">.</span><span class="pln">debug</span><span class="pun">(</span><span class="str">"https buffer:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> buffer</span><span class="pun">.</span><span class="pln">toString</span><span class="pun">());</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="typ">ConnectException</span><span class="pln"> ce</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
log</span><span class="pun">.</span><span class="pln">error</span><span class="pun">(</span><span class="str">"Weixin server connection timed out."</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">catch</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Exception</span><span class="pln"> e</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
log</span><span class="pun">.</span><span class="pln">error</span><span class="pun">(</span><span class="str">"https request error:{}"</span><span class="pun">,</span><span class="pln"> e</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> buffer</span><span class="pun">.</span><span class="pln">toString</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
}
【MyX509TrustManager】主要继承X509TrustManager做https证书信任管理器
package com.imooc.o2o.util.wechat;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;
/**
- 证书信任管理器(用于https请求)
- @author xiangze
*/
public class MyX509TrustManager implements X509TrustManager {
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> checkClientTrusted</span><span class="pun">(</span><span class="pln">X509Certificate</span><span class="pun">[]</span><span class="pln"> chain</span><span class="pun">,</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> authType</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">throws</span><span class="pln"> </span><span class="typ">CertificateException</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> checkServerTrusted</span><span class="pun">(</span><span class="pln">X509Certificate</span><span class="pun">[]</span><span class="pln"> chain</span><span class="pun">,</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> authType</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">throws</span><span class="pln"> </span><span class="typ">CertificateException</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> X509Certificate</span><span class="pun">[]</span><span class="pln"> getAcceptedIssuers</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
}
之后重新打包一个新的war包并发布到服务器tomcat webapps目录下
发布成功后,关注你自己的测试号(即扫描测试号的那个二维码),然后在手机微信里面或者微信开发者工具里访问相应链接:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=您的appid&redirect_uri=http://o2o.yitiaojieinfo.com/o2o/wechatlogin/logincheck&role_type=1&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect