package com.matrix.component.dingding; 
 | 
  
 | 
import com.alibaba.fastjson.JSONObject; 
 | 
import com.dingtalk.api.DefaultDingTalkClient; 
 | 
import com.dingtalk.api.request.OapiGetJsapiTicketRequest; 
 | 
import com.dingtalk.api.request.OapiGettokenRequest; 
 | 
import com.dingtalk.api.response.OapiGetJsapiTicketResponse; 
 | 
import com.dingtalk.api.response.OapiGettokenResponse; 
 | 
import com.matrix.core.tools.StringUtils; 
 | 
import com.taobao.api.ApiException; 
 | 
  
 | 
import java.io.UnsupportedEncodingException; 
 | 
import java.security.MessageDigest; 
 | 
import java.security.NoSuchAlgorithmException; 
 | 
import java.text.SimpleDateFormat; 
 | 
import java.util.Formatter; 
 | 
import java.util.HashMap; 
 | 
import java.util.Map; 
 | 
  
 | 
  
 | 
/** 
 | 
 * @author jiangyouyao 
 | 
 * @description 钉钉授权凭证工具 
 | 
 */ 
 | 
public class AuthHelper { 
 | 
  
 | 
    public static SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
 | 
  
 | 
    /** 
 | 
     * 在此方法中,为了避免频繁获取access_token, 
 | 
     * 在距离上一次获取access_token时间在两个小时之内的情况, 
 | 
     * 将直接从持久化存储中读取access_token 
 | 
     *  
 | 
     * 因为access_token和jsapi_ticket的过期时间都是7200秒 
 | 
     * 所以在获取access_token的同时也去获取了jsapi_ticket 
 | 
     * 注:jsapi_ticket是在前端页面JSAPI做权限验证配置的时候需要使用的 
 | 
     * 具体信息请查看开发者文档--权限验证配置 
 | 
     */ 
 | 
    public static String getAccessToken() throws OApiException { 
 | 
        DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken"); 
 | 
        OapiGettokenRequest request = new OapiGettokenRequest(); 
 | 
        request.setAppkey(DDEnvConfig.APPKEY); 
 | 
        request.setAppsecret(DDEnvConfig.APPSECRET); 
 | 
        request.setHttpMethod("GET"); 
 | 
        OapiGettokenResponse response=null; 
 | 
        try { 
 | 
             response =    client.execute(request); 
 | 
        } catch (ApiException e) { 
 | 
            e.printStackTrace(); 
 | 
        } 
 | 
        return response.getAccessToken(); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     *正常的情况下,jsapi_ticket的有效期为7200秒,所以开发者需要在某个地方设计一个定时器,定期去更新jsapi_ticket 
 | 
      */ 
 | 
    public static String getJsapiTicket(String accessToken) throws OApiException { 
 | 
         
 | 
        String jsTicket = ""; 
 | 
        DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/get_jsapi_ticket"); 
 | 
        OapiGetJsapiTicketRequest req = new OapiGetJsapiTicketRequest(); 
 | 
        req.setTopHttpMethod("GET"); 
 | 
        OapiGetJsapiTicketResponse execute=null; 
 | 
        try { 
 | 
            execute = client.execute(req, accessToken); 
 | 
        } catch (ApiException e) { 
 | 
            e.printStackTrace(); 
 | 
        } 
 | 
        jsTicket= execute.getTicket(); 
 | 
        return jsTicket; 
 | 
         
 | 
    } 
 | 
  
 | 
    public static String sign(String ticket, String nonceStr, long timeStamp, String url) throws OApiException { 
 | 
        String plain = "jsapi_ticket=" + ticket + "&noncestr=" + nonceStr + "×tamp=" + String.valueOf(timeStamp) 
 | 
                + "&url=" + url; 
 | 
        try { 
 | 
            MessageDigest sha1 = MessageDigest.getInstance("SHA-1"); 
 | 
            sha1.reset(); 
 | 
            sha1.update(plain.getBytes("UTF-8")); 
 | 
            return bytesToHex(sha1.digest()); 
 | 
        } catch (NoSuchAlgorithmException e) { 
 | 
            throw new OApiResultException(e.getMessage()); 
 | 
        } catch (UnsupportedEncodingException e) { 
 | 
            throw new OApiResultException(e.getMessage()); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    private static String bytesToHex(byte[] hash) { 
 | 
        Formatter formatter = new Formatter(); 
 | 
        for (byte b : hash) { 
 | 
            formatter.format("%02x", b); 
 | 
        } 
 | 
        String result = formatter.toString(); 
 | 
        formatter.close(); 
 | 
        return result; 
 | 
    } 
 | 
     
 | 
    /** 
 | 
     * @Description: 得到页面验证参数 
 | 
     * @author:dingchuan 
 | 
     * @return 
 | 
     * 返回类型 String 
 | 
     * @date 2016年11月27日 
 | 
     */ 
 | 
    public static Map getConfig() { 
 | 
        String url= DDEnvConfig.URL; 
 | 
        String nonceStr = StringUtils.getRandomString(10); 
 | 
        long timeStamp = System.currentTimeMillis(); 
 | 
        String signedUrl = url; 
 | 
        String accessToken = null; 
 | 
        String ticket = null; 
 | 
        String signature = null; 
 | 
        Long agentid = null; 
 | 
        try { 
 | 
            accessToken = AuthHelper.getAccessToken();            
 | 
            ticket = AuthHelper.getJsapiTicket(accessToken); 
 | 
            signature = AuthHelper.sign(ticket, nonceStr, timeStamp, signedUrl); 
 | 
            agentid = DDEnvConfig.AGENT_ID; 
 | 
        } catch (OApiException  e) { 
 | 
            e.printStackTrace(); 
 | 
        } 
 | 
        Map<String,String> map= new HashMap<>(); 
 | 
  
 | 
        map.put("jsticket",ticket); 
 | 
        map.put("signature",signature); 
 | 
        map.put("nonceStr",nonceStr); 
 | 
        map.put("timeStamp",timeStamp+""); 
 | 
        map.put("corpId", DDEnvConfig.CORP_ID); 
 | 
        map.put("agentid",agentid+""); 
 | 
  
 | 
        return map; 
 | 
    } 
 | 
  
 | 
  
 | 
  
 | 
    public static String getSsoToken() throws OApiException { 
 | 
        String url = "https://oapi.dingtalk.com/sso/gettoken?corpid=" + DDEnvConfig.CORP_ID + "&corpsecret=" + DDEnvConfig.SSO_SECRET; 
 | 
        JSONObject response = HttpHelper.httpGet(url); 
 | 
        String ssoToken; 
 | 
        if (response.containsKey("access_token")) { 
 | 
            ssoToken = response.getString("access_token"); 
 | 
        } else { 
 | 
            throw new OApiResultException("Sso_token"); 
 | 
        } 
 | 
        return ssoToken; 
 | 
  
 | 
    } 
 | 
  
 | 
} 
 |