开放平台回调
This commit is contained in:
parent
edc54ea5e3
commit
faac66c57e
@ -4,7 +4,7 @@ cpop:
|
|||||||
profile: /root/Cpop-Oam/upload
|
profile: /root/Cpop-Oam/upload
|
||||||
jwt:
|
jwt:
|
||||||
#白名单
|
#白名单
|
||||||
white-list: /profile/**,/backstage/login,/doc.html,/webjars/**,/favicon.ico,/v3/api-docs/**,/swagger-ui.html,/swagger-ui/**,/sysCommon/miniSyncBrandAndStore,/easyLearn/callback/*/*,/easyLearn/*,/mini/cardTemplate/*,/website/**,/backstage/wxCp/*,/callback/wxCp/*/registerCode,/callback/easyLearn/**,/cloudCallback/*,/mini/summit/*
|
white-list: /profile/**,/backstage/login,/doc.html,/webjars/**,/favicon.ico,/v3/api-docs/**,/swagger-ui.html,/swagger-ui/**,/callback/wxOpen/*
|
||||||
#拦截
|
#拦截
|
||||||
gateway:
|
gateway:
|
||||||
rsa-keypair:
|
rsa-keypair:
|
||||||
|
|||||||
@ -183,7 +183,7 @@ wx:
|
|||||||
component-token: jambox
|
component-token: jambox
|
||||||
component-aes-key: 1a3NBxmCFwkCJvfoQ7WhJHB6iX3qHPsc9JbaDznE1i0
|
component-aes-key: 1a3NBxmCFwkCJvfoQ7WhJHB6iX3qHPsc9JbaDznE1i0
|
||||||
#授权链接
|
#授权链接
|
||||||
authorized-link: https://jamboxtest.cpopsz.com/Jambox-System/callback/wxOpen/authorization
|
authorized-link: https://oamtest.cpopsz.com/Cpop-Oam/callback/wxOpen/authorization
|
||||||
redis:
|
redis:
|
||||||
host: gz-crs-lv77ii2t.sql.tencentcdb.com
|
host: gz-crs-lv77ii2t.sql.tencentcdb.com
|
||||||
port: 27714
|
port: 27714
|
||||||
|
|||||||
@ -5,7 +5,6 @@ import com.cpop.core.base.entity.PageDomain;
|
|||||||
import com.cpop.core.base.entity.R;
|
import com.cpop.core.base.entity.R;
|
||||||
import com.cpop.core.base.exception.ServiceException;
|
import com.cpop.core.base.exception.ServiceException;
|
||||||
import com.cpop.core.utils.SqlUtils;
|
import com.cpop.core.utils.SqlUtils;
|
||||||
import com.cpop.core.utils.StringUtils;
|
|
||||||
import com.cpop.oam.business.bo.WxOpenAddToTemplateBo;
|
import com.cpop.oam.business.bo.WxOpenAddToTemplateBo;
|
||||||
import com.cpop.oam.business.bo.WxOpenMaCodeCommitBo;
|
import com.cpop.oam.business.bo.WxOpenMaCodeCommitBo;
|
||||||
import com.cpop.oam.business.bo.WxOpenMaTrialQrCodeBo;
|
import com.cpop.oam.business.bo.WxOpenMaTrialQrCodeBo;
|
||||||
@ -18,14 +17,10 @@ import io.swagger.v3.oas.annotations.tags.Tag;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import me.chanjar.weixin.common.api.WxConsts;
|
import me.chanjar.weixin.common.api.WxConsts;
|
||||||
import me.chanjar.weixin.common.error.WxErrorException;
|
import me.chanjar.weixin.common.error.WxErrorException;
|
||||||
import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage;
|
|
||||||
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
|
|
||||||
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
|
|
||||||
import me.chanjar.weixin.open.bean.WxOpenMaCodeTemplate;
|
import me.chanjar.weixin.open.bean.WxOpenMaCodeTemplate;
|
||||||
import me.chanjar.weixin.open.bean.ma.WxMaOpenCommitExtInfo;
|
import me.chanjar.weixin.open.bean.ma.WxMaOpenCommitExtInfo;
|
||||||
import me.chanjar.weixin.open.bean.ma.WxMaOpenCommitStandardExt;
|
import me.chanjar.weixin.open.bean.ma.WxMaOpenCommitStandardExt;
|
||||||
import me.chanjar.weixin.open.bean.message.WxOpenMaSubmitAuditMessage;
|
import me.chanjar.weixin.open.bean.message.WxOpenMaSubmitAuditMessage;
|
||||||
import me.chanjar.weixin.open.bean.message.WxOpenXmlMessage;
|
|
||||||
import me.chanjar.weixin.open.bean.result.*;
|
import me.chanjar.weixin.open.bean.result.*;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
@ -59,35 +54,6 @@ public class BackstageWxOpenController {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private WxOpenMiniService wxOpenMiniService;
|
private WxOpenMiniService wxOpenMiniService;
|
||||||
|
|
||||||
/**
|
|
||||||
* 第三方平台授权
|
|
||||||
* @author DB
|
|
||||||
* @since 2023/10/10 13:43
|
|
||||||
* @param requestBody 请求参数
|
|
||||||
* @param timestamp 时间戳
|
|
||||||
* @param nonce 随机串
|
|
||||||
* @param signature 签名
|
|
||||||
* @param encType 解密类型
|
|
||||||
* @param msgSignature 签名信息
|
|
||||||
*/
|
|
||||||
@RequestMapping("/receiveTicket")
|
|
||||||
public Object receiveTicket(@RequestBody(required = false) String requestBody, @RequestParam("timestamp") String timestamp,
|
|
||||||
@RequestParam("nonce") String nonce, @RequestParam("signature") String signature,
|
|
||||||
@RequestParam(name = "encrypt_type", required = false) String encType,
|
|
||||||
@RequestParam(name = "msg_signature", required = false) String msgSignature) {
|
|
||||||
if (!StringUtils.equalsIgnoreCase("aes", encType) || !wxOpenService.getWxOpenComponentService().checkSignature(timestamp, nonce, signature)) {
|
|
||||||
throw new ServiceException("非法请求,可能属于伪造的请求!");
|
|
||||||
}
|
|
||||||
// aes加密的消息
|
|
||||||
WxOpenXmlMessage inMessage = WxOpenXmlMessage.fromEncryptedXml(requestBody, wxOpenService.getWxOpenConfigStorage(), timestamp, nonce, msgSignature);
|
|
||||||
try {
|
|
||||||
wxOpenService.getWxOpenComponentService().route(inMessage);
|
|
||||||
} catch (WxErrorException e) {
|
|
||||||
log.error("wxOpen:receiveTicket", e);
|
|
||||||
}
|
|
||||||
return "success";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取授权链接
|
* 获取授权链接
|
||||||
* @return R<String>
|
* @return R<String>
|
||||||
@ -101,83 +67,7 @@ public class BackstageWxOpenController {
|
|||||||
return R.ok(preAuthUrl);
|
return R.ok(preAuthUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 授权回调地址
|
|
||||||
* @author DB
|
|
||||||
* @since 2023/10/10 15:49
|
|
||||||
* @param authorizationCode 授权码
|
|
||||||
* @return me.chanjar.weixin.open.bean.result.WxOpenQueryAuthResult
|
|
||||||
*/
|
|
||||||
@GetMapping("/redirectUrl")
|
|
||||||
@ResponseBody
|
|
||||||
public WxOpenQueryAuthResult redirectUrl(@RequestParam("auth_code") String authorizationCode) {
|
|
||||||
try {
|
|
||||||
return wxOpenService.getWxOpenComponentService().getQueryAuth(authorizationCode);
|
|
||||||
} catch (WxErrorException e) {
|
|
||||||
log.error("gotoPreAuthUrl", e);
|
|
||||||
throw new ServiceException(e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author DB
|
|
||||||
* @since 2023/10/10 14:56
|
|
||||||
* @param requestBody 请求体
|
|
||||||
* @param appId appid
|
|
||||||
* @param signature 签名
|
|
||||||
* @param timestamp 时间戳
|
|
||||||
* @param nonce 随机串
|
|
||||||
* @param openid openId
|
|
||||||
* @param encType 加密类型
|
|
||||||
* @param msgSignature 加密信息
|
|
||||||
*/
|
|
||||||
@RequestMapping("/{appId}/callback")
|
|
||||||
public Object callback(@RequestBody(required = false) String requestBody,
|
|
||||||
@PathVariable("appId") String appId,
|
|
||||||
@RequestParam("signature") String signature,
|
|
||||||
@RequestParam("timestamp") String timestamp,
|
|
||||||
@RequestParam("nonce") String nonce,
|
|
||||||
@RequestParam("openid") String openid,
|
|
||||||
@RequestParam("encrypt_type") String encType,
|
|
||||||
@RequestParam("msg_signature") String msgSignature) {
|
|
||||||
if (!StringUtils.equalsIgnoreCase("aes", encType) || !wxOpenService.getWxOpenComponentService().checkSignature(timestamp, nonce, signature)) {
|
|
||||||
throw new ServiceException("非法请求,可能属于伪造的请求!");
|
|
||||||
}
|
|
||||||
String out = "";
|
|
||||||
// aes加密的消息
|
|
||||||
WxMpXmlMessage inMessage = WxOpenXmlMessage.fromEncryptedMpXml(requestBody, wxOpenService.getWxOpenConfigStorage(), timestamp, nonce, msgSignature);
|
|
||||||
// 全网发布测试用例
|
|
||||||
if (StringUtils.equalsAnyIgnoreCase(appId, "wxd101a85aa106f53e", "wx570bc396a51b8ff8")) {
|
|
||||||
try {
|
|
||||||
if (StringUtils.equals(inMessage.getMsgType(), "text")) {
|
|
||||||
if (StringUtils.equals(inMessage.getContent(), "TESTCOMPONENT_MSG_TYPE_TEXT")) {
|
|
||||||
out = WxOpenXmlMessage.wxMpOutXmlMessageToEncryptedXml(
|
|
||||||
WxMpXmlOutMessage.TEXT().content("TESTCOMPONENT_MSG_TYPE_TEXT_callback")
|
|
||||||
.fromUser(inMessage.getToUser())
|
|
||||||
.toUser(inMessage.getFromUser())
|
|
||||||
.build(),
|
|
||||||
wxOpenService.getWxOpenConfigStorage()
|
|
||||||
);
|
|
||||||
} else if (StringUtils.startsWith(inMessage.getContent(), "QUERY_AUTH_CODE:")) {
|
|
||||||
String msg = inMessage.getContent().replace("QUERY_AUTH_CODE:", "") + "_from_api";
|
|
||||||
WxMpKefuMessage kefuMessage = WxMpKefuMessage.TEXT().content(msg).toUser(inMessage.getFromUser()).build();
|
|
||||||
wxOpenService.getWxOpenComponentService().getWxMpServiceByAppid(appId).getKefuService().sendKefuMessage(kefuMessage);
|
|
||||||
}
|
|
||||||
} else if (StringUtils.equals(inMessage.getMsgType(), "event")) {
|
|
||||||
WxMpKefuMessage kefuMessage = WxMpKefuMessage.TEXT().content(inMessage.getEvent() + "from_callback").toUser(inMessage.getFromUser()).build();
|
|
||||||
wxOpenService.getWxOpenComponentService().getWxMpServiceByAppid(appId).getKefuService().sendKefuMessage(kefuMessage);
|
|
||||||
}
|
|
||||||
} catch (WxErrorException e) {
|
|
||||||
log.error("callback", e);
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
WxMpXmlOutMessage outMessage = wxOpenService.getWxOpenMessageRouter().route(inMessage, appId);
|
|
||||||
if(outMessage != null){
|
|
||||||
out = WxOpenXmlMessage.wxMpOutXmlMessageToEncryptedXml(outMessage, wxOpenService.getWxOpenConfigStorage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param appid 绑定小程序appid
|
* @param appid 绑定小程序appid
|
||||||
@ -318,7 +208,6 @@ public class BackstageWxOpenController {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 提交代码审核
|
* 提交代码审核
|
||||||
* @param message 微信小程序代码包提交审核(仅供第三方开发者代小程序调用
|
|
||||||
* @return R<Void>
|
* @return R<Void>
|
||||||
* @author DB
|
* @author DB
|
||||||
* @since 2023/6/16 0016 17:34
|
* @since 2023/6/16 0016 17:34
|
||||||
|
|||||||
@ -0,0 +1,144 @@
|
|||||||
|
package com.cpop.oam.business.controller.callback;
|
||||||
|
|
||||||
|
import com.cpop.core.base.entity.R;
|
||||||
|
import com.cpop.core.base.exception.ServiceException;
|
||||||
|
import com.cpop.core.utils.StringUtils;
|
||||||
|
import com.cpop.oam.framework.handler.wxOpen.WxOpenHandler;
|
||||||
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import me.chanjar.weixin.common.error.WxErrorException;
|
||||||
|
import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage;
|
||||||
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
|
||||||
|
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
|
||||||
|
import me.chanjar.weixin.open.api.WxOpenComponentService;
|
||||||
|
import me.chanjar.weixin.open.api.WxOpenConfigStorage;
|
||||||
|
import me.chanjar.weixin.open.bean.auth.WxOpenAuthorizationInfo;
|
||||||
|
import me.chanjar.weixin.open.bean.message.WxOpenXmlMessage;
|
||||||
|
import me.chanjar.weixin.open.bean.result.WxOpenQueryAuthResult;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author DB
|
||||||
|
* @version 1.0.0
|
||||||
|
* @since 2024-05-08 18:29
|
||||||
|
*/
|
||||||
|
@RestController
|
||||||
|
@Tag(name = "微信开放平台模块")
|
||||||
|
@RequestMapping("/callback/wxOpen")
|
||||||
|
@Slf4j
|
||||||
|
public class CallbackWxOpenController {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private WxOpenHandler wxOpenService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 第三方平台授权
|
||||||
|
* @author DB
|
||||||
|
* @since 2023/10/10 13:43
|
||||||
|
* @param requestBody 请求参数
|
||||||
|
* @param timestamp 时间戳
|
||||||
|
* @param nonce 随机串
|
||||||
|
* @param signature 签名
|
||||||
|
* @param encType 解密类型
|
||||||
|
* @param msgSignature 签名信息
|
||||||
|
*/
|
||||||
|
@RequestMapping("/receiveTicket")
|
||||||
|
public Object receiveTicket(@RequestBody(required = false) String requestBody, @RequestParam("timestamp") String timestamp,
|
||||||
|
@RequestParam("nonce") String nonce, @RequestParam("signature") String signature,
|
||||||
|
@RequestParam(name = "encrypt_type", required = false) String encType,
|
||||||
|
@RequestParam(name = "msg_signature", required = false) String msgSignature) {
|
||||||
|
if (!StringUtils.equalsIgnoreCase("aes", encType) || !wxOpenService.getWxOpenComponentService().checkSignature(timestamp, nonce, signature)) {
|
||||||
|
throw new ServiceException("非法请求,可能属于伪造的请求!");
|
||||||
|
}
|
||||||
|
// aes加密的消息
|
||||||
|
WxOpenXmlMessage inMessage = WxOpenXmlMessage.fromEncryptedXml(requestBody, wxOpenService.getWxOpenConfigStorage(), timestamp, nonce, msgSignature);
|
||||||
|
try {
|
||||||
|
wxOpenService.getWxOpenComponentService().route(inMessage);
|
||||||
|
} catch (WxErrorException e) {
|
||||||
|
log.error("wxOpen:receiveTicket", e);
|
||||||
|
}
|
||||||
|
return "success";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 公众号或小程序授权回调
|
||||||
|
* @param authCode 授权码
|
||||||
|
* @return R<List<OpenPlatformAuthorizerListVo>>
|
||||||
|
* @author DB
|
||||||
|
* @since 2023/6/14 0014 17:00
|
||||||
|
*/
|
||||||
|
@Operation(summary = "公众号或小程序授权回调")
|
||||||
|
@GetMapping("/authorization")
|
||||||
|
public R<Void> authorization(@RequestParam(value = "auth_code") String authCode) throws WxErrorException {
|
||||||
|
WxOpenComponentService wxOpenComponentService = wxOpenService.getWxOpenComponentService();
|
||||||
|
//换取信息
|
||||||
|
WxOpenQueryAuthResult queryAuth = wxOpenComponentService.getQueryAuth(authCode);
|
||||||
|
WxOpenAuthorizationInfo authorizationInfo = queryAuth.getAuthorizationInfo();
|
||||||
|
//存入缓存
|
||||||
|
WxOpenConfigStorage wxOpenConfigStorage = wxOpenService.getWxOpenConfigStorage();
|
||||||
|
wxOpenConfigStorage.setAuthorizerRefreshToken(authorizationInfo.getAuthorizerAppid(), authorizationInfo.getAuthorizerRefreshToken());
|
||||||
|
return R.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author DB
|
||||||
|
* @since 2023/10/10 14:56
|
||||||
|
* @param requestBody 请求体
|
||||||
|
* @param appId appid
|
||||||
|
* @param signature 签名
|
||||||
|
* @param timestamp 时间戳
|
||||||
|
* @param nonce 随机串
|
||||||
|
* @param openid openId
|
||||||
|
* @param encType 加密类型
|
||||||
|
* @param msgSignature 加密信息
|
||||||
|
*/
|
||||||
|
@RequestMapping("/{appId}/callback")
|
||||||
|
public Object callback(@RequestBody(required = false) String requestBody,
|
||||||
|
@PathVariable("appId") String appId,
|
||||||
|
@RequestParam("signature") String signature,
|
||||||
|
@RequestParam("timestamp") String timestamp,
|
||||||
|
@RequestParam("nonce") String nonce,
|
||||||
|
@RequestParam("openid") String openid,
|
||||||
|
@RequestParam("encrypt_type") String encType,
|
||||||
|
@RequestParam("msg_signature") String msgSignature) {
|
||||||
|
if (!StringUtils.equalsIgnoreCase("aes", encType) || !wxOpenService.getWxOpenComponentService().checkSignature(timestamp, nonce, signature)) {
|
||||||
|
throw new ServiceException("非法请求,可能属于伪造的请求!");
|
||||||
|
}
|
||||||
|
String out = "";
|
||||||
|
// aes加密的消息
|
||||||
|
WxMpXmlMessage inMessage = WxOpenXmlMessage.fromEncryptedMpXml(requestBody, wxOpenService.getWxOpenConfigStorage(), timestamp, nonce, msgSignature);
|
||||||
|
// 全网发布测试用例
|
||||||
|
if (StringUtils.equalsAnyIgnoreCase(appId, "wxd101a85aa106f53e", "wx570bc396a51b8ff8")) {
|
||||||
|
try {
|
||||||
|
if (StringUtils.equals(inMessage.getMsgType(), "text")) {
|
||||||
|
if (StringUtils.equals(inMessage.getContent(), "TESTCOMPONENT_MSG_TYPE_TEXT")) {
|
||||||
|
out = WxOpenXmlMessage.wxMpOutXmlMessageToEncryptedXml(
|
||||||
|
WxMpXmlOutMessage.TEXT().content("TESTCOMPONENT_MSG_TYPE_TEXT_callback")
|
||||||
|
.fromUser(inMessage.getToUser())
|
||||||
|
.toUser(inMessage.getFromUser())
|
||||||
|
.build(),
|
||||||
|
wxOpenService.getWxOpenConfigStorage()
|
||||||
|
);
|
||||||
|
} else if (StringUtils.startsWith(inMessage.getContent(), "QUERY_AUTH_CODE:")) {
|
||||||
|
String msg = inMessage.getContent().replace("QUERY_AUTH_CODE:", "") + "_from_api";
|
||||||
|
WxMpKefuMessage kefuMessage = WxMpKefuMessage.TEXT().content(msg).toUser(inMessage.getFromUser()).build();
|
||||||
|
wxOpenService.getWxOpenComponentService().getWxMpServiceByAppid(appId).getKefuService().sendKefuMessage(kefuMessage);
|
||||||
|
}
|
||||||
|
} else if (StringUtils.equals(inMessage.getMsgType(), "event")) {
|
||||||
|
WxMpKefuMessage kefuMessage = WxMpKefuMessage.TEXT().content(inMessage.getEvent() + "from_callback").toUser(inMessage.getFromUser()).build();
|
||||||
|
wxOpenService.getWxOpenComponentService().getWxMpServiceByAppid(appId).getKefuService().sendKefuMessage(kefuMessage);
|
||||||
|
}
|
||||||
|
} catch (WxErrorException e) {
|
||||||
|
log.error("callback", e);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
WxMpXmlOutMessage outMessage = wxOpenService.getWxOpenMessageRouter().route(inMessage, appId);
|
||||||
|
if(outMessage != null){
|
||||||
|
out = WxOpenXmlMessage.wxMpOutXmlMessageToEncryptedXml(outMessage, wxOpenService.getWxOpenConfigStorage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user