天天看點

微信--企業微信接入

術語解釋

secret

secret是企業應用裡面用于保障資料安全的“鑰匙”,每一個應用都有一個獨立的通路密鑰,為了保證資料的安全,secret務必不能洩漏。

目前secret有:

  • 自建應用secret。在管理背景->“應用與小程式”->“應用”->“自建”,點進某個應用,即可看到。
  • 基礎應用secret。某些基礎應用(如“審批”“打卡”應用),支援通過API進行操作。在管理背景->“應用與小程式”->“應用->”“基礎”,點進某個應用,點開“API”小按鈕,即可看到。
  • 通訊錄管理secret。在“管理工具”-“通訊錄同步”裡面檢視(需開啟“API接口同步”)
  • 外部聯系人管理secret。在“客戶聯系”欄,點開“API”小按鈕,即可看到。---聯系人這塊如果需要擷取外部聯系人unionId ,那麼就需要綁定公司的公衆号了;
  • 微信--企業微信接入

access_token

access_token是企業背景去企業微信的背景擷取資訊時的重要票據,由corpid和secret産生。所有接口在通信時都需要攜帶此資訊用于驗證接口的通路權限

以自建應用為例

目前是在自建應用中進行相關功能頁面開發,且使用到授權功能,擷取jssdk相關權限

test.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<%@ include file="../common/taglib.jsp" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
    <meta name="apple-mobile-web-app-capable" content="yes" />
    <meta name="apple-mobile-web-app-status-bar-style" content="black" />
    <meta name="format-detection" content="telephone=no" />
    <script src="${imagePath}/static/common/js/jquery-1.7.2.min.js"></script>
    <link rel="stylesheet" href="${imagePath}/static/common/css/reset.css">
<%--    <link rel="stylesheet" href="https://mfiles.dongao.com/static/public/css/reset.css">--%>
    <link rel="stylesheet" href="${imagePath}/static/common/css/common.css">
    <link rel="stylesheet" href="${imagePath}/static/common/css/signUp.css">
    <link rel="stylesheet" href="${imagePath}/static/common/css/wsp_my_order.css">

    <style>
    </style>
</head>
<body class="lt_my lt_personalData">
<input type="hidden" id="chooseimg" value=""/>
<input type="hidden" id="upimg" value=""/>
<input type="hidden" id="downimg" value=""/>
    <div class="top_btn ">
        <a href="javascript:;">
        </a>
        <p class="user_data">個人資料</p>
    </div>
    <div class="personalData_con">
        <div class="ge_zi">
            <div class="ge_zi_user">
                <img src="${imagePath}/static/common/images/img-weidenglu_y.png" alt="" id="avatar" >
                <span class="user_name" id="name"></span>
            </div>
            <div class="ge_zi_title">
                <span class="go_app" >檢視東奧個人資訊</span>
<%--                <img src="${imagePath}/static/common/images/right.png" alt="">--%>
            </div>
        </div>
    </div>
    <div class="section" style="width: 100%;">
        <table id="curInfo">

        </table>
    </div>
    <div class="section m-t-sm">
        <div class="o_d_contNum">
            <div class="o_d_dNum space_between">
                <p class="d_dNum_p">
                    聯系人userid:
                    <input class="txt_dNum" id="user"/>
                </p>
