第三方登录之钉钉

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

posted @ 2020-06-03 16:44  KwFruit  阅读(965)  评论(0编辑  收藏  举报