Browse Source

third集成消息回调

dev
jianjun 3 years ago
parent
commit
1d372aa184
  1. 11
      epmet-module/epmet-third/epmet-third-server/pom.xml
  2. 2
      epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/EpmetThirdApplication.java
  3. 85
      epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/controller/dingtalk/CallbackController.java
  4. 3
      epmet-module/epmet-third/epmet-third-server/src/main/resources/bootstrap.yml
  5. 2
      epmet-module/epmet-third/epmet-third-server/src/main/resources/logback-spring.xml
  6. 30
      epmet-module/epmet-third/epmet-third-server/src/main/test/java/com/epmet/ThirdPlatformTest.java

11
epmet-module/epmet-third/epmet-third-server/pom.xml

@ -157,7 +157,16 @@
<artifactId>rocketmq-acl</artifactId>
<version>4.9.2</version>
</dependency>
<dependency>
<artifactId>dingtalk-spring-boot-starter</artifactId>
<groupId>com.taobao</groupId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency>
</dependencies>
<build>

2
epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/EpmetThirdApplication.java

@ -1,6 +1,7 @@
package com.epmet;
import com.epmet.mq.properties.RocketMQProperties;
import com.taobao.dingtalk.spring.annotations.EnableDingTalk;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@ -8,6 +9,7 @@ import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@EnableDingTalk
@EnableConfigurationProperties(RocketMQProperties.class)
@SpringBootApplication
@EnableDiscoveryClient

85
epmet-module/epmet-third/epmet-third-server/src/main/java/com/epmet/controller/dingtalk/CallbackController.java

@ -0,0 +1,85 @@
package com.epmet.controller.dingtalk;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.dingtalk.config.Constant;
import com.aliyun.dingtalk.util.DingCallbackCrypto;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;
/**
* ISV 小程序回调信息处理
*/
@RestController
@RequestMapping("/dingTalk")
public class CallbackController {
private final Logger log = LoggerFactory.getLogger(getClass());
/**
* 创建应用验证回调URL创建有效事件第一次保存回调URL之前
*/
private static final String EVENT_CHECK_CREATE_SUITE_URL = "check_create_suite_url";
/**
* 创建应用验证回调URL变更有效事件第一次保存回调URL之后
*/
private static final String EVENT_CHECK_UPADTE_SUITE_URL = "check_update_suite_url";
/**
* suite_ticket推送事件
*/
private static final String EVENT_SUITE_TICKET = "suite_ticket";
/**
* 企业授权开通应用事件
*/
private static final String EVENT_TMP_AUTH_CODE = "tmp_auth_code";
@PostMapping(value = "dingCallback")
public Object dingCallback(
@RequestParam(value = "signature") String signature,
@RequestParam(value = "timestamp") Long timestamp,
@RequestParam(value = "nonce") String nonce,
@RequestBody(required = false) JSONObject body
) {
String params = "signature:" + signature + " timestamp:" + timestamp + " nonce:" + nonce + " body:" + body;
try {
log.info("begin callback:" + params);
DingCallbackCrypto dingTalkEncryptor = new DingCallbackCrypto(Constant.TOKEN, Constant.ENCODING_AES_KEY, Constant.SUITE_KEY);
// 从post请求的body中获取回调信息的加密数据进行解密处理
String encrypt = body.getString("encrypt");
String plainText = dingTalkEncryptor.getDecryptMsg(signature, timestamp.toString(), nonce, encrypt);
JSONObject callBackContent = JSON.parseObject(plainText);
// 根据回调事件类型做不同的业务处理
String eventType = callBackContent.getString("EventType");
if (EVENT_CHECK_CREATE_SUITE_URL.equals(eventType)) {
log.info("验证新创建的回调URL有效性: " + plainText);
} else if (EVENT_CHECK_UPADTE_SUITE_URL.equals(eventType)) {
log.info("验证更新回调URL有效性: " + plainText);
} else if (EVENT_SUITE_TICKET.equals(eventType)) {
// suite_ticket用于用签名形式生成accessToken(访问钉钉服务端的凭证),需要保存到应用的db。
// 钉钉会定期向本callback url推送suite_ticket新值用以提升安全性。
// 应用在获取到新的时值时,保存db成功后,返回给钉钉success加密串(如本demo的return)
log.info("应用suite_ticket数据推送: " + plainText);
} else if (EVENT_TMP_AUTH_CODE.equals(eventType)) {
// 本事件应用应该异步进行授权开通企业的初始化,目的是尽最大努力快速返回给钉钉服务端。用以提升企业管理员开通应用体验
// 即使本接口没有收到数据或者收到事件后处理初始化失败都可以后续再用户试用应用时从前端获取到corpId并拉取授权企业信息,进而初始化开通及企业。
log.info("企业授权开通应用事件: " + plainText);
} else {
// 其他类型事件处理
}
// 返回success的加密信息表示回调处理成功
return dingTalkEncryptor.getEncryptedMap("success", timestamp, nonce);
} catch (Exception e) {
//失败的情况,应用的开发者应该通过告警感知,并干预修复
log.error("process callback fail." + params, e);
return "fail";
}
}
}

3
epmet-module/epmet-third/epmet-third-server/src/main/resources/bootstrap.yml

@ -146,6 +146,9 @@ third:
- https://epmet-ext10.elinkservice.cn
dingTalk:
appKey: dingo53zvltapzrstzbo
appsecret: o1hjFvWKwLG1GIuivX0nbynqFvFDZiI3CoqLyhdZXhghXMEsr34LKCud0Rz2Hd16
agentid: 1880131092
robot:
webHook: @dingTalk.robot.webHook@
secret: @dingTalk.robot.secret@

2
epmet-module/epmet-third/epmet-third-server/src/main/resources/logback-spring.xml

@ -145,6 +145,7 @@
<logger name="org.springboot.sample" level="INFO"/>
<logger name="com.epmet.dao" level="INFO"/>
<logger name="com.epmet.dao" level="DEBUG"/>
<logger name="com.taobao" level="DEBUG"/>
<root level="INFO">
<appender-ref ref="DEBUG_FILE"/>
<appender-ref ref="INFO_FILE"/>
@ -158,6 +159,7 @@
<logger name="org.springframework.web" level="INFO"/>
<logger name="org.springboot.sample" level="INFO"/>
<logger name="com.epmet.dao" level="INFO"/>
<logger name="com.taobao" level="DEBUG"/>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="DEBUG_FILE"/>

30
epmet-module/epmet-third/epmet-third-server/src/main/test/java/com/epmet/ThirdPlatformTest.java

@ -0,0 +1,30 @@
package com.epmet;
import com.alibaba.fastjson.JSON;
import com.aliyun.dingtalk.module.Result;
import com.taobao.dingtalk.client.DingTalkClientToken;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
* descredisson测试类
*/
@Slf4j
@RunWith(value = SpringRunner.class)
@SpringBootTest(classes = {EpmetThirdApplication.class})
public class ThirdPlatformTest {
@Autowired
DingTalkClientToken dingTalkClientToken;
@Test
public void sendText(){
Result<String> appAccessTokenToken = dingTalkClientToken.getAppAccessTokenToken();
System.out.println("=======:"+JSON.toJSONString(appAccessTokenToken));
}
}
Loading…
Cancel
Save