<%--                <a class="num_copy txt_red">複制</a>--%>
            </div>
        </div>
    </div>
    <div class="section_t" style="margin-bottom: 0.1rem;">
        <div class="sec_ticket" style="padding:0;">
            <input type="text" class="sec_input_t"  id="random" placeholder="輸入自定義内容" />
            <img src="${imagePath}/static/common/images/icon_choose_red.png" class="choose_img" />
            <a class="active_btn" data-type="sendChatMessage">确認</a>
        </div>
    </div>
    <div class="section" style="margin-bottom: 20px;">
        <table>
            <tr>
                <td>聯系人類型:</td>
                <td>
                    <select id="userType">
                        <option value="0">請選擇</option>
                        <option value="1">企業成員</option>
                        <option value="2">外部聯系人</option>
                    </select>
                </td>
            </tr>
            <tr><td> ---  </td><td>  ---  </td></tr>
            <tr>
                <td>資訊類型:</td>
                <td>
                    <select id="sendMsg">
                        <option value="text">text</option>
                        <option value="image">image</option>
                        <option value="news">news</option>
                        <option value="miniprogram">miniprogram</option>
                    </select>
                    <button class="login_btn" data-type="sendChatMessage" style="float: right;">發送到會話輸入框</button>
                </td>
            </tr>
            <tr><td> ---  </td><td>  ---  </td></tr>
        </table>
        <img id="preimg" src="https://ecfiles.dongao.com/ec/shop//goods/images/20210910/1631244760976019427.png">
        <button class="login_btn" data-type="checkJsApi">checkJsApi</button>
        <button class="login_btn" data-type="getContext">擷取進入H5頁面的入口環境</button>
        <button class="login_btn" data-type="getCurExternalChat">目前客戶群的群聊ID</button>
        <button class="login_btn" data-type="shareToExternalChat">群發消息到客戶群</button>
        <button class="login_btn" data-type="shareToExternalContact">群發消息到客戶</button>
        <button class="login_btn" data-type="selectExternalContact">外部聯系人選人接口</button>
        <button class="login_btn" data-type="openUserProfile">打開個人資訊頁接口</button>
        <button class="login_btn" data-type="launchMiniprogram">打開小程式</button>
        <button class="login_btn" data-type="navigateToAddCustomer">添加客戶界面</button>
        <a class="login_btn" href="javascript:sendUrl();" target="_blank">發送網頁</a>
        <a class="login_btn" href="javascript:authorize();" target="_blank">網頁</a>
        <button class="login_btn" data-type="previewImage">預覽</button>
        <button class="login_btn" data-type="chooseImage">拍照或從手機相冊中選圖</button>
        <button class="login_btn" data-type="downloadImage">下載下傳圖檔</button>
        <button class="login_btn" data-type="uploadImage">上傳圖檔</button>
        <br>
        <br>
        <textarea cols="20" class="sec_input_t" rows="10" id="biao2">使用者定義的代碼區域</textarea>
        <input type="hidden" cols="20" class="sec_input_t" rows="10" id="biao1" value="大神福利跨境電商反使用者定義的代碼區域<br>得到的的的示範法"/>
        <input type="button" onClick="copyUrl2()" value="點選複制代碼" />
        <br>
        <br>


        <input type="file" id="chooseimg1" accept="MIME_type"   value=""/>
        <a href="http://vip.admin.test.com/login">全部發送2</a>


    </div>

<input type="hidden" id="jsapi_ticket" value="${jsapi_ticket}" />
<input type="hidden" id="timestamp" value="${timestamp}" />
<input type="hidden" id="signature" value="${signature}" />
<input type="hidden" id="unionId" value="" />
<div class="logon1 clearfix">
<%--    輸入自定義内容:<input type="text" id="random" value=""/><br>--%>


</div>
</body>
<script src="//res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
<script src="https://open.work.weixin.qq.com/wwopen/js/jwxwork-1.0.0.js"></script>

