第三方登錄之釘釘


1,登陸釘釘開發者后台

2,選擇登陸然后創建應用

第一步拉起授權頁面,即掃碼登陸頁面,掃碼后回調到你自己寫好的回調地址

<a href="https://oapi.dingtalk.com/connect/qrconnect?appid=APPID&response_type=code&scope=snsapi_login&state=STATE&redirect_uri=REDIRECT_URI">釘釘登錄</a>

 

第二步 發請求:准備signature 和 timestamp.,tmp_auth_code就是回調過來的code

做完以后就拿到信息了,他這個就2步

 

回調地址:

    @RequestMapping("/callback")
    public String callback(String code, Model model) throws Exception{
        System.out.println("得到的code為:" + code);
        Map<String, String> params = new HashMap<>(4);
       
        String url = "https://oapi.dingtalk.com/sns/getuserinfo_bycode";
       //申請應用時分配的AppKey
       params.put("client_id", "你自己的APPID");

        params.put("code", code);
        params.put("timestamp", Signature.getTimestamp());
        params.put("signature", Signature.signature());try {
            String result = HttpUtil.post(url, params);
            System.out.println("得到的結果為:" + result);

        } catch (IOException e) {
            e.printStackTrace();
        }
    

        // 否則返回到登陸頁面
        return "/user/success";
    }

HttpUtil:

package alu.util;


import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

import com.alibaba.fastjson.JSONObject;

import java.io.IOException;
import java.text.ParseException;
import java.util.HashMap;
import java.util.Map;

public class HttpUtil {

    /**
     * 發送POST請求
     * @param url 請求的接口路徑
     * @param params 參數
     * @return 
     * @throws IOException
     */
    public static String post(String url, Map<String, String> params) throws IOException {
        CloseableHttpClient client = HttpClients.createDefault();
        StringBuilder stringBuilder = new StringBuilder(url);
      
       //code
        stringBuilder.append("?accessKey=");
        stringBuilder.append(params.get("client_id"));
      

        stringBuilder.append("&timestamp=");
        stringBuilder.append(params.get("timestamp"));
        
        stringBuilder.append("&signature=");
        stringBuilder.append(params.get("signature"));
        

      
        System.out.println("stringBuilder.toString():"+stringBuilder.toString());
        HttpPost httpPost = new HttpPost(stringBuilder.toString());

        JSONObject jsonObject = new JSONObject();
        
        Map<String, String> param = new HashMap<>();
        param.put("tmp_auth_code", params.get("code"));
        httpPost.setHeader("Content-type", "application/json");
        StringEntity s = new StringEntity(jsonObject.toJSONString(param), "utf-8");
        httpPost.setEntity(s);
        //HttpGet httpGet = new HttpGet(stringBuilder.toString());
        //發送請求返回響應的信息
        CloseableHttpResponse response = client.execute(httpPost);
        HttpEntity entity = response.getEntity();
        if (entity != null) {
            String result = EntityUtils.toString(entity, "UTF-8");
            return result;
        }
        return null;
    }
    
   

}

 

SignatureUtil:具體見官方文檔:https://ding-doc.dingtalk.com/doc#/faquestions/hxs5v9

package alu.util;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Date;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;

public class Signature {
    
    private static final long TIMESTAMP=new Date().getTime();
    private static final String APPSECRET=" 你自己的APPSECRET";
     
    public static String signature(){
        
        String urlEncodeSignature="";
        try{
            // 根據timestamp, appSecret計算簽名值
            String stringToSign = String.valueOf(TIMESTAMP);
            Mac mac = Mac.getInstance("HmacSHA256");
            mac.init(new SecretKeySpec(APPSECRET.getBytes("UTF-8"), "HmacSHA256"));
            byte[] signatureBytes = mac.doFinal(stringToSign.getBytes("UTF-8"));
            String signature = new String(Base64.encodeBase64(signatureBytes));
             urlEncodeSignature = urlEncode(signature);
            
        }catch(Exception e){
            e.printStackTrace();
        }
        
        
        
        
        return urlEncodeSignature;
    }
    
    // encoding參數使用utf-8
    public static String urlEncode(String value) {
        if (value == null) {
            return "";
        }
        try {
            String encoded = URLEncoder.encode(value, "utf-8");
            return encoded.replace("+", "%20").replace("*", "%2A")
                .replace("~", "%7E").replace("/", "%2F");
        } catch (UnsupportedEncodingException e) {
            throw new IllegalArgumentException("FailedToEncodeUri", e);
        }
    }
    
    
    public static String getTimestamp(){
        
        
             return    String.valueOf(TIMESTAMP);
        
    }
    
    

    
    

}

 

如果有錯誤歡迎指正

具體參見官方文檔:https://ding-doc.dingtalk.com/doc#/serverapi3/mrugr3


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM