准备工作上一篇已经完成,接下来开始开发后台代码。
在创建微应用的时候,推送类型有「HTTP」和「钉钉云」两种方式,「HTTP」这种方式只能在测试的时候使用,到生产环境只能使用「钉钉云」的服务。
搭建微应用服务端
首先创建一个springboot
工程
如上图标示,服务端要用到这些参数。
钉钉回调地址
application.yml
程序启动的配置文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| server: port: 8080 servlet: context-path: /dingtalk
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver type: com.zaxxer.hikari.HikariDataSource hikari: maximum-pool-size: 500 minimum-idle: 1 idle-timeout: 60000 url: jdbc:mysql://127.0.0.1:3306/ding_cloud_push?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2B8 username: root password: root redis: database: 0 host: 127.0.0.1 port: 6379 password: timeout: 5000 jedis: pool: max-active: 8 max-wait: 1 max-idle: 8 min-idle: 0
env: suiteId: appId: suiteKey: suiteSecret: token: encodingAesKey: corpId: corpSecret:
|
PortalController.java
HTTP推送接收服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| package club.itwork.dingtalk.controller;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import club.itwork.dingtalk.dto.EventMsg; import club.itwork.dingtalk.handler.EventHandler; import club.itwork.dingtalk.handler.HandlerManager; import club.itwork.dingtalk.properties.EnvProperties; import com.dingtalk.oapi.lib.aes.DingTalkEncryptor; import com.dingtalk.oapi.lib.aes.Utils; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import java.util.Map;
import static club.itwork.dingtalk.constant.Constants.*;
@Slf4j @RestController @RequestMapping("portal") public class PortalController {
@Resource private EnvProperties env;
@Resource private HandlerManager handlerManager;
@PostMapping("/callback") public Map<String, String> callback(@RequestParam(value = "signature", required = false) String signature, @RequestParam(value = "timestamp", required = false) String timestamp, @RequestParam(value = "nonce", required = false) String nonce, @RequestBody(required = false) JSONObject body) {
log.info("begin /callback: 【signature】:{},【timestamp】:{},【nonce】:{}", signature, timestamp, nonce);
try {
String encryptMsg = body.getString(ENCRYPT_KEY); DingTalkEncryptor encrypt = new DingTalkEncryptor(env.getToken(), env.getEncodingAesKey(), env.getSuiteKey()); String decryptMsg = encrypt.getDecryptMsg(signature, timestamp, nonce, encryptMsg); EventMsg eventMsg = JSON.parseObject(decryptMsg, EventMsg.class); String eventType = eventMsg.getEventType();
EventHandler handler = handlerManager.getHandler(eventType); handler.handle(eventMsg);
return encrypt.getEncryptedMap(CALLBACK_RESPONSE_SUCCESS, System.currentTimeMillis(), Utils.getRandomStr(RANDOM_COUNT)); } catch (Exception e) { log.error("处理推送事件异常:", e); e.printStackTrace(); }
return null; }
}
|
这个类就是接收HTTP回调设置的接口。以上程序运行起来,下面开始配置回调地址。
配置回调地址
钉钉云请求回调地址是需要外网IP或者域名,测试阶段我这里使用的是ngrok外网穿透工具。
因为回调地址会推送一个suite_ticket
,我把这个保存到了redis
中,所以还得起一个redis服务。
所需要的服务都已经启动,开始配置回调地址:
如上图填入回调地址,点「验证有效性」按钮,会请求到我的后台服务,以上显示结果为验证成功。
应用主页:https://www.genwxue.com?corpId=$CORPID$是H5微应用的访问地址,这样配置钉钉云会自动把$CORPID$替换成功具体是哪个企业在访问微信应用。
Ticket推送
回调地址配置成功,会收到一个sutite_ticket
推送事件,也可以在应用的详情页面点击「重新推送」按钮获取。
好,到这里回调地址就配置完成了。接下来写各个事件的处理。
获取源码
关注微信公众号「特想学英语」,回复:「钉钉」