<script>
    var url = location.href.split('#').toString();//url不能寫死
    //dongaota
    var appid = "ww07e5628846641622";

    var signature = $("#signature").val();
    var timestamp = $("#timestamp").val();
    var jsapi_ticket = $("#jsapi_ticket").val();

    var signature1 = '${signature1}';
    var timestamp1 = '${timestamp1}';

    $(function () {
        $('.go_app').on('click',function () {
            thirdLogin();
        });
    })
    
    function authorize() {
        var _actUrl = "http://23244704iy.51mypc.cn/qywx/authorize"
        var _url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww07e5628846641622&redirect_uri="+encodeURIComponent(_actUrl)+"&response_type=code&scope=snsapi_base&state=#wechat_redirect";

        // window.open(_url);
        // window.open('https://www.w3school.com.cn/tiy/t.asp?f=eg_html_input_type_file');
        window.location.href = 'https://appfront.dongao.com/app/handout/V1.1/handoutInfo?appName=da-cloudclass-app&appVersion=3.1.4&debugMode=0&deviceType=1&lectureId=114473&model=OPPOR11&osType=android&osVersion=8.1.0&sign=1641f0c17735754c4372f1dce166247c&timeStamp=1632985200475&token=02f7743d4ed19223552f3095f7b7d002&uniqueId=dfd3b9c49c8d0317&userId=39119061&versionCode=106';
    }

    function sendUrl() {
        var _actUrl = "http://23244704iy.51mypc.cn/qywx/authorize"
        var _url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww07e5628846641622&redirect_uri="+encodeURIComponent(_actUrl)+"&response_type=code&scope=snsapi_base&state=#wechat_redirect";

        $('#random').val(_url);
    }

    function copyUrl2()
    {
        var Url2=document.getElementById("biao1");
        Url2.select(); // 選擇對象
        document.execCommand("Copy"); // 執行浏覽器複制指令得到的的的示範法
        alert("已複制好,可貼粘。");
    }

    function init() {
        wx.ready((function() {
                wx.invoke('getCurExternalContact', {
                }, function(res){
                    if(res.err_msg == "getCurExternalContact:ok"){
                        var userId  = res.userId ; //傳回目前外部聯系人userId
                        $("#user").val(userId)
                        $("#user").html(userId)

                        $.ajax({
                            url : "/qywx/getUserInfo",
                            type : "get",
                            data : {"externalUserid":userId},
                            dataType:"json",
                            success : function(data){
                                console.log(JSON.stringify(data))
                                $("#avatar").attr("src",data.external_contact.avatar);
                                $("#name").html(data.external_contact.name);
                                $("#unionId").val(data.external_contact.unionid);
                                var gender = data.external_contact.gender == 1 ? '男' : '女';
                                var type = data.external_contact.type == 1 ? '微信使用者' : '企業微信使用者';

                                var followUsers = data.follow_user;
                                var userIds = ""
                                for(var i=0;i<followUsers.length;i++){
                                    userIds += followUsers[i].userid +" ";
                                }

                                var html = "";
                                html += '<tr><td>性别:</td><td>'+gender+'</tr>';
                                html += '<tr><td>外部聯系人的類型:</td><td>'+type+'</tr>';
                                html += '<tr><td>添加了此外部聯系人的企業成員userId:</td><td>'+userIds+'</tr>';
                            // <tr><td>性别:</td><td></td></tr>
                                $("#curInfo").html(html);

                                console.log(html)

                            },
                            error : function(){
                                $("#memb , #loading").hide();
                                showErrorDiv("網絡不給力,請稍後重試!");
                            }
                        });

                    }else {
                        //錯誤處理
                    }
                });
            }
        )),
        wx.error((function(e) {
                    alert(JSON.stringify(e))
                }
        ));
    }

    function thirdLogin() {
        var _unionId = $("#unionId").val();
        if(_unionId == '' || _unionId == null){
            alert("未擷取到unionId");
            return false;
        }
        $.ajax({
            url : "/userApi/user/V1/thirdLogin",
            type : "get",
            data : {"unionId":_unionId},
            dataType:"json",
            success : function(data){
                console.log(JSON.stringify(data))

                if(data.code == 3){
                    alert("新使用者注冊");
                    return;
                }
                alert("東奧使用者名:"+data.obj.username+"\n手機号:"+data.obj.mobilePhone)
            },
            error : function(){
            }
        });
    }

</script>
<script type="text/javascript" src="${imagePath}/static/qy/qy.js"></script>
</html>      

qy.js

wx.config({
    beta: true,// 必須這麼寫,否則wx.invoke調用形式的jsapi會有問題
    debug: true, // 開啟調試模式,調用的所有api的傳回值會在用戶端alert出來,若要檢視傳入的參數,可以在pc端打開,參數資訊會通過log打出,僅在pc端時才會列印。
    appId: appid, // 必填,企業微信的corpID
    timestamp: timestamp, // 必填,生成簽名的時間戳
    nonceStr: 'adfqwer', // 必填,生成簽名的随機串
    signature: signature,// 必填,簽名,見 附錄-JS-SDK使用權限簽名算法
    jsApiList: ['checkJsApi'],// 必填,需要使用的JS接口清單,凡是要調用的接口都需要傳進來
    success: function(res) {
        // 回調
        alert('成功config');
        // init();

    },
    fail: function(res) {
        alert(res.errMsg)
    }
});


