sring boot项目集成企业微信第三方应用

本文介绍了如何集成企业微信第三方应用,包括创建第三方应用的步骤,详细讲解了项目接口开发过程,如回调接口、服务方法的实现,以及企业微信的签名认证。此外,还提到了使用Redis进行数据缓存、设置可信域名和二维码生成的配置细节。

集成企业微信第三方应用前,开发者应当浏览企业微信开发者官方文档。开发者文档
首先企业微信服务商需要身份认证,才能创建第三方应用

1.创建第三方应用

1)点击服务商管理后台扫码登录
2)选择 应用管理–网页应用–配置基础信息,这些可以先随便填写,创建完成应用后还可以修改配置基础信息
配置应用权限
配置开发信息

2.项目接口开发

1)回调接口

@Api(tags = "企业微信回调")
@RestController
@RequestMapping("/callback/weCom")
public class WeComCallbackController {
   
   

    @Autowired
    IWeComService weComService;

    @Value("${domain}")
    private String domain;

    @ApiOperation("企业微信服务器配置地址,用于验证启用 应用管理-回调配置-数据回调URL")
    @GetMapping(value = "/msg")
    @ResponseBody
    public String weComMsgVerify(HttpServletRequest request) {
   
   
        String signature = request.getParameter("msg_signature");// 微信加密签名
        String timestamp = request.getParameter("timestamp");// 时间戳
        String nonce = request.getParameter("nonce");// 随机数
        String echostr = request.getParameter("echostr");// 随机字符串

        // 确认此次GET请求来自企业微信服务器,原样返回echostr参数内容
        return weComService.weComVerify(signature, timestamp, nonce, echostr);
    }

    @ApiOperation("企业微信服务器配置地址,用于验证启用 应用管理-回调配置-指令回调URL")
    @GetMapping(value = "/command")
    @ResponseBody
    public String weComCommandVerify(HttpServletRequest request) {
   
   
        String signature = request.getParameter("msg_signature");// 微信加密签名
        String timestamp = request.getParameter("timestamp");// 时间戳
        String nonce = request.getParameter("nonce");// 随机数
        String echostr = request.getParameter("echostr");// 随机字符串

        // 确认此次GET请求来自企业微信服务器,原样返回echostr参数内容
        return weComService.weComVerify(signature, timestamp, nonce, echostr);
    }

    @ApiOperation("企业微信,指令回调(刷新ticket)")
    @PostMapping(value = "/command")
    @ResponseBody
    public String weComCommand(HttpServletRequest request) throws Exception {
   
   
        String signature = request.getParameter("msg_signature");// 微信加密签名
        String timestamp = request.getParameter("timestamp");// 时间戳
        String nonce = request.getParameter("nonce");// 随机数
        ServletInputStream in = request.getInputStream();
        String success = weComService.weComCommand(signature, timestamp, nonce, in);
        return success;
    }

    @ApiOperation("企业微信授权")
    @GetMapping("/oauth")
    @ResponseBody
    public void oauth(HttpServletRequest request, HttpServletResponse response) throws Exception {
   
   
        String code = request.getParameter("code");
        String state = request.getParameter("state"); //state是自己添加的参数,可以根据场景自定义
        OauthDto oauthDto = weComService.oauth(code, state);
        String authCorpId = oauthDto.getAuthCorpId();
        String openUserId = oauthDto.getOpenUserId();
        String timestamp = System.currentTimeMillis() + "";
        String signature = SignatureUtil.getSignature(authCorpId + "_" + openUserId + "_" + timestamp, timestamp);
        //实际登录地址,或者根据场景做跳转
        String loginUrl;
        if (state.equals("weCom-web")){
   
   
            loginUrl = domain + "/wecom/web/weCom/autoLogin?authCorpId=";
        }else {
   
   
            loginUrl = domain + "/wecom/app/weCom/autoLogin?authCorpId=";
        }
        response.sendRedirect(loginUrl + authCorpId + "&openUserId=" + openUserId + "&timestamp=" + timestamp + "&signature=" + signature);
    }
}

2)service方法

public interface IWeComService {
   
   

    /**
     * 获取第三方应用凭证
     */
    AccessTokenDto getSuiteAccessToken(String suiteTicket);

    String weComVerify(String msgSignature, String timeStamp, String nonce, String echoStr);

    String weComCommand(String msgSignature, String timeStamp, String nonce, InputStream in);

    String weComDecryptMsg(String msgSignature, String timeStamp, String nonce, String postData, ReceiveDto receive);

    OauthDto oauth(String code, String state);

    /**
     * 获取授权用户基本信息
     */
    String getWeComUserInfo(String code, String suiteAccessToken);

    /**
     * 获取授权凭证
     */
    String getAccessToken(String authCorpId);
}

3)service实现

@Slf4j
@Service
public class WeComServiceImpl implements IWeComService {
   
   

    @Autowired
    @Qualifier("restTemplate")
    private RestTemplate restTemplate;

