您的位置:首页 > 移动开发 > 微信开发

微信静默授权,利用花生壳在本地测试

2016-12-07 11:39 507 查看
本文章包括两个部分,第一部分是微信静默授权,第二部分利用花生壳在本地测试。

一、静默授权,用户无感知;

1、首先确定好请求哪个URL需要获取授权,然后在配置文件配置拦截器,拦截此请求,获取openid后传给control层;

<mvc:interceptor>
<mvc:mapping path="/winterCamp/myBaby"/>
<mvc:mapping path="/winterCamp/new"/>
<!-- 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 -->
<bean class="com.redcooo.site.web.interceptors.WeChatInterceptor"/>
</mvc:interceptor>


2、静默授权分为两部分,一个是获取code,根据code获取openid,具体代码如下:

@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {

String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";
String redirectUrl = request.getRequestURL().toString();
String openid = (String) request.getSession().getAttribute("openid");
String code = request.getParameter("code");
log.debug("get openid start" + code);
if (StringUtils.isNotBlank(code)) {
try{
String newOpenid = WeixinUtil.getOpenIdByHtmlToken(code);
request.getSession().setAttribute("openid", newOpenid);
}catch (Exception e){
e.printStackTrace();
}
} else if(StringUtils.isBlank(openid)){
String domain = redirectUrl;
domain = URLEncoder.encode(domain, "UTF-8");
String requestUrl = url.replace("APPID", ConstantWeChat.APPID)
.replace("REDIRECT_URI", domain);
redirectUrl = requestUrl;
log.debug("redirectUrl[{}]", redirectUrl);
response.sendRedirect(redirectUrl);
return false;
}
return true;
}
/**
* 发起https请求并获取结果
*
* @param requestUrl
*            请求地址
* @param requestMethod
*            请求方式(GET、POST)
* @param outputStr
*            提交的数据
* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
*/
public static JSONObject httpsRequest(String requestUrl,
String requestMethod, String outputStr) {
JSONObject jsonObject = null;
StringBuffer buffer = new StringBuffer();
try {
// 创建SSLContext对象,并使用我们指定的信任管理器初始化
TrustManager[] tm = { new MyX509TrustManager() };
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
// 从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = sslContext.getSocketFactory();

URL url = new URL(requestUrl);
HttpsURLConnection httpUrlConn = (HttpsURLConnection) url
.openConnection();
httpUrlConn.setSSLSocketFactory(ssf);

httpUrlConn.setDoOutput(true);
httpUrlConn.setDoInput(true);
httpUrlConn.setUseCaches(false);
// 设置请求方式(GET/POST)
httpUrlConn.setRequestMethod(requestMethod);

if ("GET".equalsIgnoreCase(requestMethod)) {
httpUrlConn.connect();
}

// 当有数据需要提交时
if (null != outputStr) {
OutputStream outputStream = httpUrlConn.getOutputStream();
// 注意编码格式,防止中文乱码
outputStream.write(outputStr.getBytes("UTF-8"));
outputStream.close();
}

// 将返回的输入流转换成字符串
InputStream inputStream = httpUrlConn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(
inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(
inputStreamReader);

String str = null;
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
bufferedReader.close();
inputStreamReader.close();
// 释放资源
inputStream.close();
inputStream = null;
httpUrlConn.disconnect();
jsonObject = JSONObject.fromObject(buffer.toString());
} catch (ConnectException ce) {
log.error("server connection timed out.");
} catch (Exception e) {
log.error("https request error:", e);
}finally{
// 讲发送内容及结果写入数据库
// TODO
}
return jsonObject;
}

/**
* 将微信消息中的CreateTime转换成标准格式的时间(yyyy-MM-dd HH:mm:ss)
*
* @param createTime
*            消息创建时间
* @return String
*/
public static String formatTime(String createTime) {
// 将微信传入的CreateTime转换成long类型,再乘以1000
long msgCreateTime = Long.parseLong(createTime) * 1000L;
DateFormat fo
4000
rmat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return format.format(new Date(msgCreateTime));
}

public static String getOpenIdByHtmlToken(String code){
String openid = "ov5KSuHjtkGq2sMhVyC1s8mpJV-M";
if(StringUtils.isBlank(code)){
return openid;
}
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
String requestUrl = url.replace("APPID", ConstantWeChat.APPID).replace("SECRET", ConstantWeChat.APPSECRET).replace("CODE", code);
JSONObject rtnJson = httpsRequest(requestUrl, "POST", null);
if(rtnJson.get("errCode") == null){
openid = rtnJson.get("openid").toString();
return openid;
}else{
String errCode = rtnJson.get("errCode").toString();
String errmsg = rtnJson.get("errmsg").toString();
log.error("get openid error. errCode["+errCode+"], errmsg["+errmsg+"]");
return null;
}
}



二、利用花生壳在本地测试;

1、进入花生壳官网,http://hsk.oray.com/download/,下载花生壳最新版3.0;2.8稳定版会出各种问题,进行实名认证;实名认证后会赠送一个免费域名;

注册完成,实名认证后,选择中间的内网穿透;填写本地ip地址;然后点击自诊断,是否成功;



2、在微信公众号后台,配置网页授权域名;配置在花生壳获取的免费域名;如图

在接口权限列表中;点击网页授权后的修改按钮;







将红框中的txt文件下载后放在服务器项目根目录下;

完成。

就可以在微信手机客户端访问了。http://1e613198u2.51mypc.cn/winterCamp/list。


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