wx.ready((function() {
        wx.checkJsApi({
            jsApiList: ['agentConfig'], // 需要檢測的JS接口清單,所有JS接口清單見附錄2,
            success: function(res){
            // 以鍵值對的形式傳回,可用的api值true,不可用為false
            // 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}
                wx.agentConfig({
                    corpid: appid, // 必填,企業微信的corpid,必須與目前登入的企業一緻
                    agentid: '1000006', // 必填,企業微信的應用id (e.g. 1000247)
                    timestamp: timestamp1, // 必填,生成簽名的時間戳
                    nonceStr: 'adfqwer', // 必填,生成簽名的随機串
                    signature: signature1,// 必填,簽名,見附錄-JS-SDK使用權限簽名算法
                    jsApiList: ['chooseImage','downloadImage','uploadImage','previewImage','imagePreview',//媒體圖像
                        'selectExternalContact','getContext','sendChatMessage','getCurExternalChat','shareToExternalChat',
                        'shareToExternalContact','openUserProfile','getCurExternalContact','launchMiniprogram','navigateToAddCustomer'], //必填,傳入需要使用的接口名稱
                    success: function(res) {
                        // 回調
                        // alert('成功');
                        init();
                    },
                    fail: function(res) {
                        // if(res.errMsg.indexOf('function not exist') > -1){
                        //     alert('版本過低請更新')
                        // }
                        alert(res.errMsg)
                    }
                });
            }
        })

        $("[data-type]").on("click", (function(e) {
                switch ($(e.target).attr("data-type")) {
                    case "checkJsApi":
                        wx.checkJsApi({
                            jsApiList: ["getNetworkType", "previewImage", "onHistoryBack"],
                            success: function(e) {
                                // alert(JSON.stringify(e))
                            }
                        });
                        break;
                    case "getContext":
                        wx.invoke('getContext', {
                        }, function(res){
                            if(res.err_msg == "getContext:ok"){
                                var entry  = res.entry ; //傳回進入H5頁面的入口類型,目前有normal、contact_profile、single_chat_tools、group_chat_tools、chat_attachment
                                alert(entry);
                            }else {
                                //錯誤處理
                            }
                        });
                        break;
                    case "sendChatMessage":
                        var type = $("#sendMsg").val();
                        var mediaId = $('#upimg').val();
                        if(type == 'text'){
                            if($("#random").val() == ""){
                                alert("請輸入具體内容");
                                return false;
                            }
                        }else if(type == 'image'){
                            if(mediaId == '' || mediaId == null){
                                alert("請上傳圖檔素材");
                                return false;
                            }
                        }
                        wx.invoke('sendChatMessage', {
                            msgtype: type, //消息類型,必填
                            text: {
                                content:$("#random").val() == "" ? "dddd" : $("#random").val(), //文本内容
                            },
                            miniprogram: {
                                appid: "wxd72ee341353ba2db",//小程式的appid
                                title: "這是一道題", //小程式消息的title
                                imgUrl:"https://yd-t-1252590610.cos.ap-beijing.myqcloud.com/zy_test/2.jpg",//小程式消息的封面圖。必須帶http或者https協定頭,否則報錯 $apiName$:fail invalid imgUrl
                                page:"pages/index/index.html", //小程式消息打開後的路徑,注意要以.html作為字尾,否則在微信端打開會提示找不到頁面
                            },
                            news: {//{"errcode":0,"errmsg":"ok","url":"https://wework.qpic.cn/wwpic/970933_co_7EaaCQTimBYo_1621497789/0"}
                                link: "https://www.baid.com", //H5消息頁面url 必填
                                title: "葫蘆娃", //H5消息标題
                                desc: "就是測測", //H5消息摘要
                                imgUrl: "https://wework.qpic.cn/wwpic/970933_co_7EaaCQTimBYo_1621497789/0", //H5消息封面圖檔URL
                            },
                            image:{ //{"errcode":0,"errmsg":"ok","type":"image","media_id":"34OtvN1PWj9CkCi84HKhALvwMUJAUqxMUt7ONOL74k94pIb2qNr_C73C3DirFrtpd","created_at":"1621498090"}
                                // mediaid: "34OtvN1PWj9CkCi84HKhALvwMUJAUqxMUt7ONOL74k94pIb2qNr_C73C3DirFrtpd", //圖檔的素材id
                                mediaid: mediaId, //圖檔的素材id
                            },
                        }, function(res) {
                            if (res.err_msg == 'sendChatMessage:ok') {
                                //發送成功
                                // alert("成功");
                            }
                        })
                        break;
                    case "getCurExternalChat":
                        wx.invoke('getCurExternalChat', {
                        }, function(res){
                            if(res.err_msg == "getCurExternalChat:ok"){
                                // chatId  = res.chatId ; //傳回目前客戶群的群聊ID
                                $("#random").val(res.chatId)
                            }else {
                                //錯誤處理
                            }
                        });
                        break;
                    case "shareToExternalChat":
                        wx.invoke("shareToExternalChat", {
                                text: {
                                    content: $("#random").val() == "" ? "預設" : $("#random").val(),    // 文本内容
                                }
                            },function(res) {
                                if (res.err_msg == "shareToExternalChat:ok") {
                                }
                            }
                        );
                        break;
                    case "shareToExternalContact":
                        wx.invoke("shareToExternalContact", {
                                text: {
                                    content: $("#random").val() == "" ? "預設" : $("#random").val(),    // 文本内容
                                }
                            },function(res) {
                                if (res.err_msg == "shareToExternalChat:ok") {
                                }
                            }
                        );
                        break;
                    case "selectExternalContact":
                        wx.invoke('selectExternalContact', {
                            "filterType": 0, //0表示展示全部外部聯系人清單,1表示僅展示未曾選擇過的外部聯系人。預設值為0;除了0與1,其他值非法。在企業微信2.4.22及以後版本支援該參數
                        }, function(res){
                            if(res.err_msg == "selectExternalContact:ok"){
                                var userIds  = res.userIds ; //傳回此次選擇的外部聯系人userId清單,數組類型
                                $("#user").val(userIds);
                            }else {
                                //錯誤處理
                            }
                        });

                        break;
                    case "openUserProfile":
                        var type = $("#userType").val();
                        if(type == 0){
                            alert("請選擇聯系人類型");
                            return false;
                        }
                        wx.invoke('openUserProfile', {
                            "type": type, //1表示該userid是企業成員,2表示該userid是外部聯系人
                            "userid": $("#user").val() //可以是企業成員,也可以是外部聯系人
                        }, function(res){
                            alert(JSON.stringify(res))
                            if(res.err_msg != "openUserProfile:ok"){
                                //錯誤處理
                                alert(res.err_msg)
                            }
                        });
                        break;
                    case "launchMiniprogram":
                        wx.invoke('launchMiniprogram', {
                                "appid" : "wxd72ee341353ba2db", // 需跳轉的小程式appid
                                "path" : "pages/index/index.html", // 所需跳轉的小程式内頁面路徑及參數。非必填
                            }, function(res) {
                                if(res.err_msg == "launchMiniprogram:ok") {
                                    // 正常
                                } else {
                                    // 錯誤處理
                                }
                            }
                        );
                        break;
                    case "navigateToAddCustomer":
                        wx.invoke('navigateToAddCustomer',
                            {},
                            function(res) {
                            });
                        break;
                    case "previewImage":
                        wx.previewImage({
                            current: 'http://ecafiles.test.com/ec/shop//goods/images/20210910/1631244760976019427.png', // 目前顯示圖檔的http連結
                            urls: ['http://ecafiles.test.com/ec/shop//goods/images/20210910/1631244760976019427.png',
                                'http://ecafiles.test.com/ec/shop//goods/images/20210923/1632376417655087307.jpg'] // 需要預覽的圖檔http連結清單
                            ,
                            success: function (res) {
                                alert(JSON.stringify(res))
                            },
                            fail: function(res) {
                                // if(res.errMsg.indexOf('function not exist') > -1){
                                //     alert('版本過低請更新')
                                // }
                                alert(res.errMsg)
                            }
                        });
                        break;
                    case "chooseImage":
                        wx.chooseImage({
                            count: 1, // 預設9
                            sizeType: ['original', 'compressed'], // 可以指定是原圖還是壓縮圖,預設二者都有
                            sourceType: ['album'], // 可以指定來源是相冊還是相機,預設二者都有 , 'camera'
                            defaultCameraMode: "normal", //表示進入拍照界面的預設模式,目前有normal與batch兩種選擇,normal表示普通單拍模式,batch表示連拍模式,不傳該參數則為normal模式。從3.0.26版本開始支援front和batch_front兩種值,其中front表示預設為前置攝像頭單拍模式,batch_front表示預設為前置攝像頭連拍模式。(注:使用者進入拍照界面仍然可自由切換兩種模式)
                            isSaveToAlbum: 1, //整型值,0表示拍照時不儲存到系統相冊,1表示自動儲存,預設值是1
                            success: function (res) {
                                var localIds = res.localIds; // 傳回標明照片的本地ID清單,
                                alert(localIds);
                                $('#chooseimg').val(localIds);

                                wx.uploadImage({
                                    localId: $('#chooseimg').val(), // 需要上傳的圖檔的本地ID,由chooseImage接口獲得
                                    isShowProgressTips: 1, // 預設為1,顯示進度提示
                                    success: function (res) {
                                        var serverId = res.serverId; // 傳回圖檔的伺服器端ID
                                        $('#upimg').val(serverId);
                                        alert('上傳成功');
                                    },
                                    fail: function(res) {
                                        // if(res.errMsg.indexOf('function not exist') > -1){
                                        //     alert('版本過低請更新')
                                        // }
                                        alert(res.errMsg)
                                    }
                                });
                                // andriod中localId可以作為img标簽的src屬性顯示圖檔;
                                // iOS應當使用 getLocalImgData 擷取圖檔base64資料,進而用于img标簽的顯示(在img标簽内使用 wx.chooseImage 的 localid 顯示可能會不成功)
                            },
                            fail: function(res) {
                                // if(res.errMsg.indexOf('function not exist') > -1){
                                //     alert('版本過低請更新')
                                // }
                                alert(res.errMsg)
                            }
                        });
                        break;
                    case "downloadImage":
                        var down = $('#upimg').val();
                        if(down == '' || down ==null){
                            alert("請上傳圖檔");
                            return;
                        }
                        wx.downloadImage({
                            serverId: down, // 需要下載下傳的圖檔的伺服器端ID,由uploadImage接口獲得
                            isShowProgressTips: 1, // 預設為1,顯示進度提示
                            success: function (res) {
                                var localId = res.localId; // 傳回圖檔下載下傳後的本地ID
                            }
                        });
                        break;
                    case "uploadImage":
                        var val = $('#chooseimg').val();
                        if(val == '' || val ==null){
                            alert("請選擇圖檔");
                            return;
                        }
                        wx.uploadImage({
                            localId: val, // 需要上傳的圖檔的本地ID,由chooseImage接口獲得
                            isShowProgressTips: 1, // 預設為1,顯示進度提示
                            success: function (res) {
                                var serverId = res.serverId; // 傳回圖檔的伺服器端ID
                                $('#upimg').val(serverId);
                                alert('上傳成功');
                            }
                        });
                        break;
                }
            }
        ));

        $('#preimg').on("click", function (e) {
            var attr = $(this).attr('src');
            wx.invoke('imagePreview', {
                    "current" : attr,
                "urls": [attr]

                }, function(res) {
                    if(res.err_msg == "launchMiniprogram:ok") {
                        // 正常
                    } else {
                        // 錯誤處理
                        // alert(JSON.stringify(res))
                    }
                }
            );

        })
    }
)),
wx.error((function(e) {
        alert(JSON.stringify(e))
    }
));
      

