基于注解的实现获取微信openId1
最近在弄微信支付,网站有好几种不同类型的"商品",去每个支付的页面都需要获取用户的OpenId,而且获取openid要在微信的浏览器去发送请求,如果有三个不同类型的付款页面就需要写三个一样获取openid的方法,这为了以后如果网站需要在其他的地方获取openid,为了扩展所以lz想了一个办法 把获取微信openId的方法抽取成了用注解和spring mvc的拦截器来实现。废话不多说下面直接上代码。
1.获取微信openid 网页授权代码
这里就不详细说啦,可以参照点击打开链接微信开发文档,下面也会体现到网页授权
注解代码实现
package com.workit.handler;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
*
* @Title: WeiXinGetOpenId.java
* @Description: 获取openId注解,needGetOpenId 为true时调用获取openid
* @date 2017年5月9日 下午4:12:02
* @version V1.0
*/
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WeiXinGetOpenId {
/**
*
* @Title: needGetOpenId
* @Description: 是否需要获取OpenId。
* @param @return
* @return boolean
*/
boolean needGetOpenId() default false;
/**
*
* @Title: needGetUserInfo
* @Description: 是否需要获取用户信息。
* @param @return
* @return boolean
*/
boolean needGetUserInfo() default false;
/**
*
* @Title: scopeType
* @Description: 授权方式
* @param @return
* @return String
*/
String scopeType() default "snsapi_base";
}
spring mvc配置文件加入下代码
<mvc:interceptors>
<!-- 获取OpenId注解 -->
<mvc:interceptor>
<!-- <mvc:mapping path="/**"/>这个地方时你要拦截得路径 我这个意思是拦截所有得URL -->
<mvc:mapping path="/**/*"/>
<mvc:exclude-mapping path="/**/fonts/*"/>
<mvc:exclude-mapping path="/**/*.css"/>
<mvc:exclude-mapping path="/**/*.js"/>
<mvc:exclude-mapping path="/**/*.png"/>
<mvc:exclude-mapping path="/**/*.gif"/>
<mvc:exclude-mapping path="/**/*.jpg"/>
<mvc:exclude-mapping path="/**/*.jpeg"/>
<bean class="com.jkinvest.sme.web.handler.WeixinGetOpenIdHandlerInterceptor"/><!--class文件路径改成你自己写得拦截器路径!! -->
</mvc:interceptor>
</mvc:interceptors>
拦截器代码实现类
package com.workit.handler;
import java.net.URLEncoder;
import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.alibaba.fastjson.JSONObject;
import com.workit.comm.util.GlobalConstant;
import com.workit.comm.util.String.StringUtil;
import com.workit.comm.util.weixin.WeiXinConstant;
import com.workit.comm.util.weixin.WeiXinUtil;
/**
* @Title: WeixinGetOpenIdHandlerInterceptor.java
* @Description: TODO
* @date 2017年5月9日 上午10:56:45
* @version V1.0
*/
public class WeixinGetOpenIdHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
if (handler instanceof HandlerMethod) {
HandlerMethod method = (HandlerMethod) handler;
WeiXinGetOpenId annotation = method.getMethodAnnotation(WeiXinGetOpenId.class);
if(WeiXinUtil.checkWeiXinAgent(request)){
if (annotation != null) {
boolean needGetOpenId = annotation.needGetOpenId();
String scopeType= annotation.scopeType();
if (needGetOpenId) {
String url =request.getRequestURI();
String methodType = request.getMethod();
@SuppressWarnings("rawtypes")
Enumeration enu=request.getParameterNames();
JSONObject json = new JSONObject();
json.put("targetUrl",url);
json.put("submitMethodType",methodType);
while(enu.hasMoreElements()){
String paraName=(String)enu.nextElement();
json.put(paraName, request.getParameter(paraName));
}
//说明已经获取过OpenId
if(StringUtil.isNotEmpty(json.get("weiXinGetOpenIdFlag"))){
return true;
}else{
String jsonParams = json.toJSONString();
String returnUrl ="网站名字"+"/WeiXinCommGetOpenId.html?weixin_outh2_params="+jsonParams;
returnUrl=URLEncoder.encode(returnUrl,"UTF-8");
String scope =scopeType;
returnUrl = WeiXinConstant.WEIXIN_AUTH_URL.replace("APPID",GlobalConstant.SERVICE_APPID).replace("REDIRECT_URI", returnUrl).replace("SCOPE", scope);
response.sendRedirect(returnUrl);
return false;
}
}
}
}
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
}
}
获取OpenId的类
package com.workit.handler;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.workit.comm.util.weixin.WeiXinUtil;
/**
* @Title: WeiXinCommGetOpenId.java
* @Description: TODO
* @date 2017年5月9日 下午1:45:30
* @version V1.0
*/
@Controller
public class WeiXinCommGetOpenId {
private static final Logger logger = LoggerFactory.getLogger(WeiXinCommGetOpenId.class);
@RequestMapping("/WeiXinCommGetOpenId.html")
public void getWeiXinCommOpenId(HttpServletRequest request,HttpServletResponse response) throws IOException{
Map<String,Object> paramMap = new HashMap<String,Object>();
String postUrl ="";
try {
String code = request.getParameter("code");
String weixin_outh2_params = request.getParameter("weixin_outh2_params");
JSONObject json = new JSONObject(weixin_outh2_params);
String clickOpenId = WeiXinUtil.getUserInfoOpenId(code);
Iterator<?> it = json.keys();
postUrl = json.getString("targetUrl");
if(postUrl.contains("网站名字")){
postUrl = postUrl.replace("网站名字/","");
}
postUrl ="网站名字"+postUrl;
paramMap.put("weiXinOpenId", clickOpenId);
paramMap.put("weiXinGetOpenIdFlag","isTure");
while (it.hasNext()) {
String key = (String) it.next();
String value = json.getString(key);
paramMap.put(key, value);
}
} finally {
// TODO: handle finally clause
doReq(response, postUrl, paramMap);
}
}
/**
*
* @param response
* @param postUrl
* @param paramMap
* @throws IOException
*/
public static void doReq(HttpServletResponse response,String postUrl,Map<String, ?> paramMap) throws IOException {
logger.debug("go into doReq method");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String type =(String) paramMap.get("submitMethodType");
out.println("<form name='postSubmit' method='"+type+"' target='_blank' action='"+postUrl+"' >");
for (String key : paramMap.keySet()) {
out.println("<input type='hidden' name='"+key+"' value='" + paramMap.get(key)+ "'>");
}
out.println("</form>");
out.println("<script>");
out.println("document.postSubmit.submit()");
out.println("</script>");
logger.debug("======doReq =====");
}
}
使用只要在获取需要获取OPenID的方法前面加上注解
@WeiXinGetOpenId(needGetOpenId=true)
在方法里通过request.getParams("weiXinOpenId")
基于注解的实现获取微信openId1的更多相关文章
- Spring事务的介绍,以及基于注解@Transactional的声明式事务
前言 事务是一个非常重要的知识点,前面的文章已经有介绍了关于SpringAOP代理的实现过程:事务管理也是AOP的一个重要的功能. 事务的基本介绍 数据库事务特性: 原子性 一致性 隔离性 持久性 事 ...
- Spring7:基于注解的Spring MVC(下篇)
Model 上一篇文章<Spring6:基于注解的Spring MVC(上篇)>,讲了Spring MVC环境搭建.@RequestMapping以及参数绑定,这是Spring MVC中最 ...
- 基于注解的Spring AOP入门、增强Advice实例
这篇文章简单通过一个例子,介绍几种增强的基本配置,以方便spring框架初学者对aop的代码结构有个清楚的了解认识.首先,spring支持aop编程,支持aspectJ的语法格式来表示切入点,切面,增 ...
- Mybatis框架基于注解的方式,实对数据现增删改查
编写Mybatis代码,与spring不一样,不需要导入插件,只需导入架包即可: 在lib下 导入mybatis架包:mybatis-3.1.1.jarmysql驱动架包:mysql-connecto ...
- 基于注解的Spring AOP的配置和使用
摘要: 基于注解的Spring AOP的配置和使用 AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.可以通过预编译方式和运行期动态代理实现在不 ...
- springAOP实现基于注解的数据源动态切换
需求 代码实现读写数据库分离 武器 spring3.0以上版本 实现思路 1.继承org.springframework.jdbc.datasource.lookup.AbstractRoutingD ...
- springMVC 基于注解的controller
概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Spring 2.5 又为 Spring MVC 引入了注解驱动功能.现在你无须让 Controller 继承任何接口,无需在 ...
- hibernate基于注解的维护权反转:@OneToMany(mappedBy=)
背景说明:首先是SSH环境下,对象基于注解的方式映射到数据库: 昨天遇到一个比较纠结的问题,@OneToMany(mappedBy="xxx"), mappedBy属性有什么用,然 ...
- SpringMVC4 + Spring + MyBatis3 基于注解的最简配置
本文使用最新版本(4.1.5)的springmvc+spring+mybatis,采用最间的配置方式来进行搭建. 1. web.xml 我们知道springmvc是基于Servlet: Dispatc ...
随机推荐
- CenOS下载离线依赖包神器--yumdownloader
Blog:博客园 个人 本文只总结一些常用的用法,更详细的说明见man yumdownloader和 info yumdownloader. 概述 有时候所在服务器环境不能访问外网,yum安装会感到非 ...
- charles解决乱码
1.点击help ssl proxying ,install Charles Root Certificate 2.点击安装证书按钮 3:点击下一步按钮 4:选中将所有的证书都放入下列存储 点击浏览按 ...
- 关于moviepy打包报错AttributeError: module audio/video.fx.all has no attribute fadein、crop文章的纠错和抄袭
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 老猿前面有篇文章<moviepy应用pyin ...
- PyQt(Python+Qt)学习随笔:QSlider滑动条部件功能简介
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.概述 Designer输入部件中的Horizo ...
- Python中sort、sorted的cmp参数废弃之后使用__lt__支持复杂比较的方法
Python2.1以前的排序比较方法只提供一个cmp比较函数参数,没有__lt__等6个富比较方法, Python 2.1引入了富比较方法,Python3.4之后作废了cmp参数.相应地从Python ...
- kettle如何从cube抽数据
接触kettle已经还是有一段时间了,但是一直都使用简单的输入.输出(二维数据库to二维数据库).今天,突然接到一个需求,需要从多维数据库(CUBE)里面将数据抽取到二维数据库,我难住了,不知道该如何 ...
- CobaltStrike 生成office宏病毒进行钓鱼攻击
关于WORD宏: 在百度百科上有: 宏是一个批量处理程序命令,正确地运用它可以提高工作效率.微软的office软件允许用户自己编写,叫VBA的脚本来增加其灵活性,进一步扩充它的能力.如完打开word文 ...
- BlueCMS代码审计
BlueCMS版本号为:bluecms_v1.6_sp1 本地搭建环境后将源代码丢进seay源代码审计系统,开启本地web服务页面访问,大部分白盒+小部分黑盒审计 搭建好环境后第一步先检查是否有重装漏 ...
- Docker 命令自动补全?要的
前言 不知道这个小伙伴有多久没用过 Docker 了, 突然对我说 Docker 命令怎么发生变化了 docker run ... #变成了 docker container run ... 他说,本 ...
- 测试与发布( Alpha版本 )
THE BUG 团队 杨梓琦 温海源 李华 陈杰才 郑堡恩 钟明康 软件说明 本软件用MYSQL数据库保存所有的数据内容,因此可以通过查询数据库查询功能是否正常进行. 测试过程 在测试过程中,左右两张 ...