I.はじめに
ハハ、これは私の最初のブログです。
私は、この特定のシーンの小さな機能についてお話しましょう:
ユーザーログイン釘アプリユーザーが存在する場合、現在のユーザーの情報を取得し、マイクロアプリケーション上でクリックして、H5システムのユーザ情報データベースの比較、そして、ホームページH5システムに直接クリックすると、そうでない場合を示し、「あなたは何の権利を持っていません。」
追加:小さな、ビンタンが成功し、それがユーザーにメッセージを与える時計仕掛けのための需要を追加しました
私はこの小さな機能を達成するために、開発ドキュメントの爪に言及した、文書アドレスします。https://ding-doc.dingtalk.com/doc#/serverapi2/clotub
第二に、仕事の準備
ます。https://open-dev.dingtalk.com我々はマイクロアプリケーションを作成する必要があります
1. H5は、社内で開発したマイクロエンタープライズアプリケーション、いないサードパーティ製のエンタープライズ・アプリケーションを作成することです
内部開発:内部の開発は、企業内の人員の使用のための「エンタープライズアプリケーションの開発」を参照します。企業は、企業内の開発者によって開発されたか、カスタマイズされたサービスプロバイダを開発するために会社が認可されるように選択することができます。
サードパーティ製エンタープライズアプリケーション:サードパーティ製のエンタープライズ・アプリケーションの開発は、釘、企業、オープン爪に基づいてアプリケーションを開発する能力以外の第三者として、開発者を参照してください、と釘を使用することで、他の組織に利用可能となります。(ハハ、この区別は私が直接文書をコピーしました)
2.H5プロジェクト、フロントページddNoLogin.htmlを作成した(ハハ、私は右の英語の単語を見つけられませんでしたので、英語という名前のこの小さな中国語):
このページには、ビンタンの認証コードを取得し、その後、インターフェースの背景にコードを渡すために使用されます。
3.会社のパブリックIPサーバに記入
あなたは、IPを表示するためのコマンドを入力することができます。ifconfig.meカール
4.マイクロアプリケーションが作成され、それは3つのパラメータを生成します、
agentIdが、APPKEY、appSecret
プラスcorpId(ホーム開発プラットフォームのネイル表示)は、これらの4つのパラメータは、値を固定し、その後の開発が必要とされています
5.インタフェースの権限
高度なアクセス許可 - エンタープライズディレクトリインタフェースは、開く必要があります
6.最後のポストアプリケーション
第三に、機能の開発
ハハ、コードをノック開始します
1.認証コードコードビンタンを入手
ここではこの方法は、認証が必要な場合は爪のJS-APIメソッドは、この機能は、認証は必要ありません呼び出すと呼ばれる、あなたもdd.configする必要があります。
認証方法の機能の必要性について、あなたはJSAPIの概要を見に行くことができます
ddNoLogin.html:
<!DOCTYPE HTML> <HTML> <HEAD> <TITLE>微应用登陆</ TITLE> <メタのcharset = "UTF-8"> <メタ名= "ビューポート"コンテンツ= "幅=装置幅、初期の規模= 1人のユーザースケーラブル= 0" /> <スクリプトSRC = "https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"> </ SCRIPT> ます。<script type = "text / javascriptの"SRC =" http://g.alicdn.com/dingding/open-develop/1.9.0/dingtalk.js "> </ SCRIPT> </ HEAD> <BODY> の<divのid =" ddNoLogin "> </ DIV> <スクリプトタイプ= "テキスト/ javascriptの"> dd.ready(関数(){ // 1。获取免登授权码コード dd.runtime.permission。requestAuthCode({ corpId:corpId、//企业識別 するonSuccess:関数(結果){ VARコード= result.code。 getUserInfo(コード)。//通过该コード可以获取用户身份 }、 onFail:関数(ERR){ アラート( '出错了、' + ERR)。 } })。 }); 機能getUserInfo(コード){ $アヤックス({ タイプ: "GET"、 URL: "/ XXX / NOLOGINコード=?" +コード、 非同期:falseの場合、 データ型: 'JSON'、 contentTypeの:「アプリケーション/ jsonの;のcharset = UTF-8" 、 成功:(機能(RES){ (res.codeは==場合は"0000"){ window.location.href = '/#/ XXXXX'; }他{ $( '#のddNoLogin')のhtml。 (res.msg)。 } </ SCRIPT> </ body> </ HTML>
コードを達成取得は、フロントエンドJSを書くために必要とされています
2.取得access_tokenは
HTTPS :? //Oapi.dingtalk.com/gettoken APPKEY =キー&appsecret =秘密:ネイルはAPPKEYとappsecret、リクエストパスによってトークンのためにここにオープンAPIのバックエンドインターフェイスを提供します
トークンは、繰り返し周期を求め、2時間有効で、同じ結果を返すと、自動更新されます、
したがって、ここに私の実装です:定期的にトークン釘を取得するためのトークン、1時間ごとに50分を更新し、Redisのにキャッシュされた(I釘がapplication.ymlに構成で配置されています)
DdTokenTask.java:
/ ** *定时获取钉钉的トークン * / @Component @EnableScheduling パブリッククラスDdTokenTask { @Autowired プライベートJedisClient jedisClient。 パブリック静的最終長いcacheTime * 2 = 1000 * 60 * 55; // 1小时50分钟 @value( "$ {dtalk.tokenUrl}") プライベート文字列tokenUrl。 @value( "$ {dtalk.app.key}") プライベート文字列APPKEY。 @value( "$ {dtalk.app.secret}") プライベート文字列appSecret。 @value( "$ {dtalk.redisTokenKey}") プライベート文字列tokenKey。 @value( "$ {dtalk.taskRun}") プライベート文字列taskRun。 @Scheduled(fixedRate = CacheTime) @Async ます。public void getDdTokenTask(){ IF(.equals(TaskRun "真の")){ //リフレッシュ するSystem.out.printlnを(「--- >>>>> ----- "+ DateUtil.formatDateToString(新しい新しいDate()、" HH:MM:SS ")--------トークン爪にタスクの開始のタイミングを取得する); 文字列accessTokenUrl tokenUrl + ="のAppKey =「+? +のAppKey "&appsecret =" + appsecret; // 2時間の有効なaccess_tokenはアクセスを取得 文字列accessToken = JsonUtil.getJsonNode(HttpUtil.doGet(accessTokenUrl))を取得します( "access_tokenは")AsText(); ... // Redisのに置きます中 jedisClient.set(tokenKey、accessToken); System.out.printlnは(「--- >>>>> -------------、定期的なタスクの爪のトークンが終了したトークンを取得:「+ accessToken)。 } } / *プライベート文字列getAccessToken(){ //需引入SDK、公司私服没有 DefaultDingTalkClientクライアント=新しい DefaultDingTalkClient( "https://oapi.dingtalk.com/gettoken"); OapiGettokenRequest要求=新しいOapiGettokenRequest(); request.setAppkey( "APPKEY"); request.setAppsecret( "appsecret"); request.setHttpMethod( "GET"); 応答= client.execute(リクエスト)OapiGettokenResponse。 「」を返します。 } * / }
(ハハ、実際には、文書には、爪SDKのJava文言を提供ではなく、会社PW SDKので、私はちょうどhtttp要求を使用します)
3.ゲットユーザーuserid
します。https://oapi.dingtalk.com/user/getuserinfo access_tokenは= access_tokenは&コード=コードビンタンaccess_tokenは認証コードとユーザーのユーザーIDを取得し、要求のパスで?
ユーザの詳細情報を取得する4.
要求パスします。https://oapi.dingtalk.com/user/get access_tokenは= access_tokenは&ユーザーID = shaocui?
すべての情報は、など、ユーザーの名前、電話番号を、返します。
DdLoginController.java:
@RestController @RequestMapping( "/ ddUser") @Api(値= "/ ddUser"、説明= "钉钉H5微应用登录"、タグが= { "DdLoginController"}) publicクラスDdLoginController { @Autowired プライベートJedisClient jedisClient。 @value( "$ {dtalk.userUrl}") プライベート文字列userUrl。 @value( "$ {dtalk.userDetailUrl}") プライベート文字列userDetailUrl。 @value( "$ {dtalk.redisTokenKey}") プライベート文字列tokenKey。 @value( "$ {dtalk.agentId}") 、プライベート整数agentIdが。 @GetMapping( "/ nologinに") @ApiOperation( "钉钉免登" @ApiImplicitParam(paramType = " // 2 access_tokenは取得するために 文字列をaccessToken = jedisClient.get(tokenKey); //ユーザー3ユーザーIDの取得 文字列をuserIdUrl = userUrl accessToken + + + "&コード=" +コード"access_tokenは=?"; //アクセスユーザーIDは取得 ユーザーをJsonNode JsonUtil.getJsonNode =(HttpUtil.doGet(userIdUrl)); IF(!user.get( "ERRCODE")ASINT()= 0){ //いくつかの企業をIP公衆ネットワークを提供していないマイクロアプリケーションで、その結果、固定されていませんここで、エラーがします ; WebResponse.resFail(user.get( "ERRMSG")AsText())を返す } 文字列のuserId = user.get( "ユーザID")AsText();. // 4の携帯電話番号をユーザの詳細情報を取得するために UserInfoUrl userDetailUrl + + =文字列accessToken + "&ユーザーID =" +はuserId "access_tokenは=?"; //取得アクセスモバイル JsonNodeのUserInfo = JsonUtil.getJsonNode(HttpUtil.doGet(userInfoUrl)); 文字列= userInfo.getモバイル( "モバイル" ).astext(); System.out.printlnは( "ネイルユーザーの電話番号:" +モバイル); //携帯電話番号を介してユーザを取得 SYSUSER SYSUSER =。。。。。; IF(SYSUSER == NULL){ このユーザーは存在しません// WebResponse.resFailを返す(、nullで"あなたがアクセスする権限がありません"); } 。。。。。。 //爪は、ユーザーにビンタン成功メッセージを送る のsendMessage(accessToken、userIdを、userInfo.get( "名前")AsText()); 戻りにWebResponse。 } //ユーザー主食にメッセージを送る プライベート無効のsendMessage(文字列のトークン、文字列のuserId、 文字列のuserName){ 文字列messageUrl =「https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2?access_token="+token。 地図<文字列、オブジェクト>マップ=新しいHashMapの<>(); map.put( "AGENT_ID"、agentId.longValue()); map.put( "userid_list"、USERID)。 map.put( "to_all_user"、偽); 文字列の内容= "用户" + userNameに+ "在" + DateUtil.formatDateToString(新しいDate()、 "YYYY-MM-DD HH:MM:SS")+ "时成功登录xxH5端、并进入到XXX页面"; 文字列MSG = "{\" MSGTYPE \ "\"文字\ "\ "文字\":{\ "コンテンツ\": "+" \ "" +コンテンツ+ "\" "+"}}"。 JSONObject jsonObj = JSONObject。parseObject(MSG)。 map.put( "MSG"、jsonObj)。 HttpUtil.doPost(messageUrl、マップ、 "UTF-8"、20000、NULL); } }
(ハ、.....認証が成功した後に実装され、特定のオペレーティングシステムであるコードで、それがここでは省略されています)
このネイルビンタンが実現された後、ビンタン成功、その後、ユーザーにメッセージを送ります
5.ワーキング通知メッセージ
POSTリクエスト、リクエストパスします。https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2 access_tokenは= access_tokenは?
请求体{AGENT_ID、userid_list、dept_id_list、to_all_user、MSG}
注意:
同じユーザに、一日一度だけ作られた同じコンテンツを送信するために、さまざまなコンテンツを送信、500回の日、
だからここに私が送信されたメッセージで現在の時刻を追加しました。
(ハハ、私はコード内のコメントに書かれているもののいくつかの詳細は、最終的にはこの小さな機能は、コードの少量であるように思わあります)