You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
bsdgy-server/src/main/java/com/kiisoo/ic/wx/controller/WxAccessController.java

367 lines
13 KiB
Java

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package com.kiisoo.ic.wx.controller;
import com.kiisoo.ic.common.BaseController;
import com.kiisoo.ic.common.utils.SignUtils;
import com.kiisoo.ic.common.utils.WeixinApi;
import com.kiisoo.ic.employee.entity.QrCodeDO;
import com.kiisoo.ic.employee.entity.QrCodeVO;
//import com.kiisoo.ic.employee.service.QrCodeService;
import com.kiisoo.ic.employee.service.QrCodeService;
import com.kiisoo.ic.wx.entity.ContactWayDTO;
import com.kiisoo.ic.wx.service.WxAccessService;
import com.kiisoo.ic.wx.service.WxLoginService;
import com.kiisoo.ic.wx.service.WxResponseService;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.cp.api.WxCpService;
import me.chanjar.weixin.cp.api.impl.WxCpServiceImpl;
import me.chanjar.weixin.cp.bean.WxCpOauth2UserInfo;
import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 企业微信认证登录
*
* @author yechenhao
* @date 2020/03/11 15:32
*/
@Slf4j
@Controller
@RequestMapping("/qy")
public class WxAccessController extends BaseController {
@Autowired
private WxAccessService wxAccessService;
@Autowired
private WxLoginService loginService;
@Autowired
private WxResponseService wxResponseService;
@Autowired
private QrCodeService qrCodeService;
private String loginPageUrl = "http://localhost:8311/kiisoo-ic-ui";
private String baseUrl = "http://jdxdev.vipgz4.idcfengye.com/kiisoo-ic";
/**
* 获取微信权限验证
*
* @param url 页面路径
* @return 微信认证的url和ticket
* @author dexiang.jiang
* @date 2020/03/11 15:44
*/
@RequestMapping(value = "/wechat/oauth", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> getWxSign(@RequestParam("url") String url) {
try {
WxCpDefaultConfigImpl config = new WxCpDefaultConfigImpl();
String ticket = config.getJsapiTicket();
Map<String, Object> map = SignUtils.sign(ticket, url);
return data(map);
} catch (Exception e) {
log.error("by get wxSign qy weixin oauth error ", e);
return fail();
}
}
/**
* 通过微信接口获取codeID并跳转接口
*
* @param response 响应
*/
@RequestMapping(value = "/wechat/register", method = RequestMethod.GET)
@ResponseBody
public void registerSmall(HttpServletResponse response) {
try {
WxCpService wxCpService = new WxCpServiceImpl();
String url = wxCpService.getOauth2Service().buildAuthorizationUrl(baseUrl + "/qy/qywx/oauth", "111999");
response.sendRedirect(url);
} catch (Exception e) {
log.error("Exception", e);
}
}
/**
* 通过codeID从微信接口获取openID手机绑定
*/
@RequestMapping(value = "/qywx/oauth", method = RequestMethod.GET)
@ResponseBody
public void wechat(HttpServletRequest request, HttpServletResponse response) {
String code = request.getParameter("code");
// 先获取OPENID
try {
WxCpService wxCpService = new WxCpServiceImpl();
//TODO 企业微信认证登录url订单详情项目
WxCpOauth2UserInfo res = wxCpService.getOauth2Service().getUserInfo(code);
String userId = res.getUserId();
//根据企业微信id找到相关账号密码
Map<String, String> loginInfo = loginService.getLoginInfoByQywxUserId(userId);
String redirectUri;
if (loginInfo == null || StringUtils.isBlank(loginInfo.get("login")) || StringUtils.isBlank(loginInfo.get("password"))) {
redirectUri = loginPageUrl + "/login?relition=false&qywxUserId=" + userId;
} else {
String login = loginInfo.get("login");
String password = loginInfo.get("password");
redirectUri = loginPageUrl + "/login?relition=true&login=" + login + "&password=" + password + "&qywxUserId=" + userId;
}
response.sendRedirect(redirectUri);
} catch (Exception e) {
log.error("微信验证失败", e);
}
}
/**
* 登录账号
*
* @param login 用户名
* @param password 密码
* @return 成功/失败
*/
@RequestMapping(value = "/account", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> loginAccount(@RequestParam("login") String login, @RequestParam("password") String password,
@RequestParam(value = "isMD5", required = false, defaultValue = "false") Boolean isMD5) {
try {
Map<String, Object> resultMap = new HashMap<>();
// LoginBean loginBean = loginService.login(login, password, isMD5);
// resultMap.put("code", loginBean.getLoginInfo().get("code"));
// resultMap.put("results", loginBean);
// resultMap.put("success", Boolean.TRUE);
return resultMap;
} catch (Exception e) {
log.error("登录失败", e);
return fail();
}
}
/**
* 登录账号
*
* @param login 用户名
* @param password 密码
* @param qywxUserId 企业微信账号
* @return 成功/失败
*/
@RequestMapping(value = "/account/bind", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> loginAccountBind(@RequestParam("login") String login, @RequestParam("password") String password,
@RequestParam("qywxUserId") String qywxUserId) {
try {
Map<String, Object> resultMap = new HashMap<>();
// LoginBean loginBean = loginService.login(login, password, false);
// resultMap.put("code", loginBean.getLoginInfo().get("code"));
// if (LoginEnum.LOGIN_SUCCEED.getCode().equals(loginBean.getLoginInfo().get("code"))) {
// loginService.bindQywxUserIdByUserId(loginBean.getUserId(), qywxUserId);
// }
// resultMap.put("results", loginBean);
// resultMap.put("success", Boolean.TRUE);
return resultMap;
} catch (Exception e) {
log.error("登录失败", e);
return fail();
}
}
/**
* 解析企业微信返回的数据
*
* @param request 回调的请求
* @param signature 消息体签名
* @param timestamp 时间戳
* @param nonce 随机数字串
* @return
* @throws Exception
*/
@RequestMapping(value = "/contact/handle", produces = {"application/xml;charset=UTF-8"})
@ResponseBody
public Object handlerMessage(HttpServletRequest request, @RequestParam(name = "msg_signature") String signature,
String timestamp, String nonce) throws Exception {
try {
//将数据输入转为String
request.setCharacterEncoding("UTF-8");
StringBuilder builder = new StringBuilder();
ServletInputStream input = request.getInputStream();
int len = 0;
byte[] buffer = new byte[1024];
while (-1 != (len = input.read(buffer))) {
builder.append(new String(buffer, 0, len, "UTF-8"));
}
//解析并获取返回
String response = wxResponseService.contactHandleParse(signature, timestamp, nonce, builder.toString());
return response;
} catch (Exception e) {
log.error("企业微信微信回调数据解析失败", e);
return null;
}
}
/**
* 企业微信外部联系人变更回调事件
*
* @param request 回调的请求
* @param signature 消息体签名
* @param timestamp 时间戳
* @param nonce 随机数字串
* @return 返回响应
* @author dexiang.jiang
* @date 2020/03/11 15:44
*/
@RequestMapping(value = "/customer/handle", produces = {"application/xml;charset=UTF-8"})
@ResponseBody
public String customerHandle(HttpServletRequest request, @RequestParam(name = "msg_signature") String signature,
String timestamp, String nonce) {
try {
//将数据输入转为String
request.setCharacterEncoding("UTF-8");
StringBuilder builder = new StringBuilder();
ServletInputStream input = request.getInputStream();
int len = 0;
byte[] buffer = new byte[1024];
while (-1 != (len = input.read(buffer))) {
builder.append(new String(buffer, 0, len, "UTF-8"));
}
//解析并获取返回
String sEchoStr = wxResponseService.customerParse(signature, timestamp, nonce, builder.toString());
// 验证URL成功将sEchoStr返回
System.out.println(sEchoStr);
return sEchoStr;
} catch (Exception e) {
//验证URL失败错误原因请查看异常
e.printStackTrace();
}
return null;
}
/**
* 企业微信-客户列表
*
* @param userid 企业内部客户ID
* @return 列表集合
* @author dexiang.jiang
* @date 2020/03/19 15:44
*/
@RequestMapping(value = "/externalcontact/list", method = RequestMethod.GET)
@ResponseBody
public String externalContact(@RequestParam("userid") String userid) {
try {
String res = WeixinApi.getExternalContact(userid);
return res;
} catch (Exception e) {
//验证URL失败错误原因请查看异常
e.printStackTrace();
}
return null;
}
/**
* 企业微信-客户列表
*
* @param configId 配置ID
* @return 列表集合
* @author dexiang.jiang
* @date 2020/03/19 15:44
*/
@RequestMapping(value = "/externalcontact/contactway", method = RequestMethod.GET)
@ResponseBody
public String contactway(@RequestParam("configId") String configId) {
try {
String res = WeixinApi.getContactWay(configId);
return res;
} catch (Exception e) {
//验证URL失败错误原因请查看异常
e.printStackTrace();
}
return null;
}
/**
* 企业微信-添加联系方式
*
* @return 列表集合
* @author dexiang.jiang
* @date 2020/03/19 15:44
*/
@RequestMapping(value = "/externalcontact/add/contactway", method = RequestMethod.GET)
@ResponseBody
public QrCodeVO addContactway() {
try {
QrCodeDO contactWayDTO = new QrCodeDO();
contactWayDTO.setType(1);
contactWayDTO.setScene(2);
contactWayDTO.setScene(2);
String[] data = new String[1];
data[0] = ("JiangDeXiang");
contactWayDTO.setUser(data);
// contactWayDTO.setState("D1");
contactWayDTO.setState("D2");
QrCodeVO res = qrCodeService.getQrCode(contactWayDTO);
System.out.println(res);
return null;
} catch (Exception e) {
//验证URL失败错误原因请查看异常
e.printStackTrace();
}
return null;
}
/**
* 解析企业微信返回的数据
* @param request 回调的请求
* @param signature 消息体签名
* @param timestamp 时间戳
* @param nonce 随机数字串
* @return
* @throws Exception
*/
@RequestMapping(value = "/res",produces = {"application/xml;charset=UTF-8"})
@ResponseBody
public Object handlerMessageTo(HttpServletRequest request, @RequestParam(name = "msg_signature") String signature,
String timestamp, String nonce) throws Exception {
try {
//将数据输入转为String
request.setCharacterEncoding("UTF-8");
StringBuilder builder = new StringBuilder();
ServletInputStream input = request.getInputStream();
int len = 0;
byte[] buffer = new byte[1024];
while(-1!=(len=input.read(buffer)))
{
builder.append(new String(buffer,0,len,"UTF-8"));
}
//解析并获取返回
String response = wxResponseService.parse(signature, timestamp, nonce, builder.toString());
return response;
}catch (Exception e){
log.error("企业微信微信回调数据解析失败",e);
return null;
}
}
}