企业接⼊⾃有应⽤实现免登录
公司要将移动端审批流程接⼊企业,员⼯通过企业的⾃建审批应⽤就可以在端审批单据,要审批单据就先得让企业跟⽤户绑定起来,实现⽆感⾃动登录系统内。由于企业的员⼯已经被⼿动的从拉⼊企业内,这样就不可以通过企业的创建⼈员接⼝将⼈员推到内。只能在⽤户第⼀次登录审批系统的时候去获取⽤户ID(userId)并与审批系统的⼈员关联起来。绑定好后就可以实现⾃动登录。
员⼯点击应⽤后⾃动登录步骤如下:
1.拦截⽤户是否登录
在过滤器或者内检查⽤户是否登录,如果没有登录跳转到获取⽤户的⾝份信息
获取企业授权信息URL:
1open.weixin.qq/connect/oauth2/authorize?
appid=CORPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&agentid=AGENTID&state=STATE#we chat_redirec
页⾯跳转到企业后企业处理完成后,页⾯将重新跳转⾄ redirect_uri参数指定的回调地址并带上参数code=CODE&state=STATE,企业可根据code参数获得员⼯的userid。code长度最⼤为512字节。
1 2 3 4 5 6 7 8 9 10 11 12 13 14public static final String OAUTH_CODE_URL = "open.weixin.qq/connect/oauth2/authorize? appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_base&state=%s#wechat_redirect"; Integer serverPort = ServerPort();
String port = (null!= serverPort && serverPort == 80) ? "": ":"+ String();
String url = ""+ ServerName() // 服务器地址
+ port // 端⼝号
+ ContextPath(); // 项⽬名称
url = url + "/weixin/auth/weixinLogin/oauthLogin.html";
try{
url = de(url, "utf-8");
}catch(UnsupportedEncodingException e){
e.printStackTrace();
}
String weixinUrl = String.format(OAUTH_CODE_URL, "企业ID", url, "state"");
response.sendRedirect(weixinUrl);
2.获取⽤户信息并登录
回调接收到CODE值并⽤CODE去交换真实的⽤户信息,如果⽤户与系统绑定就表⽰登录成功,登录成功后将⽤户信息放⼊SESSION中。这样就可以实现⾃动登录审批系统了。
1 2 3 4 5 6 7 8 9 10 11 12
13 14 15 16 17/**
* 回调接⼝
* @return
*/
public String oauthLogin(){
try{
Map<String, Object> returnMap = UserInfo(code, Constants.APPROVAL); if(null!= returnMap){
//得到⽤户ID
String userid = String(returnMap, "UserId");
if(!StringUtil.isRealEmpty(userid)){
//⽤户与ID绑定实体
UserWx userWx = userWxManager.findByWXID(userid);
if(userWx != null){
if(StringUtil.Avatar())){
WxUser wxUser = WxUser(userid, Constants.APPROVAL);
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 WxUser wxUser = WxUser(userid, Constants.APPROVAL); if(null!= wxUser && !StringUtil.Avatar())){
// +64取⼩头像;+0取⼤头像
userWx.Avatar());
userWxManager.save(userWx);
}
}
//登录成功,将⽤户信息放⼊SESSION等后续操作
.......
return null;
}else{
//显⽰未绑定的逻辑
return customMethod("unbind");
}
}else{
return customMethod("error");
}
}else{
return customMethod("error");
}
}catch(Exception e){
return customMethod("error");
}
}
WeixinUtil的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.ConnectException;
import java.URL;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ssl.HttpsURLConnection;
import javax.ssl.SSLContext;
import javax.ssl.SSLSocketFactory;
import javax.ssl.TrustManager;
import llections.MapUtils;
import org.apachemons.logging.Log;
import org.apachemons.logging.LogFactory;
代码转换import com.alibaba.fastjson.JSON;
import cn.boxbank.WxUser;
public class WeixinUtil
{
private static Log log = Log(WeixinUtil.class);
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 private static Log log = Log(WeixinUtil.class);
/**
* 发起https请求并获取结果
*
* @param requestUrl 请求地址
* @param requestMethod 请求⽅式(GET、POST)
* @param outputStr 提交的数据
* @return JSONObject(通过(key)的⽅式获取json对象的属性值)
*/
public static Map<String, Object> HttpRequest(String requestUrl, String requestMethod, String outputStr) {
// ("发起https请求并获取结果 :"+requestUrl+","+requestMethod+","+outputStr);
Map<String, Object> map = new HashMap<String, Object>();
StringBuffer buffer = new StringBuffer();
try
{
// 创建SSLContext对象,并使⽤我们指定的信任管理器初始化
TrustManager[] tm = { new EwX509TrustManager() };
SSLContext sslContext = Instance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
// 从上述SSLContext对象中得到SSLSocketFactory对象
SSLSocketFactory ssf = SocketFactory();
URL url = new URL(requestUrl);
HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();
httpUrlConn.setSSLSocketFactory(ssf);
httpUrlConn.setDoOutput(true);
httpUrlConn.setDoInput(true);
httpUrlConn.setUseCaches(false);
httpUrlConn.setConnectTimeout(60 * 1000);
httpUrlConn.setReadTimeout(60 * 1000);
// 设置请求⽅式(GET/POST)
httpUrlConn.setRequestMethod(requestMethod);
// if ("GET".equalsIgnoreCase(requestMethod))
// 当有数据需要提交时
if(null!= outputStr)
{
OutputStream outputStream = OutputStream();
/
/ 注意编码格式,防⽌中⽂乱码
outputStream.Bytes("UTF-8"));
outputStream.close();
}
// 将返回的输⼊流转换成字符串
InputStream inputStream = InputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 while((str = adLine()) != null)
{
buffer.append(str);
}
bufferedReader.close();
inputStreamReader.close();
// 释放资源
inputStream.close();
inputStream = null;
httpUrlConn.disconnect();
// 返回map
// map = JsonUtil.String(), Map.class, String.class, Object.class);
map = (Map<String, Object>) JSON.String(), Map.class);
}
catch(ConnectException ce)
{
System.out.println("Connection ");
}
catch(Exception e)
{
String result = String.format("Https Request Error:%s", e);
System.out.println(result);
}
return map;
}
/**
* 根据code调接⼝获取USERID
*
* @param code
* @return
*/
public static Map<String, Object> getUserInfo(String code, String agentFlag)
{
String OAUTH_GETUSERINFO_URL = "qyapi.weixin.qq/cgi-bin/user/getuserinfo?
access_token=%s&code=%s";
String url = String.format(OAUTH_GETUSERINFO_URL, getAccessToken(agentFlag), code);
Map<String, Object> result = HttpRequest(url, "GET", null);
return result;
}
/**
* 从配置参数中获取
* @param agentFlag
* @return
*/
public static String getAccessToken(String agentFlag)
{
//这⾥是获取应⽤的ACCESS_TOKEN,可以将获取ACCESS_TOKEN放到定时线程内,每2个⼩时去重新获取⼀次。 //从数据库或者缓存中拿出应⽤的ACCESS_TOKEN
......
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 ......
}
/**
* 通过userid 从获取⽤户
*
* @param userid
* @return
*/
public static WxUser getWxUser(String userid, String agentFlag)
{
String GET_USER_URL = "qyapi.weixin.qq/cgi-bin/user/get?access_token=%s&userid=%s";
WxUser user = null;
String url = String.format(Constants.GET_USER_URL, getAccessToken(agentFlag), userid);
Map<String, Object> returnMap = HttpRequest(url, "GET", null);
int errcode = IntValue(returnMap, "errcode");
if(errcode == 0)
{
user = JavaObject((JSON) JSON(returnMap), WxUser.class);
}
return user;
}
/**
* 调⽤接⼝获取accessToken
*
* @param cropid 企业号ID
* @param cropsecret 企业号管理组对应的secret
* @return AccessToken
*/
public static void getAccessToken(String cropid, String cropsecret)
{
String ACCESS_TOKEN_URL = "qyapi.weixin.qq/cgi-bin/gettoken?corpid=%s&corpsecret=%s"; // 添加URL中的cropid和cropsecret的值
String url = String.format(ACCESS_TOKEN_URL, cropid, cropsecret);
// 根据url通过https请求获取accesstoken
Map<String, Object> returnMap = WeixinUtil.HttpRequest(url, "GET", null);
if(null!= returnMap && returnMap.size() > 0)
{
// access_token
String access_token = String(returnMap, "access_token");
// accessToken有效时间expires_in:7200秒
Integer expires_in = Integer(returnMap, "expires_in");
//可将取到的ACCESS_TOKEN存⼊数据库或者缓存中。每2个⼩时更新⼀次
........
}
else
{
log.info("accesstoken获取失败");
}
}
/**
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论