场景:钉钉小程序调用若依后端接口做业务增删改查;后端部署在这台轻量服务器,Nginx 代理/api,阿里云防火墙已经关闭 8080 公网。
网络层面
- 钉钉小程序不能直接访问 公网 IP:8080,8080 已经被防火墙封禁。
- 小程序请求域名填:
http://你的公网IP/api(后续换成域名 HTTPS)
- 链路:钉钉小程序 → 80 端口 (Nginx) →
127.0.0.1:8080若依后端。 - 阿里云防火墙只需要开放 80、443,其余后端端口全部对内。
⚠️钉钉小程序生产环境强制要求 HTTPS 域名,裸 IP http 只能开发调试,上线必须域名 + SSL 证书。
两种鉴权方案(钉钉小程序)
方案 A:钉钉小程序 code2session(推荐,钉钉官方)
流程:
- 钉钉小程序前端调用
dd.getAuthCode()获取authCode - 小程序把 authCode 传给你的若依后端接口
- 后端拿
appKey + appSecret + authCode调用钉钉 openapi 接口dingtalk.oapi.miniapp.userinfo.get获取用户钉钉 userId - 后端拿到钉钉 userId,匹配系统用户,返回 token 给小程序;
- 小程序后续所有增删改查请求头部带上 token,走若依原有
Authorization鉴权。
这样复用若依完整权限体系(角色、菜单、数据权限),直接做业务增删改查。
方案 B:简单模式(仅内部使用,开发调试)
内部 5 人小程序,小程序请求 header 带上自定义标识,后端拦截器识别钉钉小程序请求,直接绑定固定内部账号 token。不建议上公网对外。
Nginx 关键配置(适配钉钉小程序,和你现有若依 Web 共用一套后端)
server {
listen 80;
server_name 你的公网IP;
# 若依web前端页面
location / {
root /www/wwwroot/ruoyi-web;
index index.html;
try_files $uri $uri/ /index.html;
}
# 【钉钉小程序、web共用后端接口】全部转发本机8080
location /api/ {
proxy_pass http://127.0.0.1:8080/;
proxy_set_header Host $host;
proxy_set_header X‑Real‑IP $remote_addr;
proxy_set_header X‑Forwarded‑For $proxy_add_x_forwarded_for;
}
}
SpringBoot application.yml,tomcat 监听地址写
127.0.0.1:8080,不要 0.0.0.0,只允许本机 Nginx 访问后端。
yaml
server:
port: 8080
address: 127.0.0.1
后端依赖 & 接口要点(若依 springboot)
-
pom.xml 引入钉钉 SDK(或者直接 http 调用 openapi)
com.aliyun dingtalk 2.0.25 -
配置文件填入钉钉小程序的
ding.app-key、ding.app-secret -
写一个
/api/ding/miniapp/login接口:接收小程序传过来 authCode,换取钉钉 userId,匹配系统用户,返回若依 token。 -
小程序拿到 token,后续所有增删改查请求请求头:
Authorization: Bearer xxxxxx,直接复用若依已写好的 controller,不用重写增删改查代码。
钉钉小程序侧 request 请求示例
//钉钉小程序 js
dd.request({
url:"http://你的公网IP/api/ding/miniapp/login",
method:"POST",
data:{ authCode: res.authCode },
success:(res)=>{
//拿到token,存storage
dd.setStorageSync('token',res.data.token)
}
})
//后续业务查询
dd.request({
url:"http://你的公网IP/api/xxx/list", //若依原有业务接口
headers:{
"Authorization":"Bearer "+dd.getStorageSync('token')
}
})
留意的地方
- 不要小程序直接请求
:8080;防火墙已经封死,必须走/api经过 Nginx 代理。 - 钉钉小程序开发调试时,开发工具打开【不校验合法域名】;正式发布必须配置 HTTPS 域名。
- 小程序调用钉钉 openapi 的
authCode一次性,只能使用一次,不能重复调用。 - 若依跨域:Nginx 或者后端配置跨域,允许钉钉小程序域名来源。
- 数据库用户表,增加字段
ding_user_id,保存钉钉小程序用户 ID,用于账号绑定。
重要提醒(这里是互联网对外服务)
- 钉钉小程序鉴权不要前端硬编码 appSecret,appSecret 只能保存在后端,绝对不能暴露小程序前端。
- 所有增删改查全部复用若依的 token、角色权限控制,不要单独写一套无校验接口。