原文链接:https://blog.csdn.net/qq_40335247/article/details/118425126
专有钉钉扫码登录 参考专有钉钉开发文档,皇冠链接:https://openplatform-portal.dg-work.cn/portal/#/helpdoc?docKey=kfzn&slug=engk1k
一、官方流程
二、具体实现 1.准备工作,下载官方sdk ①.JAVA 语言 新文档对应sdk: zwdd-sdk-java-1.2.0.jar
旧文档对应sdk:zwdd-sdk-java-1.1.9.jar
②.PHP 语言 zwdd-sdk-php.php
③.Python 语言 zwdd-sdk-python.py
注:
遇到 org.joda.time.ReadableInstant 报错,请在 pom.xml 中添加如下内容
<dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.10</version> </dependency> 1 2 3 4 5 如遇到 fastjson 相关报错,DG游戏请在 pom.xml 中添加如下内容
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency> 1 2 3 4 5 2.准备工作,获取appKey和appSecrect 查看应用详情
登录开发者后台,点击“应用管理”-找到应用并点击详情,欧博注册可以查看 AppKey 和 AppSecret 。
权限管理
申请API授
在我的应用页面,点击左侧接口权限,进入权限管理页面,欧博代理开启应用功能所需要的权限。请仅仅选择需要的权限进行授权。
3.获取access_token 这里的ExecutableClient和GetClient,都是依赖第一步的sdk(mvn仓库也没有,协同开发时记得带上)
//调用dingding api //private JSONObject getMsgByApi(String apiMethod,Map paramMap){ private JSONObject getMsgByApi(){ ExecutableClient executableClient =ExecutableClient.getInstance(); executableClient.setAccessKey(appKey);
//appKey<1> executableClient.setSecretKey(appSecret);
//appSecret<2> executableClient.setDomainName(domainName);
//domainName<3> executableClient.setProtocal("https"); executableClient.init(); //executableClient要单例,欧博官网并且使用前要初始化,只需要初始化一次
String api = "/gettoken.json";
GetClient getClient = executableClient.newGetClient(api); //设置参数 getClient.addParameter("appkey", appkey);
//appKey<1> getClient.addParameter("appsecret", appsecret);
//appSecret<2> //调用API String apiResult = getClient.get();
JSONObject map = JSON.parseObject(apiResult); System.out.println(apiResult); return map; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 其中<1>、<2>参数都是来自第二步,而<3>参照下表填入对应接口环境域名
环境 开放平台域名(调接口使用) 登录域名(构造登录页面) Saas openplatform.dg-work.cn login.dg-work.cn 浙政钉 openplatform-pro.ding.zj.gov.cn(域名对应政务外网IP:59.202.52.1) login-pro.ding.zj.gov.cn(域名对应政务外网IP:59.202.52.68) 完整接口地址:https://环境域名/+接口名 例如:https://openplatform.dg-work.cn/gettoken.json
返回的apiResult结果
{ "success":true, "content":{
"data":{
"accessToken":"c139fe44362f41b6b84862ec82ab84d9", //这就是咱们要的
"expiresIn":"7200"
},
"requestId":"df04428415724925400701038d663a",
"responseMessage":"OK",
"responseCode":"0",
"success": true } } 1 2 3 4 5 6 7 8 9 10 11 12 13 4.获取免登授权码(若是前后端分离,可以交给前端来做) 构造扫码登录页面(官方) Web系统可以通过两种方式实现政务钉钉扫码登录。
方式一 使用政务钉钉提供的扫码登录页面 在企业Web系统里,用户点击使用钉钉扫码登录,第三方Web系统跳转到如下地址:
https://login.dg-work.cn/oauth2/auth.htm?response_type=code&client_id=应用标识&redirect_uri=回调地址&scope=get_user_info&authType=QRCODE 1 URL中的client_id和redirect_uri两个参数的值填入第三方web系统的应用标识和回调地址。政务钉钉用户扫码登录并确认后,会302到你指定的redirect_uri,并向url参数中追加临时授权码code(此code非authcode)及state两个参数。
注意事项:
参数"redirect_uri=回调地址"涉及的域名,需和创建扫码登录应用授权时填写的回调域名一致,否则会提示无权限访问。
生成二维码大小固定为200*200px,不支持修改。
方式二 支持网站将政务钉钉登录二维码内嵌到自己页面中 步骤1:在****页面中通过iframe嵌入页面
通过方式一构造的地址增加embedMode=true的参数
https://login.dg-work.cn/oauth2/auth.htm?response_type=code&client_id=应用标识&redirect_uri=回调地址&scope=get_user_info&authType=QRCODE&embedMode=true 1 步骤2:扫码成功后需要在页面中监听扫码结果
<script type="application/javascript"> window.addEventListener('message', function(event) {
// 这里的event.data 就是登录成功的信息
// 数据格式:{ "code": "aaaa", "state": "bbbb" }
alert(JSON.stringify(event.data)); }); </script> 1 2 3 4 5 6 7 注意:生成二维码大小固定为200*200px,不支持修改。
参考方式一实现(clint_id就是所建应用的应用标识) @Override public void toALiDingDing(HttpServletResponse response) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("https://login.dg-work.cn/oauth2/auth.htm?response_type=code&client_id=")
.append(appID)
.append("&scope=get_user_info&authType=QRCODE")
.append("&redirect_uri=")
.append(redirectUrl); try {
response.sendRedirect(stringBuilder.toString()); } catch (IOException e1) {
} } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 5.获取用户详情 通过前面几个步骤,我们已经拿到了最关键的两个东西access_token调⽤接⼝凭证、code免登授权码
因此,同理,我们在调用接口如下:
//调用dingding api //private JSONObject getMsgByApi(String apiMethod,Map paramMap){ private JSONObject getMsgByApi(){ ExecutableClient executableClient =ExecutableClient.getInstance(); executableClient.setAccessKey(appKey);
executableClient.setSecretKey(appSecret);
executableClient.setDomainName(domainName);
executableClient.setProtocal("https"); executableClient.init(); //executableClient要单例,并且使用前要初始化,只需要初始化一次
String api = "/rpc/oauth2/dingtalk_app_user.json";
GetClient getClient = executableClient.newGetClient(api); //设置参数 getClient.addParameter("access_token", "xxxxx");
getClient.addParameter("code", "xxxxx");
//调用API String apiResult = getClient.get();
JSONObject map = JSON.parseObject(apiResult); System.out.println(apiResult); return map; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 返回apiResult如下(以实际返回为主):
{ "success":true, "content":{
"data":{
"accountId":100135,
"lastName":"俊锋",
"clientId":"mozi-buc-sso",
"realmId":12371,
"tenantName":"租户2",
"realmName":"租户2",
"namespace":"local",
"tenantId":12371,
"nickNameCn":"俊锋",
"tenantUserId":"12371$100135",
"account":"admin2"
},
"success":true,
"responseMessage":"成功",
"responseCode":"0" } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 错误码 responseCode responseMessage 240111 code失效或不存在 240133 应用accessToken失效或不存在 6.走自己的登录业务吧
(责任编辑:)
|