yshop1.9.1,WxJava升级到3.6,微信公众号服务配置重构,修复后台配置公众号API端必须要重启才能生效的问题

This commit is contained in:
hupeng
2020-01-20 14:44:51 +08:00
parent 90b29e6b86
commit 97dbcde392
15 changed files with 182 additions and 521 deletions

View File

@ -1425,8 +1425,8 @@ public class YxStoreOrderServiceImpl extends BaseServiceImpl<YxStoreOrderMapper,
//使用MQ延时消息
mqProducer.sendMsg("yshop-topic",storeOrder.getId().toString());
log.info("投递延时订单id [{}]", storeOrder.getId());
//mqProducer.sendMsg("yshop-topic",storeOrder.getId().toString());
//log.info("投递延时订单id [{}]", storeOrder.getId());
return storeOrder;
}

View File

@ -29,6 +29,7 @@ import co.yixiang.modules.user.entity.YxWechatUser;
import co.yixiang.modules.user.service.YxUserService;
import co.yixiang.modules.user.service.YxWechatUserService;
import co.yixiang.modules.user.web.vo.YxUserQueryVo;
import co.yixiang.mp.config.WxMpConfiguration;
import co.yixiang.utils.OrderUtil;
import co.yixiang.utils.RedisUtil;
import co.yixiang.utils.RedisUtils;
@ -85,7 +86,6 @@ public class AuthController {
private final AuthenticationManagerBuilder authenticationManagerBuilder;
private final YxUserService userService;
private final PasswordEncoder passwordEncoder;
private final WxMpService wxService;
private final YxWechatUserService wechatUserService;
private final WxMaService wxMaService;
private final NotifyService notifyService;
@ -95,7 +95,7 @@ public class AuthController {
OnlineUserService onlineUserService, TokenProvider tokenProvider,
AuthenticationManagerBuilder authenticationManagerBuilder,
YxUserService userService, PasswordEncoder passwordEncoder,
WxMpService wxService, YxWechatUserService wechatUserService,
YxWechatUserService wechatUserService,
WxMaService wxMaService,NotifyService notifyService) {
this.properties = properties;
this.redisUtils = redisUtils;
@ -105,7 +105,6 @@ public class AuthController {
this.authenticationManagerBuilder = authenticationManagerBuilder;
this.userService = userService;
this.passwordEncoder = passwordEncoder;
this.wxService = wxService;
this.wechatUserService = wechatUserService;
this.wxMaService = wxMaService;
this.notifyService = notifyService;
@ -154,6 +153,11 @@ public class AuthController {
HttpServletRequest request) {
try {
String appId = RedisUtil.get("wechat_appid");
if(StrUtil.isBlank(appId)) {
return ApiResult.fail("请配置公众号");
}
WxMpService wxService = WxMpConfiguration.getWxMpService(appId);
WxMpOAuth2AccessToken wxMpOAuth2AccessToken = wxService.oauth2getAccessToken(code);
WxMpUser wxMpUser = wxService.oauth2getUserInfo(wxMpOAuth2AccessToken, null);
String openid = wxMpUser.getOpenId();

View File

@ -1,43 +1,29 @@
package co.yixiang.modules.wechat.web.controller;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import co.yixiang.annotation.AnonymousAccess;
import co.yixiang.common.api.ApiCode;
import co.yixiang.common.api.ApiResult;
import co.yixiang.common.web.controller.BaseController;
import co.yixiang.modules.order.entity.YxStoreOrder;
import co.yixiang.modules.order.service.YxStoreOrderService;
import co.yixiang.modules.order.web.vo.YxStoreOrderQueryVo;
import co.yixiang.modules.shop.service.YxSystemConfigService;
import co.yixiang.modules.user.entity.YxUser;
import co.yixiang.modules.user.entity.YxWechatUser;
import co.yixiang.modules.user.service.YxUserService;
import co.yixiang.modules.user.service.YxWechatUserService;
import co.yixiang.modules.user.web.vo.YxUserQueryVo;
import co.yixiang.utils.EncryptUtils;
import co.yixiang.utils.OrderUtil;
import co.yixiang.mp.config.WxMpConfiguration;
import co.yixiang.utils.RedisUtil;
import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyResult;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import com.vdurmont.emoji.EmojiParser;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpMessageRouter;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
import me.chanjar.weixin.mp.bean.result.WxMpUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
@ -45,7 +31,6 @@ import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
@ -60,12 +45,8 @@ import java.util.Map;
@Api(value = "微信模块", tags = "微信模块", description = "微信模块")
public class WechatController extends BaseController {
private final WxMpService wxService;
private final YxWechatUserService wechatUserService;
private final YxUserService userService;
private final WxPayService wxPayService;
private final YxStoreOrderService orderService;
private final WxMpMessageRouter messageRouter;
private final YxSystemConfigService systemConfigService;
@ -92,6 +73,9 @@ public class WechatController extends BaseController {
@GetMapping("/wechat/config")
@ApiOperation(value = "jssdk配置",notes = "jssdk配置")
public ApiResult<Object> jsConfig(@RequestParam(value = "url") String url) throws WxErrorException {
String appId = RedisUtil.get("wechat_appid");
if(StrUtil.isBlank(appId)) return ApiResult.fail("请配置公众号");
WxMpService wxService = WxMpConfiguration.getWxMpService(appId);
return ApiResult.ok(wxService.createJsapiSignature(url));
}
@ -165,6 +149,9 @@ public class WechatController extends BaseController {
@RequestParam(name = "nonce", required = false) String nonce,
@RequestParam(name = "echostr", required = false) String echostr){
String appId = RedisUtil.get("wechat_appid");
if(StrUtil.isBlank(appId)) return "请配置公众号";
WxMpService wxService = WxMpConfiguration.getWxMpService(appId);
if (wxService.checkSignature(timestamp, nonce, signature)) {
return echostr;
}
@ -186,6 +173,12 @@ public class WechatController extends BaseController {
HttpServletRequest request,
HttpServletResponse response) throws IOException {
String appId = RedisUtil.get("wechat_appid");
if(StrUtil.isBlank(appId)) {
log.error("请配置公众号!");
return;
}
WxMpService wxService = WxMpConfiguration.getWxMpService(appId);
if (!wxService.checkSignature(timestamp, nonce, signature)) {
throw new IllegalArgumentException("非法请求,可能属于伪造的请求!");
@ -195,14 +188,14 @@ public class WechatController extends BaseController {
if (encType == null) {
// 明文传输的消息
WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(requestBody);
WxMpXmlOutMessage outMessage = this.route(inMessage);
WxMpXmlOutMessage outMessage = this.route(inMessage,appId);
if(outMessage == null) return;
out = outMessage.toXml();;
} else if ("aes".equalsIgnoreCase(encType)) {
// aes加密的消息
WxMpXmlMessage inMessage = WxMpXmlMessage.fromEncryptedXml(requestBody, wxService.getWxMpConfigStorage(),
timestamp, nonce, msgSignature);
WxMpXmlOutMessage outMessage = this.route(inMessage);
WxMpXmlOutMessage outMessage = this.route(inMessage,appId);
if(outMessage == null) return;
out = outMessage.toEncryptedXml(wxService.getWxMpConfigStorage());
@ -214,9 +207,9 @@ public class WechatController extends BaseController {
writer.close();
}
private WxMpXmlOutMessage route(WxMpXmlMessage message) {
private WxMpXmlOutMessage route(WxMpXmlMessage message,String appId) {
try {
return this.messageRouter.route(message);
return WxMpConfiguration.getWxMpMessageRouter(appId).route(message);
} catch (Exception e) {
log.error("路由消息时出现异常!", e);
}