    @Value("${weCom.corpId}")
    private String corpId;
    @Value("${weCom.suite.suiteId}")
    private String suiteId;
    @Value("${weCom.suite.secret}")
    private String suiteSecret;
    @Value("${weCom.suite.token}")
    
<think>我们正在参考引用[1]和引用[2]的内容,这些引用提供了企业微信第三方应用开发的Java Demo源码和开发指南。用户的问题是如何开发或集成企业微信第三方应用,特别是询问开发指南和集成方法。 根据引用[1]: - 项目是使用Spring BootJava企业微信第三方应用Demo。 - 需要Redis用于缓存suite_ticket(也可以配置为使用JSON文件存储)。 - 需要MySQL数据库,创建名为`qywx_third_demo`的数据库,并会自动创建两张表(通过JPA Hibernate的ddl-auto设置)。 - 配置回调URL。 根据引用[2]: - 我们需要正确响应微信服务的调用,微信会通过配置的两个URL(回调URL和指令回调URL)进行传参调用。 - 需要使用TOKEN、ENCODING_AES_KEY、CORP_ID(在服务商信息中可以找到)来生成加解密的接口实例,然后解析微信发送的请求。 因此,我们将按照以下步骤来回答: 1. **环境准备**:包括开发环境、数据库、缓存等。 2. **项目配置**:如何配置回调URL、加解密参数等。 3. **核心流程**:处理回调事件,如suite_ticket、授权事件等。 4. **集成方法**:如何将第三方应用集成企业微信。 下面开始详细说明:</think>### 企业微信第三方应用开发指南与集成方法 参考引用资料[1][2],以下是基于Java的Spring Boot实现方案,完整流程如下: --- #### 一、开发环境准备 1. **基础依赖** ```xml <!-- pom.xml 核心依赖 --> <dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-cp</artifactId> <version>4.5.0</version> <!-- 企业微信SDK --> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <!-- 缓存suite_ticket --> </dependency> ``` 2. **数据库配置** ```yaml # application.yml spring: datasource: url: jdbc:mysql://localhost:3306/qywx_third_demo?useSSL=false redis: host: localhost jpa: hibernate: ddl-auto: create # 首次启动后改为update ``` --- #### 二、企业微信服务商配置 1. **获取关键参数** - 登录[企业微信服务商后台](https://open.work.weixin.qq.com/) - 记录以下参数: - `SUITE_ID`(应用ID) - `SUITE_SECRET`(应用密钥) - `TOKEN`(消息校验Token) - `ENCODING_AES_KEY`(消息加密Key) - `CORP_ID`(服务商企业ID)[^2] 2. **配置回调URL** ```plaintext 回调URL格式:https://your-domain.com/callback 需同时在服务商后台和代码中配置 ``` --- #### 三、核心代码实现 1. **回调验证处理器** ```java @RestController public class CallbackController { @Autowired private WxCpService wxCpService; // 企业微信回调验证 @GetMapping("/callback") public String verify(@RequestParam("msg_signature") String signature, @RequestParam("timestamp") String timestamp, @RequestParam("nonce") String nonce, @RequestParam("echostr") String echostr) { return wxCpService.getSuiteService().checkSignature(signature, timestamp, nonce, echostr); } } ``` 2. **消息解密与事件处理** ```java @PostMapping("/callback") public String handleMessage( @RequestParam("msg_signature") String signature, @RequestParam("timestamp") String timestamp, @RequestParam("nonce") String nonce, @RequestBody String postData) { // 1. 解密消息 WxCpXmlMessage message = WxCpXmlMessage.fromEncryptedXml( postData, wxCpService.getSuiteConfig(), timestamp, nonce, signature); // 2. 处理事件类型 switch (message.getEvent()) { case "suite_ticket": // 缓存suite_ticket redisTemplate.opsForValue().set("SUITE_TICKET", message.getSuiteTicket()); break; case "create_auth": // 企业授权成功 handleAuthCreate(message.getAuthCorpId()); break; case "change_contact": // 通讯录变更 handleContactChange(message); break; } return "success"; } ``` 3. **获取访问令牌** ```java public String getAccessToken() { // 从Redis获取缓存的suite_ticket String suiteTicket = redisTemplate.opsForValue().get("SUITE_TICKET"); // 调用获取token接口 WxCpSuiteAccessTokenResult result = wxCpService.getSuiteService() .getSuiteAccessToken(SUITE_ID, SUITE_SECRET, suiteTicket); return result.getSuiteAccessToken(); } ``` --- #### 四、第三方应用集成流程 ```mermaid sequenceDiagram participant 企业微信 participant 第三方应用 企业微信->>第三方应用: 推送suite_ticket(每10分钟) 企业微信->>第三方应用: 发送授权成功事件 第三方应用->>企业微信: 获取永久授权码 第三方应用->>企业微信: 获取企业access_token 第三方应用->>企业微信: 调用API(通讯录/消息等) ``` > **关键点**: > 1. `suite_ticket` 需要实时缓存(Redis或数据库)[^1] > 2. 永久授权码存储在企业本地数据库 > 3. 所有API调用需使用企业专属`access_token` --- #### 五、部署与上架流程 1. **本地测试** ```bash # 使用内网穿透工具 ngrok http 8080 --> 生成https回调域名 ``` 2. **正式部署** ```bash # 打包Spring Boot应用 mvn clean package # 服务器运行 java -jar qywx-third-app.jar ``` 3. **应用上架** - 在服务商后台提交审核材料 - 配置授权完成页和安装引导页 - 通过企业微信审核后上架应用市场 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值