Oam-微信开放平台
This commit is contained in:
parent
74b0fbbb19
commit
2da94ee07a
@ -172,7 +172,7 @@ public interface Constants {
|
|||||||
/**
|
/**
|
||||||
* 超级管理员
|
* 超级管理员
|
||||||
*/
|
*/
|
||||||
String SUPER_ADMIN = "PuPu";
|
String SUPER_ADMIN = "Cpop";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 超级管理员
|
* 超级管理员
|
||||||
|
|||||||
@ -22,7 +22,7 @@ import java.io.Serializable;
|
|||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@Accessors(chain = true)
|
@Accessors(chain = true)
|
||||||
@Table(value = "pp_sys_config", onInsert = BaseInsertListener.class, onUpdate = BaseUpdateListener.class, mapperGenerateEnable = false)
|
@Table(value = "cp_sys_config", onInsert = BaseInsertListener.class, onUpdate = BaseUpdateListener.class, mapperGenerateEnable = false)
|
||||||
public class SysConfig extends BaseEntity implements Serializable {
|
public class SysConfig extends BaseEntity implements Serializable {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -52,7 +52,7 @@ public class OamStaffDetailsServiceImpl implements UserDetailsService {
|
|||||||
staffLoginInfo.setUserId(sysUser.getId());
|
staffLoginInfo.setUserId(sysUser.getId());
|
||||||
//员工
|
//员工
|
||||||
if (!staffLoginInfo.getUserName().equals(Constants.SUPER_ADMIN)) {
|
if (!staffLoginInfo.getUserName().equals(Constants.SUPER_ADMIN)) {
|
||||||
Row row = DbChain.table("pp_oam_staff")
|
Row row = DbChain.table("cp_oam_staff")
|
||||||
.select()
|
.select()
|
||||||
.where("user_id = ?", staffLoginInfo.getUserId())
|
.where("user_id = ?", staffLoginInfo.getUserId())
|
||||||
.one();
|
.one();
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@ -1,7 +1,7 @@
|
|||||||
# 项目相关配置
|
# 项目相关配置
|
||||||
cpop:
|
cpop:
|
||||||
# 名称
|
# 名称
|
||||||
name: PuPu-OAM
|
name: Cpop-Oam
|
||||||
# 版本
|
# 版本
|
||||||
version: 1.0.0
|
version: 1.0.0
|
||||||
#JWT
|
#JWT
|
||||||
|
|||||||
@ -0,0 +1,56 @@
|
|||||||
|
package com.cpop.oam.business.bo;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotBlank;
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author DB
|
||||||
|
* @createTime 2023/10/10 17:14
|
||||||
|
* @description
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@ApiModel(value = "OpenPlatformCommit上传代码对象")
|
||||||
|
public class WxOpenMaCodeCommitBo implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 授权方 appid
|
||||||
|
*/
|
||||||
|
@NotBlank(message = "授权方appid不能为空")
|
||||||
|
@ApiModelProperty(value = "授权方 appid",required = true)
|
||||||
|
private String authorizerAppid;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 代码库中的代码模板 ID
|
||||||
|
*/
|
||||||
|
@NotNull(message = "代码库中的代码模板ID不能为空")
|
||||||
|
@ApiModelProperty(value = "代码库中的代码模板 ID",required = true)
|
||||||
|
private Long templateId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 为了方便第三方平台的开发者引入 extAppid 的开发调试工作
|
||||||
|
*/
|
||||||
|
@NotBlank(message = "extJson不能为空")
|
||||||
|
@ApiModelProperty(value = "该参数则是用于控制ext.json配置文件的内容",required = true)
|
||||||
|
private String extJson;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 代码版本号,开发者可自定义
|
||||||
|
*/
|
||||||
|
@NotBlank(message = "代码版本号不能为空")
|
||||||
|
@ApiModelProperty(value = "代码版本号,开发者可自定义",required = true)
|
||||||
|
private String userVersion;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 代码描述,开发者可自定义
|
||||||
|
*/
|
||||||
|
@NotBlank(message = "代码描述不能为空")
|
||||||
|
@ApiModelProperty(value = "代码描述,开发者可自定义",required = true)
|
||||||
|
private String userDesc;
|
||||||
|
}
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
package com.cpop.oam.business.bo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author DB
|
||||||
|
* @createTime 2023/10/10 17:35
|
||||||
|
* @description
|
||||||
|
*/
|
||||||
|
public class WxOpenMaSubmitAuditBo {
|
||||||
|
}
|
||||||
@ -0,0 +1,35 @@
|
|||||||
|
package com.cpop.oam.business.bo;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotBlank;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author DB
|
||||||
|
* @createTime 2023/10/10 17:22
|
||||||
|
* @description
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
@ApiModel(value = "WxOpenMaTrialQrCodeBo生产二维码")
|
||||||
|
public class WxOpenMaTrialQrCodeBo implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 授权方 appid
|
||||||
|
*/
|
||||||
|
@NotBlank(message = "授权方appid不能为空")
|
||||||
|
@ApiModelProperty(value = "授权方 appid",required = true)
|
||||||
|
private String authorizerAppid;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 指定二维码扫码后直接进入指定页面并可同时带上参数
|
||||||
|
*/
|
||||||
|
@ApiModelProperty("指定二维码扫码后直接进入指定页面并可同时带上参数")
|
||||||
|
private String path;
|
||||||
|
}
|
||||||
@ -0,0 +1,534 @@
|
|||||||
|
package com.cpop.oam.business.controller;
|
||||||
|
|
||||||
|
import cn.binarywang.wx.miniapp.bean.WxMaAuditMediaUploadResult;
|
||||||
|
import com.cpop.common.utils.StringUtils;
|
||||||
|
import com.cpop.core.base.R;
|
||||||
|
import com.cpop.core.base.entity.PageDomain;
|
||||||
|
import com.cpop.core.base.exception.ServiceException;
|
||||||
|
import com.cpop.core.utils.sql.SqlUtils;
|
||||||
|
import com.cpop.oam.business.bo.WxOpenMaCodeCommitBo;
|
||||||
|
import com.cpop.oam.business.bo.WxOpenMaTrialQrCodeBo;
|
||||||
|
import com.cpop.sdk.framework.config.WxOpenProperties;
|
||||||
|
import com.cpop.sdk.framework.handler.WxOpenService;
|
||||||
|
import com.mybatisflex.core.paginate.Page;
|
||||||
|
import io.swagger.annotations.Api;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import me.chanjar.weixin.common.api.WxConsts;
|
||||||
|
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.message.WxOpenMaSubmitAuditMessage;
|
||||||
|
import me.chanjar.weixin.open.bean.message.WxOpenXmlMessage;
|
||||||
|
import me.chanjar.weixin.open.bean.result.*;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Base64;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author DB
|
||||||
|
* @createTime 2023/10/10 13:40
|
||||||
|
* @description 微信开放平台
|
||||||
|
*/
|
||||||
|
@RestController
|
||||||
|
@Api(tags = "微信开放平台模块")
|
||||||
|
@RequestMapping("/wxOpen")
|
||||||
|
public class WxOpenController {
|
||||||
|
|
||||||
|
private final Logger logger = LoggerFactory.getLogger(this.getClass());
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private WxOpenService wxOpenService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private WxOpenProperties properties;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @descriptions 第三方平台授权
|
||||||
|
* @author DB
|
||||||
|
* @date 2023/10/10 13:43
|
||||||
|
* @param requestBody 请求参数
|
||||||
|
* @param timestamp 时间戳
|
||||||
|
* @param nonce 随机串
|
||||||
|
* @param signature 签名
|
||||||
|
* @param encType 解密类型
|
||||||
|
* @param msgSignature 签名信息
|
||||||
|
* @return: java.lang.Object 返回
|
||||||
|
*/
|
||||||
|
@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) {
|
||||||
|
this.logger.error("wxOpen:receiveTicket", e);
|
||||||
|
}
|
||||||
|
return "success";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: 获取授权链接
|
||||||
|
* @return R<String>
|
||||||
|
* @Author DB
|
||||||
|
* @Date: 2023/6/14 21:47
|
||||||
|
*/
|
||||||
|
@ApiOperation("获取授权链接")
|
||||||
|
@GetMapping("/getAuthorizedLink")
|
||||||
|
public R<String> getAuthorizedLink() {
|
||||||
|
String preAuthUrl;
|
||||||
|
try {
|
||||||
|
preAuthUrl = wxOpenService.getWxOpenComponentService().getPreAuthUrl(properties.getRedirectUri());
|
||||||
|
} catch (WxErrorException e) {
|
||||||
|
throw new ServiceException(e.getMessage());
|
||||||
|
}
|
||||||
|
return R.ok(preAuthUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @descriptions 授权回调地址
|
||||||
|
* @author DB
|
||||||
|
* @date 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) {
|
||||||
|
logger.error("gotoPreAuthUrl", e);
|
||||||
|
throw new ServiceException(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @descriptions
|
||||||
|
* @author DB
|
||||||
|
* @date 2023/10/10 14:56
|
||||||
|
* @param requestBody 请求体
|
||||||
|
* @param appId appid
|
||||||
|
* @param signature 签名
|
||||||
|
* @param timestamp 时间戳
|
||||||
|
* @param nonce 随机串
|
||||||
|
* @param openid openId
|
||||||
|
* @param encType 加密类型
|
||||||
|
* @param msgSignature 加密信息
|
||||||
|
* @return: java.lang.Object
|
||||||
|
*/
|
||||||
|
@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) {
|
||||||
|
logger.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
|
||||||
|
* @return R<String>
|
||||||
|
* @Description: 小程序绑定开放平台
|
||||||
|
* @Author DB
|
||||||
|
* @Date: 2023/6/14 21:47
|
||||||
|
*/
|
||||||
|
@ApiOperation("小程序绑定开放平台")
|
||||||
|
@GetMapping("/bindOpenAccount/{appid}")
|
||||||
|
public R<Void> bindOpenAccount(@PathVariable String appid) {
|
||||||
|
try {
|
||||||
|
wxOpenService.getWxOpenComponentService().bindOpenAccount(appid, WxConsts.AppIdType.MINI_TYPE, properties.getOpenAppid());
|
||||||
|
} catch (WxErrorException e) {
|
||||||
|
throw new ServiceException(e.getMessage());
|
||||||
|
}
|
||||||
|
return R.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: 解除绑定开放平台帐号
|
||||||
|
* @param appid 绑定小程序appid
|
||||||
|
* @return R<String>
|
||||||
|
* @Author DB
|
||||||
|
* @Date: 2023/6/14 21:47
|
||||||
|
*/
|
||||||
|
@ApiOperation("解除绑定开放平台帐号")
|
||||||
|
@GetMapping("/unbindOpenAccount/{appid}")
|
||||||
|
public R<Void> unbindOpenAccount(@PathVariable String appid) {
|
||||||
|
try {
|
||||||
|
wxOpenService.getWxOpenComponentService().unbindOpenAccount(appid, WxConsts.AppIdType.MINI_TYPE, properties.getOpenAppid());
|
||||||
|
} catch (WxErrorException e) {
|
||||||
|
throw new ServiceException(e.getMessage());
|
||||||
|
}
|
||||||
|
return R.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return R<Page<Map<String, String>>>
|
||||||
|
* @Description: 获取授权小程序列表
|
||||||
|
* @author DB
|
||||||
|
* @Date: 2023/6/14 0014 17:00
|
||||||
|
*/
|
||||||
|
@ApiOperation("获取授权小程序列表")
|
||||||
|
@GetMapping("/getAuthorizerList")
|
||||||
|
public R<Page<Map<String, String>>> getAuthorizerList() {
|
||||||
|
try {
|
||||||
|
PageDomain pageDomain = SqlUtils.getInstance().getPageDomain();
|
||||||
|
WxOpenAuthorizerListResult authorizerList = wxOpenService.getWxOpenComponentService().getAuthorizerList(pageDomain.getPageNum(), pageDomain.getPageSize());
|
||||||
|
Page<Map<String, String>> page = Page.of(pageDomain.getPageNum(), pageDomain.getPageSize(), authorizerList.getTotalCount());
|
||||||
|
page.setRecords(authorizerList.getList());
|
||||||
|
return R.ok(page);
|
||||||
|
} catch (WxErrorException e) {
|
||||||
|
throw new ServiceException(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: 获取授权小程序详情
|
||||||
|
* @param authorizerAppid 授权小程序appid
|
||||||
|
* @return R<List<OpenPlatformAuthorizerListVo>>
|
||||||
|
* @author DB
|
||||||
|
* @Date: 2023/6/15 0015 16:38
|
||||||
|
*/
|
||||||
|
@ApiOperation("获取授权小程序详情")
|
||||||
|
@GetMapping("/getAuthorizerInfo/{authorizerAppid}")
|
||||||
|
public R<WxOpenAuthorizerInfoResult> getAuthorizerInfo(@PathVariable String authorizerAppid) {
|
||||||
|
try {
|
||||||
|
WxOpenAuthorizerInfoResult wxOpenAuthorizerInfoResult = wxOpenService.getWxOpenComponentService().getAuthorizerInfo(authorizerAppid);
|
||||||
|
return R.ok(wxOpenAuthorizerInfoResult);
|
||||||
|
} catch (WxErrorException e) {
|
||||||
|
throw new ServiceException(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: 上传代码并生成体验版
|
||||||
|
* @param bo 请求参数
|
||||||
|
* @return R<Void>
|
||||||
|
* @author DB
|
||||||
|
* @Date: 2023/6/16 0016 17:34
|
||||||
|
*/
|
||||||
|
@ApiOperation("上传代码并生成体验版")
|
||||||
|
@PostMapping("/commit")
|
||||||
|
public R<Void> commit(@RequestBody @Validated WxOpenMaCodeCommitBo bo) {
|
||||||
|
try {
|
||||||
|
wxOpenService.getWxOpenComponentService().getWxMaServiceByAppid(bo.getAuthorizerAppid())
|
||||||
|
.codeCommit(bo.getTemplateId(),bo.getUserVersion(),bo.getUserDesc(),bo.getExtJson());
|
||||||
|
} catch (WxErrorException e) {
|
||||||
|
throw new ServiceException(e.getMessage());
|
||||||
|
}
|
||||||
|
return R.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: 获取体验版二维码
|
||||||
|
* @param bo 请求参数
|
||||||
|
* @return R<JSONObject>
|
||||||
|
* @author DB
|
||||||
|
* @Date: 2023/6/16 0016 17:35
|
||||||
|
*/
|
||||||
|
@ApiOperation("获取体验版二维码")
|
||||||
|
@PostMapping("/getTrialQrCode")
|
||||||
|
public R<String> getTrialQrCode(@RequestBody WxOpenMaTrialQrCodeBo bo) {
|
||||||
|
try {
|
||||||
|
File testQrcode = wxOpenService.getWxOpenComponentService().getWxMaServiceByAppid(bo.getAuthorizerAppid())
|
||||||
|
.getTestQrcode(bo.getPath(), null);
|
||||||
|
FileInputStream inputFile = new FileInputStream(testQrcode);
|
||||||
|
BufferedImage bufferedImage = ImageIO.read(inputFile);
|
||||||
|
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||||
|
ImageIO.write(bufferedImage, "png", outputStream);
|
||||||
|
String trialQrCode = Base64.getEncoder().encodeToString(outputStream.toByteArray());
|
||||||
|
String head = "data:image/png;base64,";
|
||||||
|
return R.ok(head + trialQrCode);
|
||||||
|
} catch (IOException | WxErrorException e) {
|
||||||
|
throw new ServiceException(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: 提交代码审核
|
||||||
|
* @param message 微信小程序代码包提交审核(仅供第三方开发者代小程序调用
|
||||||
|
* @return R<Void>
|
||||||
|
* @author DB
|
||||||
|
* @Date: 2023/6/16 0016 17:34
|
||||||
|
*/
|
||||||
|
@ApiOperation("提交代码审核")
|
||||||
|
@PostMapping("/submitAudit/{authorizerAppid}")
|
||||||
|
public R<WxOpenMaSubmitAuditResult> submitAudit(@PathVariable String authorizerAppid ,@RequestBody WxOpenMaSubmitAuditMessage message) {
|
||||||
|
try {
|
||||||
|
WxOpenMaSubmitAuditResult wxOpenMaSubmitAuditResult = wxOpenService.getWxOpenComponentService().getWxMaServiceByAppid(authorizerAppid)
|
||||||
|
.submitAudit(message);
|
||||||
|
return R.ok(wxOpenMaSubmitAuditResult);
|
||||||
|
} catch (WxErrorException e) {
|
||||||
|
throw new ServiceException(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @descriptions 查询审核单状态
|
||||||
|
* @author DB
|
||||||
|
* @date 2023/10/10 17:41
|
||||||
|
* @param authorizerAppid 授权appid
|
||||||
|
* @param auditId 审核id
|
||||||
|
* @return: com.cpop.core.base.R<me.chanjar.weixin.open.bean.result.WxOpenMaQueryAuditResult>
|
||||||
|
*/
|
||||||
|
@ApiOperation("查询审核单状态")
|
||||||
|
@GetMapping("/getAuditStatus")
|
||||||
|
public R<WxOpenMaQueryAuditResult> getAuditStatus(@RequestParam("authorizerAppid") String authorizerAppid, @RequestParam("auditId") Long auditId) {
|
||||||
|
try {
|
||||||
|
WxOpenMaQueryAuditResult auditStatus = wxOpenService.getWxOpenComponentService().getWxMaServiceByAppid(authorizerAppid).getAuditStatus(auditId);
|
||||||
|
return R.ok(auditStatus);
|
||||||
|
} catch (WxErrorException e) {
|
||||||
|
throw new ServiceException(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: 撤回代码审核
|
||||||
|
* @return R<Void>
|
||||||
|
* @author DB
|
||||||
|
* @Date: 2023/6/16 0016 17:34
|
||||||
|
*/
|
||||||
|
@ApiOperation("撤回代码审核")
|
||||||
|
@PutMapping("/undoAudit/{authorizerAppid}")
|
||||||
|
public R<Void> getAuditStatus(@PathVariable String authorizerAppid) {
|
||||||
|
try {
|
||||||
|
wxOpenService.getWxOpenComponentService().getWxMaServiceByAppid(authorizerAppid).undoCodeAudit();
|
||||||
|
} catch (WxErrorException e) {
|
||||||
|
throw new ServiceException(e.getMessage());
|
||||||
|
}
|
||||||
|
return R.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: 发布已通过审核的小程序
|
||||||
|
* @return R<Void>
|
||||||
|
* @author DB
|
||||||
|
* @Date: 2023/6/16 0016 17:34
|
||||||
|
*/
|
||||||
|
@ApiOperation("发布已通过审核的小程序")
|
||||||
|
@PutMapping("/release/{authorizerAppid}")
|
||||||
|
public R<Void> release(@PathVariable String authorizerAppid) {
|
||||||
|
try {
|
||||||
|
wxOpenService.getWxOpenComponentService().getWxMaServiceByAppid(authorizerAppid).releaseAudited();
|
||||||
|
} catch (WxErrorException e) {
|
||||||
|
throw new ServiceException(e.getMessage());
|
||||||
|
}
|
||||||
|
return R.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: 撤回代码审核
|
||||||
|
* @return R<Void>
|
||||||
|
* @author DB
|
||||||
|
* @Date: 2023/6/16 0016 17:34
|
||||||
|
*/
|
||||||
|
@ApiOperation("小程序版本回退")
|
||||||
|
@PutMapping("/revertCodeRelease/{authorizerAppid}")
|
||||||
|
public R<Void> revertCodeRelease(@PathVariable String authorizerAppid) {
|
||||||
|
try {
|
||||||
|
wxOpenService.getWxOpenComponentService().getWxMaServiceByAppid(authorizerAppid).revertCodeRelease();
|
||||||
|
} catch (WxErrorException e) {
|
||||||
|
throw new ServiceException(e.getMessage());
|
||||||
|
}
|
||||||
|
return R.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: 加急代码审核
|
||||||
|
* @return R<Void>
|
||||||
|
* @author DB
|
||||||
|
* @Date: 2023/6/16 0016 17:34
|
||||||
|
*/
|
||||||
|
@ApiOperation("加急代码审核")
|
||||||
|
@PutMapping("/speedupCodeAudit")
|
||||||
|
public R<Void> speedupCodeAudit(@RequestParam("authorizerAppid") String authorizerAppid, @RequestParam("auditId") Long auditId) {
|
||||||
|
try {
|
||||||
|
wxOpenService.getWxOpenComponentService().getWxMaServiceByAppid(authorizerAppid).speedAudit(auditId);
|
||||||
|
} catch (WxErrorException e) {
|
||||||
|
throw new ServiceException(e.getMessage());
|
||||||
|
}
|
||||||
|
return R.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return R<OpenPlatformVersionInfoVo>
|
||||||
|
* @Description: 查询小程序版本信息
|
||||||
|
* @author DB
|
||||||
|
* @Date: 2023/6/16 0016 17:34
|
||||||
|
*/
|
||||||
|
@ApiOperation("查询小程序版本信息")
|
||||||
|
@GetMapping("/getVersionInfo/{authorizerAppid}")
|
||||||
|
public R<WxOpenVersioninfoResult> getVersionInfo(@PathVariable String authorizerAppid) {
|
||||||
|
try {
|
||||||
|
WxOpenVersioninfoResult versionInfo = wxOpenService.getWxOpenComponentService().getWxMaServiceByAppid(authorizerAppid).getVersionInfo();
|
||||||
|
return R.ok(versionInfo);
|
||||||
|
} catch (WxErrorException e) {
|
||||||
|
throw new ServiceException(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: 查询最新一次审核单状态
|
||||||
|
* @return R<Void>
|
||||||
|
* @author DB
|
||||||
|
* @Date: 2023/6/16 0016 17:34
|
||||||
|
*/
|
||||||
|
@ApiOperation("查询最新一次审核单状态")
|
||||||
|
@GetMapping("/getLatestAuditStatus/{authorizerAppid}")
|
||||||
|
public R<WxOpenMaQueryAuditResult> getLatestAuditStatus(@PathVariable String authorizerAppid) {
|
||||||
|
try {
|
||||||
|
WxOpenMaQueryAuditResult latestAuditStatus = wxOpenService.getWxOpenComponentService().getWxMaServiceByAppid(authorizerAppid).getLatestAuditStatus();
|
||||||
|
return R.ok(latestAuditStatus);
|
||||||
|
} catch (WxErrorException e) {
|
||||||
|
throw new ServiceException(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return R<OpenPlatformVersionInfoVo>
|
||||||
|
* @Description: 上传提审素材
|
||||||
|
* @author DB
|
||||||
|
* @Date: 2023/6/16 0016 17:34
|
||||||
|
*/
|
||||||
|
@ApiOperation("上传提审素材")
|
||||||
|
@PostMapping("/uploadMediaToCodeAudit/{authorizerAppid}")
|
||||||
|
public R<WxMaAuditMediaUploadResult> uploadMediaToCodeAudit(@RequestParam("file") File file, @PathVariable("authorizerAppid") String authorizerAppid) {
|
||||||
|
try {
|
||||||
|
WxMaAuditMediaUploadResult wxMaAuditMediaUploadResult = wxOpenService.getWxOpenComponentService().getWxMaServiceByAppid(authorizerAppid).uploadMedia(file);
|
||||||
|
return R.ok(wxMaAuditMediaUploadResult);
|
||||||
|
} catch (WxErrorException e) {
|
||||||
|
throw new ServiceException(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @descriptions 获取模板列表
|
||||||
|
* @author DB
|
||||||
|
* @date 2023/10/10 18:17
|
||||||
|
* @param templateType 模板类型
|
||||||
|
* @return: com.cpop.core.base.R<java.util.List<me.chanjar.weixin.open.bean.WxOpenMaCodeTemplate>>
|
||||||
|
*/
|
||||||
|
@ApiOperation("获取模板列表")
|
||||||
|
@GetMapping("/getTemplateList")
|
||||||
|
public R<List<WxOpenMaCodeTemplate>> getTemplateList(@RequestParam("templateType")Integer templateType) {
|
||||||
|
try {
|
||||||
|
List<WxOpenMaCodeTemplate> templateList = wxOpenService.getWxOpenComponentService().getTemplateList(templateType);
|
||||||
|
return R.ok(templateList);
|
||||||
|
} catch (WxErrorException e) {
|
||||||
|
throw new ServiceException(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: 获取草稿箱列表
|
||||||
|
* @return R<Void>
|
||||||
|
* @author DB
|
||||||
|
* @Date: 2023/6/16 0016 17:34
|
||||||
|
*/
|
||||||
|
@ApiOperation("获取草稿箱列表")
|
||||||
|
@GetMapping("/getTemplateDraftList")
|
||||||
|
public R<List<WxOpenMaCodeTemplate>> getTemplateDraftList() {
|
||||||
|
try {
|
||||||
|
List<WxOpenMaCodeTemplate> templateDraftList = wxOpenService.getWxOpenComponentService().getTemplateDraftList();
|
||||||
|
return R.ok(templateDraftList);
|
||||||
|
} catch (WxErrorException e) {
|
||||||
|
throw new ServiceException(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @descriptions 将草稿添加到模板库
|
||||||
|
* @author DB
|
||||||
|
* @date 2023/10/10 18:16
|
||||||
|
* @param draftId 草稿id
|
||||||
|
* @param templateType 模板类型
|
||||||
|
* @return: com.cpop.core.base.R<java.lang.Void>
|
||||||
|
*/
|
||||||
|
@ApiOperation("将草稿添加到模板库")
|
||||||
|
@PostMapping("/addToTemplate")
|
||||||
|
public R<Void> addToTemplate(@RequestParam("draftId") Long draftId, @RequestParam("templateType") Integer templateType) {
|
||||||
|
try {
|
||||||
|
wxOpenService.getWxOpenComponentService().addToTemplate(draftId, templateType);
|
||||||
|
} catch (WxErrorException e) {
|
||||||
|
throw new ServiceException(e.getMessage());
|
||||||
|
}
|
||||||
|
return R.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: 删除代码模板
|
||||||
|
* @param templateId 模板id
|
||||||
|
* @return R<Void>
|
||||||
|
* @author DB
|
||||||
|
* @Date: 2023/6/27 0027 14:28
|
||||||
|
*/
|
||||||
|
@ApiOperation("删除代码模板")
|
||||||
|
@DeleteMapping("/deleteTemplate/{templateId}")
|
||||||
|
public R<Void> deleteTemplate(@PathVariable Integer templateId) {
|
||||||
|
try {
|
||||||
|
wxOpenService.getWxOpenComponentService().deleteTemplate(templateId);
|
||||||
|
} catch (WxErrorException e) {
|
||||||
|
throw new ServiceException(e.getMessage());
|
||||||
|
}
|
||||||
|
return R.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -18,6 +18,11 @@
|
|||||||
<groupId>com.cpop</groupId>
|
<groupId>com.cpop</groupId>
|
||||||
<artifactId>Cpop-Core</artifactId>
|
<artifactId>Cpop-Core</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<!--微信开放平台-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.binarywang</groupId>
|
||||||
|
<artifactId>weixin-java-open</artifactId>
|
||||||
|
</dependency>
|
||||||
<!--微信小程序-->
|
<!--微信小程序-->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.github.binarywang</groupId>
|
<groupId>com.github.binarywang</groupId>
|
||||||
|
|||||||
@ -0,0 +1,95 @@
|
|||||||
|
package com.cpop.sdk.framework.config;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.builder.ToStringBuilder;
|
||||||
|
import org.apache.commons.lang3.builder.ToStringStyle;
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author DB
|
||||||
|
* @createTime 2023/10/10 11:13
|
||||||
|
* @description
|
||||||
|
*/
|
||||||
|
@ConfigurationProperties(prefix = "wx.open")
|
||||||
|
public class WxOpenProperties {
|
||||||
|
|
||||||
|
private String openAppid;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置微信三方平台的appid
|
||||||
|
*/
|
||||||
|
private String componentAppId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置微信三方平台的app secret
|
||||||
|
*/
|
||||||
|
private String componentSecret;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置微信三方平台的token
|
||||||
|
*/
|
||||||
|
private String componentToken;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置微信三方平台的EncodingAESKey
|
||||||
|
*/
|
||||||
|
private String componentAesKey;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取跳转页面URL
|
||||||
|
*/
|
||||||
|
private String redirectUri;
|
||||||
|
|
||||||
|
public String getOpenAppid() {
|
||||||
|
return openAppid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOpenAppid(String openAppid) {
|
||||||
|
this.openAppid = openAppid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getComponentAppId() {
|
||||||
|
return componentAppId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setComponentAppId(String componentAppId) {
|
||||||
|
this.componentAppId = componentAppId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getComponentSecret() {
|
||||||
|
return componentSecret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setComponentSecret(String componentSecret) {
|
||||||
|
this.componentSecret = componentSecret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getComponentToken() {
|
||||||
|
return componentToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setComponentToken(String componentToken) {
|
||||||
|
this.componentToken = componentToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getComponentAesKey() {
|
||||||
|
return componentAesKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setComponentAesKey(String componentAesKey) {
|
||||||
|
this.componentAesKey = componentAesKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRedirectUri() {
|
||||||
|
return redirectUri;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRedirectUri(String redirectUri) {
|
||||||
|
this.redirectUri = redirectUri;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return ToStringBuilder.reflectionToString(this,
|
||||||
|
ToStringStyle.MULTI_LINE_STYLE);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,53 @@
|
|||||||
|
package com.cpop.sdk.framework.handler;
|
||||||
|
|
||||||
|
import com.cpop.sdk.framework.config.WxOpenProperties;
|
||||||
|
import me.chanjar.weixin.open.api.impl.WxOpenInRedisTemplateConfigStorage;
|
||||||
|
import me.chanjar.weixin.open.api.impl.WxOpenMessageRouter;
|
||||||
|
import me.chanjar.weixin.open.api.impl.WxOpenServiceImpl;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||||
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import javax.annotation.PostConstruct;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author DB
|
||||||
|
* @createTime 2023/10/10 11:29
|
||||||
|
* @description
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
@EnableConfigurationProperties({WxOpenProperties.class})
|
||||||
|
public class WxOpenService extends WxOpenServiceImpl {
|
||||||
|
|
||||||
|
private final Logger logger = LoggerFactory.getLogger(getClass());
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private WxOpenProperties wxOpenProperties;
|
||||||
|
|
||||||
|
private WxOpenMessageRouter wxOpenMessageRouter;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private StringRedisTemplate stringRedisTemplate;
|
||||||
|
|
||||||
|
@PostConstruct
|
||||||
|
public void init() {
|
||||||
|
WxOpenInRedisTemplateConfigStorage inRedisConfigStorage = new WxOpenInRedisTemplateConfigStorage(stringRedisTemplate, "Cpop:sdk:wxOpen:");
|
||||||
|
inRedisConfigStorage.setComponentAppId(wxOpenProperties.getComponentAppId());
|
||||||
|
inRedisConfigStorage.setComponentAppSecret(wxOpenProperties.getComponentSecret());
|
||||||
|
inRedisConfigStorage.setComponentToken(wxOpenProperties.getComponentToken());
|
||||||
|
inRedisConfigStorage.setComponentAesKey(wxOpenProperties.getComponentAesKey());
|
||||||
|
setWxOpenConfigStorage(inRedisConfigStorage);
|
||||||
|
wxOpenMessageRouter = new WxOpenMessageRouter(this);
|
||||||
|
wxOpenMessageRouter.rule().handler((wxMpXmlMessage, map, wxMpService, wxSessionManager) -> {
|
||||||
|
logger.info("\n接收到 {} 公众号请求消息,内容:{}", wxMpService.getWxMpConfigStorage().getAppId(), wxMpXmlMessage);
|
||||||
|
return null;
|
||||||
|
}).next();
|
||||||
|
}
|
||||||
|
|
||||||
|
public WxOpenMessageRouter getWxOpenMessageRouter(){
|
||||||
|
return wxOpenMessageRouter;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -8,15 +8,23 @@ qCloud:
|
|||||||
|
|
||||||
#微信SDK
|
#微信SDK
|
||||||
wx:
|
wx:
|
||||||
|
#开放平台
|
||||||
|
open:
|
||||||
|
openAppid: wx6e07ba6606e912a5
|
||||||
|
componentAppId: wx1efbf67f8637d7d1
|
||||||
|
componentSecret: fc2e9457aaa32342751cc655b5a1d273
|
||||||
|
componentToken: jambox
|
||||||
|
componentAesKey: 1a3NBxmCFwkCJvfoQ7WhJHB6iX3qHPsc9JbaDznE1i0
|
||||||
|
redirectUri: https://empower.oamapi.cpopsz.com/test/openPlatform/thirdPartyPlatform/redirectUrl
|
||||||
#小程序
|
#小程序
|
||||||
miniapp:
|
miniapp:
|
||||||
configs:
|
configs:
|
||||||
#\u5FAE\u4FE1\u5C0F\u7A0B\u5E8F\u7684appid
|
#appid
|
||||||
- appid: wx1eb0e5fb7dac3c05
|
- appid: wx1eb0e5fb7dac3c05
|
||||||
#\u5FAE\u4FE1\u5C0F\u7A0B\u5E8F\u7684Secret
|
#Secret
|
||||||
secret: f274d2ca01cc58cb5387379356c005c1
|
secret: f274d2ca01cc58cb5387379356c005c1
|
||||||
#\u5FAE\u4FE1\u5C0F\u7A0B\u5E8F\u6D88\u606F\u670D\u52A1\u5668\u914D\u7F6E\u7684token
|
#
|
||||||
token:
|
token:
|
||||||
#\u5FAE\u4FE1\u5C0F\u7A0B\u5E8F\u6D88\u606F\u670D\u52A1\u5668\u914D\u7F6E\u7684EncodingAESKey
|
#
|
||||||
aesKey:
|
aesKey:
|
||||||
msgDataFormat: JSON
|
msgDataFormat: JSON
|
||||||
|
|||||||
6
pom.xml
6
pom.xml
@ -150,6 +150,12 @@
|
|||||||
<artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
|
<artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
|
||||||
<version>${knife4j.version}</version>
|
<version>${knife4j.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<!--微信开放平台-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.binarywang</groupId>
|
||||||
|
<artifactId>weixin-java-open</artifactId>
|
||||||
|
<version>${wechat-java.version}</version>
|
||||||
|
</dependency>
|
||||||
<!--微信小程序-->
|
<!--微信小程序-->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.github.binarywang</groupId>
|
<groupId>com.github.binarywang</groupId>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user