java

package com.dongao.api.controller.qywx;

import com.alibaba.fastjson.JSONObject;
import com.dongao.api.common.utils.HttpClientUtil;
import com.dongao.api.controller.BaseController;
import com.dongao.api.service.QywxService;
import com.dongao.phoenix.cache.app.api.AppRedisCacheApi;
import com.dongao.phoenix.cache.yd.api.activity.YdActivityCacheApi;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

@Controller
@RequestMapping(value = "/qywx")
public class QyWxTestController extends BaseController {

    @Autowired
    private AppRedisCacheApi appRedisCacheApi;

    private String corpid = "企業id";//東奧Ta
    private String corpsecret = "聯系人secret";//secret
    private String yysecret = "自建應用 secret";//自建應用 secret

    @Autowired
    private QywxService qywxService;


    @RequestMapping(value = "test", method = RequestMethod.GET)
    public ModelAndView test(String userId) {
        ModelAndView mav = new ModelAndView();

        //企業級相關參數封裝---start
        String token = qywxService.getToken(corpid, yysecret);
        String qyTicket = qywxService.getQyTicket(token);

//        String jsapi_ticket = "HoagFKDcsGMVCIY2vOjf9jrUNEJNLLR2WPkrgMMDKw74iOsUPpswCqNNxac1LhI_TmA0SfykOWBod3o3a0y4Bg";
        String noncestr = "adfqwer";
        Long timestamp = System.currentTimeMillis()/1000;
        String url = request.getRequestURL().toString();

        String s1 = "jsapi_ticket="+qyTicket+"&noncestr="+noncestr+"&timestamp="+timestamp+"&url="+url;

        String signature = DigestUtils.sha1Hex(s1);
        System.out.println(s1+"---"+signature);

        mav.addObject("jsapi_ticket",qyTicket);
        mav.addObject("noncestr",noncestr);
        mav.addObject("timestamp",timestamp);
        mav.addObject("signature",signature);
        //企業級相關參數封裝---end

        //應用級相關參數封裝---start
//        String token2 = qywxService.getToken(corpid, yysecret);
        String smallTicket = qywxService.getSmallTicket(token);

//        String jsapi_ticket1 = "EdbdhSr1jvTn/2K4zJfjCg==";
        String noncestr1 = "adfqwer";
        Long timestamp1 = System.currentTimeMillis()/1000;
        String s2 = "jsapi_ticket="+smallTicket+"&noncestr="+noncestr1+"&timestamp="+timestamp1+"&url="+url;
        String signature1 = DigestUtils.sha1Hex(s2);

        System.out.println("s2****"+s2+"-----"+signature1);
        mav.addObject("noncestr1",noncestr1);
        mav.addObject("timestamp1",timestamp1);
        mav.addObject("signature1",signature1);
        //應用級相關參數封裝---end
        mav.setViewName("qy/test");
        return mav;

    }


    @RequestMapping("/getUserInfo")
    @ResponseBody
    public String getExternalUserInfo(Model model, String externalUserid) {

        String token = qywxService.getToken(corpid, corpsecret);
        String externalUserInfo = qywxService.getExternalUserInfo(token, externalUserid, null);

        System.out.println(externalUserInfo);
        return externalUserInfo;

    }


    /**
     * 網頁授權
     * @param code
     * @return
     */
    @RequestMapping(value = "authorize", method = RequestMethod.GET)
    public ModelAndView authorize(String code) {

        ModelAndView mav = new ModelAndView();

        String userInfo =  qywxService.getuserinfoByCode(code, qywxService.getToken(corpid, yysecret));

        mav.addObject("user", JSONObject.parse(userInfo));
        mav.setViewName("qy/authorize");
        return mav;
    }



}
      

備注:

擷取企業的jsapi_ticket https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket 擷取應用的jsapi_ticket https://qyapi.weixin.qq.com/cgi-bin/ticket/get

都可以使用 應用secret 擷取的accesstoken 進行擷取兩個ticket