ionic4 釘釘H5微應用免登錄

ionic4 釘釘H5微應用免登錄

【實現結果】
釘釘內打開企業嵌入發佈後的H5微應用無需在輸入賬戶密碼!
【需要參數】
企業H5微應用發佈後的APPID、AppSecret
【實現過程】
前端界面代碼實現

安裝命令
npm install dingtalk-jsapi --save
引入
import * as dd from 'dingtalk-jsapi';
index.html
 <link src="https://g.alicdn.com/dingding/dingtalk-jsapi/2.7.13/dingtalk.open.js"/>

核心:
isDing() {
    if (dd.env.platform !== 'notInDingTalk') {
      // 進行釘釘登錄操作
      dd.ready(() => {
        dd.runtime.permission.requestAuthCode({
          corpId: DingTalkEnum._corpId,
        }).then((onSuccess) => {
          //  獲取臨時授權碼(code )
          this.code = onSuccess.code;
          const url = '請求接口' + this.code ;
          this.http.get(url).subscribe(
              res => {
                if (res.json().code === '0000') {
                  this.token = res.json().data[0].token;
                  this.name = res.json().data[0].userCode;
                  // alert(this.token);
                  localStorage.setItem('Authorization', this.token);
                  localStorage.setItem('userCode', this.name);
                  this.loadUserPage();
                } else {
                  localStorage.removeItem('Authorization');
                  localStorage.removeItem('userCode');
                  this.loadUserPage();
                }
              }
          );
// 成功即相當於 onSuccess
        }, (onFail) => {
          // 失敗即相當於 onFail
          this.error = onFail.error;
        });
      });
    } else {
      this.display = true;
    }
  }

後端核心代碼

package com.tfjybj.english.provider.controller;

import com.alibaba.fastjson.JSON;
import com.dmsdbj.itoo.tool.httpclient.HTTPUtils;
import com.tfjybj.english.utils.Enum.DingTalkEnumUntil;
import com.tfjybj.english.model.AccessTokenModel;
import com.tfjybj.english.model.AllUserModel;
import com.tfjybj.english.model.UserDingModel;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;


@Api(tags = {"釘釘免登錄接口"})
@RequestMapping(value = "/DingTalkLoginController")
@RestController
public class DingTalkLoginController {
    @Value("${ding_corpid}")
    private String corpid;
    @Value("${ding_corpsecret}")
    private String corpsecret;

    /**
     * 釘釘免密登錄
     * @param code 釘釘臨時授權碼
     * @return access_token 釘釘Token
     */
    @ApiOperation("獲取釘釘token")
    @GetMapping(value = "/loginByCode/{code}")
    public AllUserModel getDingToken(@ApiParam(value = "免密登錄臨時授權碼", required = true) @PathVariable String code) {
        // 由AppKey與AppSceret組合臨時請求參數
        String param = "corpid=" + corpid + "&corpsecret=" + corpsecret;
        // 請求獲取AccessToken
        String accessToken = HTTPUtils.sendGet(DingTalkEnumUntil.DING_TALK_ENUM_UNTIL_GETTOKEN.getMessage(), param);
        // 將返回數據實體接收
        AccessTokenModel accessTokenModel = JSON.parseObject(accessToken, AccessTokenModel.class);
        // 取出AccessToken
        String access_token = accessTokenModel.getAccess_token();
        // 根據token和臨時code獲取userid
        String dingId = this.getUserInfo(access_token, code);
        // 返回根據釘釘ID登錄獲取的數據
        return this.dingIdLogin(dingId);
    }


    /**
     * 查詢釘釘取出userID
     * @param access_token  釘釘Token
     * @param code 臨時Code
     * @return
     */
    public String getUserInfo(String access_token, String code) {
        String param = "access_token=" + access_token + "&code=" + code;
        String userInfo = HTTPUtils.sendGet(DingTalkEnumUntil.DING_TALK_ENUM_UNTIL_GETUSERINFO.getMessage(), param);
        UserDingModel userDingModel = JSON.parseObject(userInfo, UserDingModel.class);
        //返回ding_Id
        return userDingModel.getUserid();
    }


    /**
     *請求當前權限釘釘免密登錄接口
     * @param dingId 釘釘企業唯一UserID
     * @return 當前企業內用戶信息
     */
    private AllUserModel dingIdLogin(String dingId) {
        String userDing = sendGet(DingTalkEnumUntil.DING_TALK_ENUM_UNTIL.getMessage(), dingId);
        return JSON.parseObject(userDing, AllUserModel.class);
    }


    /**
     *
     * @param url
     * @param param
     * @return
     */
    public static String sendGet(String url, String param) {
        return sendGet(url, param, false);
    }

    /**
     *
     * @param url
     * @param param
     * @param isJson
     * @return
     */
    public static String sendGet(String url, String param, Boolean isJson) {
        String result = "";
        BufferedReader in = null;

        try {
            String urlNameString = url +  param;
            URL realUrl = new URL(urlNameString);
            URLConnection connection = realUrl.openConnection();
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "Keep-Alive");
            if (isJson) {
                connection.setRequestProperty("Content-Type", "application/json; charset=utf-8");
            }

            connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            connection.connect();
            Map<String, List<String>> map = connection.getHeaderFields();
            Iterator var9 = map.keySet().iterator();

            while(var9.hasNext()) {
                String key = (String)var9.next();
                System.out.println(key + "--->" + map.get(key));
            }

            String line;
            for(in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8")); (line = in.readLine()) != null; result = result + line) {
            }
        } catch (Exception var19) {
            result = "發送 POST 請求出現異常!";
            var19.printStackTrace();
        } finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception var18) {
                var18.printStackTrace();
            }

        }

        return result;
    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章