闲话少叙,项目需要引入两个spring依赖。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</dependency>
添加一个新的注解
package com.abc.action.apph5;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.stereotype.Component;
/**
* 检查用户是否需要订阅
* @author Administrator
*
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface WeixinSubscription {
}
增加一个切面的执行类。
package com.abc.action.apph5;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import com.abc.constant.UserConstant;
import com.abc.entity.template.users.CompanyUsers;
import com.abc.entity.template.users.ConnectUsersKey;
import com.abc.service.template.comm.ConfigService;
import com.abc.service.template.comm.WeixinCacheAccessTokenService;
import com.abc.service.template.users.ConnectUsersService;
import com.abc.util.HttpsUnit;
import com.abc.util.PropertyUtils;
import com.alibaba.fastjson.JSONObject;
@Aspect
public class WeiXinSubscriptionAspect {
@Autowired
ConfigService configService;
@Autowired
WeixinCacheAccessTokenService weixinCacheAccessTokenService;
@Autowired
ConnectUsersService connectUsersService;
static String wx_userinfo_api_url="https://api.weixin.qq.com/cgi-bin/user/info?access_token=%s&openid=%s&lang=zh_CN";
Logger logger = LogManager.getLogger(WeiXinSubscriptionAspect.class);
@Pointcut("@annotation(com.abc.action.apph5.WeixinSubscription)")
public void Subscription() throws Exception {};
@Around("Subscription()")
public String process(ProceedingJoinPoint jp) throws Throwable{
Object[] args = jp.getArgs();
for(Object obj:args) {
if(obj instanceof HttpServletRequest) {
CompanyUsers user = (CompanyUsers)((HttpServletRequest)obj).getSession().getAttribute(UserConstant.WX_USER);
String stringByKey = configService.getStringByKey("IsNeedPublicAccount", user.getCompanyid());
if("1".equals(stringByKey)) {
if(!IsSubscription(user.getCompanyid(),user.getUserid())) {
return "redirect:" + PropertyUtils.getValue("acexe_ym_apph5_path")+"/h5/Guide.jhtml";
}
}
}
}
return (String)jp.proceed();//此方法调用目标方法。
}
private Boolean IsSubscription(Long companyid,Long userid) throws Exception{
String access_token = weixinCacheAccessTokenService.GetAuthorizerAccesstoken(companyid);
if(access_token.equals("")) {
throw new Exception("CacheAccessToken is not found");
}
// 获取用户的openid
ConnectUsersKey connectUsersKey = connectUsersService.getConnectId(userid, companyid, 30);
String apiurl = String.format(wx_userinfo_api_url, access_token, connectUsersKey.getConnectid());
// 请求用户信息
String retString = HttpsUnit.SendHttpsPOST(apiurl, null, null);
JSONObject parse = JSONObject.parseObject(retString);
logger.info(String.format("拉取到的用户信息【公司:%d】【用户ID:%d】:%s",companyid,userid, parse));
if(parse.containsKey("subscribe") && parse.getInteger("subscribe")==1) {
return true;
}
return false;
}
}
在applicationContext.xml文件中增加切面的注入。
<!-- 切面注入 -->
<aop:aspectj-autoproxy />
<bean class="com.abc.action.wx.WeiXinSubscriptionAspect"/>
在代码中使用注解。
@WeixinSubscription()
@RequestMapping("/Money.jhtml")
public String buygivemoney(HttpServletRequest request, HttpServletResponse response, ModelMap modelmap,
@RequestParam("q") String packcode) throws Exception {}