一、前言
1.企業微信於2016年4月上線,是騰訊微信團隊打造的以辦公溝通工具爲主打定位的移動辦公平臺,它的slogan:讓每個企業都有自己的微信。
2.企業微信提供了通訊錄管理、應用管理、消息推送、身份驗證、移動端SDK、素材、OA數據接口、企業支付、電子發票等API,管理員可以使用這些API,爲企業接入更多個性化的辦公應用。
3.企業微信也是一個平臺,是一個統一的辦公入口,可以集成公司內部的系統(OA系統、HR系統、ERP系統、CRM系統等),直接在企業微信手機端就可以接收內部系統的消息和通知。
4.企業微信與微信企業號區別:其實兩個產品最大的其別就是微信企業號是基於微信,而企業微信是一個獨立app。企業微信,傾向於將工作和生活完全分開,以獨立app的形式去使用,更有着豐富的辦公應用,如預設打卡、審批、日報、公告等OA應用,如果你對這些應用不滿足,還可以通過API接入和第三方應用滿足更多個性需求。有一種說法: 微信企業號要合併到企業微信,然後慢慢淡化微信企業號的概念。
二、Demo演示
三、開發步驟
corpid:每個企業都有唯一的corpid:我的企業–企業信息
userid:每個成員都有唯一的userid(賬號):通訊錄–成員詳情頁
部門id:每個部門都有唯一的id:通訊錄-組織架構-部門右邊的小圓點
tagid:每個標籤都有唯一的標籤id:通訊錄-標籤
agentid:每個應用唯一的id:應用與小程序-應用詳情頁
secret:企業應用中用於保障數據安全的鑰匙【跟agentid配套】
—自建應用secret:應用與小程序–應用–自建–某應用
—基礎應用secret:【如審批,打卡等應用】企業與小程序–應用–基礎–某應用–點開API小按鈕
—通訊錄管理secret:通訊錄同步【需開啓api接口同步】
—外部聯繫人管理secret:外部聯繫人–點開API小按鈕
—access_token:是企業後臺去企業微信的後臺獲取信息時的重要 票據,
由corpid和secret產生。所有接口在通信時都需要攜帶access_token用於驗證接口的訪問權限。
企業微信的開發大體可分爲以下幾步:
(1)封裝實體類
參考官方文檔給出的請求包、回包(即響應包),封裝對應的java實體類。
(2)java對象的序列化
將java對象序列化爲json格式的字符串
(3)獲取AccessToken,拼接請求接口url
憑證的獲取方式有兩種(此處暫時存疑,以待勘誤):
通訊錄AccessToken:CorpId+通訊錄密鑰
其他AccessToken:CorpId+應用密鑰
(4)調用接口發送http請求
封裝好http請求方法:httpRequest(請求url, 請求方法POST/GET, 請求包);
3.1 申請企業微信
3.2 創建應用
3.3 處理消息
點擊剛剛創建的應用,點擊【接收消息】-【設置API接收】,在URL處填寫我方的地址,例如:http://xxxxxx/wx/cp/portal/1000004,負責接收微信發送的消息。
token,和encodingAESKey需要在服務端裏面進行配置,然後啓動服務,在花生殼映射好端口,點擊保存,成功了就配置好了。
驗證:在應用裏面發送消息,看是否會回覆。如果回覆了,就成功配置完成。
服務端項目地址:https://gitee.com/chenxingxing6/weixin-java-cp-demo
具體怎麼配置:項目readme裏面寫的很清楚。
3.4 發送消息demo
package com.demo;
import me.chanjar.weixin.cp.api.impl.WxCpServiceImpl;
import me.chanjar.weixin.cp.bean.WxCpMessage;
import me.chanjar.weixin.cp.bean.WxCpMessageSendResult;
import me.chanjar.weixin.cp.bean.article.NewArticle;
import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl;
/**
* 發送消息
*/
public class WeixinMessageDemo {
private static final Integer agentId = 1000004;
private static final String corpId = "ww0ff82e1e3";
private static final String corpSecret = "Mygabj9Vz7q0_OWU-8f-c";
private static final String user1 = "ChenXing";
private static WxCpDefaultConfigImpl config = new WxCpDefaultConfigImpl();
private static WxCpServiceImpl wxCpService;
static {
// 註冊的企業信息
config.setCorpId(corpId);
config.setCorpSecret(corpSecret);
wxCpService = new WxCpServiceImpl();
wxCpService.setWxCpConfigStorage(config);
}
public static void main(String[] args) throws Exception {
WxCpMessage cpMessage = null;
int chooseIndex = 1;
switch (chooseIndex){
case 0:{
cpMessage = TEXT();
break;
}
case 1:{
cpMessage = IMAGE();
break;
}
case 3:{
cpMessage = VOICE();
break;
}
case 4:{
cpMessage = VIDEO();
break;
}
case 5:{
cpMessage = NEWS();
break;
}
default:{
break;
}
}
WxCpMessageSendResult result = wxCpService.messageSend(cpMessage);
System.out.println(result);
}
/**
* 文本消息
* @return
*/
public static WxCpMessage TEXT(){
WxCpMessage message = WxCpMessage.TEXT()
.toUser(user1) // 用戶Id
.content("文本消息") // 消息
.agentId(agentId) // 應用Id
.build();
return message;
}
/**
* 圖片消息
* @return
*/
public static WxCpMessage IMAGE(){
WxCpMessage message = WxCpMessage.IMAGE()
.toUser(user1)
.mediaId("1JwpbLSisNzaUb8dGiR6stmseQcRORha2Md9DeV829-1W_G56F6gjsO5ClJ7isccW")
.agentId(agentId)
.build();
return message;
}
/**
* 語音消息
* @return
*/
public static WxCpMessage VOICE(){
WxCpMessage message = WxCpMessage.VOICE()
.toUser(user1)
.agentId(agentId)
.mediaId("media_id")
.build();
return message;
}
/**
* 視頻消息
* @return
*/
public static WxCpMessage VIDEO(){
WxCpMessage message = WxCpMessage.VIDEO()
.toUser(user1)
.agentId(agentId)
.mediaId("media_id")
.build();
return message;
}
/**
* 圖文消息
* @return
*/
public static WxCpMessage NEWS(){
NewArticle article1 = new NewArticle();
article1.setUrl("URL");
article1.setPicUrl("PIC_URL");
article1.setDescription("Is Really A Happy Day");
article1.setTitle("Happy Day");
NewArticle article2 = new NewArticle();
article2.setUrl("URL");
article2.setPicUrl("PIC_URL");
article2.setDescription("Is Really A Happy Day");
article2.setTitle("Happy Day");
WxCpMessage message = WxCpMessage.NEWS()
.toUser(user1)
.agentId(agentId)
.addArticle(article1)
.addArticle(article2)
.build();
return message;
}
}
3.5 如何調用企業微信API?
1.引入js文件
方法一:在需要調用JS接口的頁面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.2.0.js
方法二:支持使用 AMD/CMD 標準模塊加載方法加載(以vue爲例)
$ npm install weixin-js-sdk --save
或
$ yarn add weixin-js-sdk --save
2.通過config接口注入權限驗證配置
所有需要使用JS-SDK的頁面必須先注入配置信息,否則將無法調用(同一個url僅需調用一次,對於變化url的SPA的web app可在每次url變化時進行調用)。而signature的如何生成可參考官網API,出於安全考慮,開發者必須在服務器端實現簽名的邏輯(即後端給出接口)。
wx.config({
beta: true,// 必須這麼寫,否則wx.invoke調用形式的jsapi會有問題
debug: true, // 開啓調試模式,調用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數,可以在pc端打開,參數信息會通過log打出,僅在pc端時纔會打印。
appId: '', // 必填,企業微信的corpID
timestamp: , // 必填,生成簽名的時間戳
nonceStr: '', // 必填,生成簽名的隨機串
signature: '',// 必填,簽名,見附錄1
jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表見附錄2
});
3.通過ready接口處理成功驗證
wx.ready(function(){
// config信息驗證後會執行ready方法,所有接口調用都必須在config接口獲得結果之後,config是一個客戶端的異步操作,所以如果需要在頁面加載時就調用相關接口,則須把相關接口放在ready函數中調用來確保正確執行。對於用戶觸發時才調用的接口,則可以直接調用,不需要放在ready函數中。
});
4.通過error接口處理失敗驗證
wx.error(function(res){
// config信息驗證失敗會執行error函數,如簽名過期導致驗證失敗,具體錯誤信息可以打開config的debug模式查看,也可以在返回的res參數中查看,對於SPA可以在這裏更新簽名。
});
驗證成功後,就可以調用微信API的其他接口了。
如果企業需要在打開的網頁裏面攜帶用戶的身份信息,第一步需要構造如下的鏈接來獲取code參數:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=CORPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect
員工點擊後,頁面將跳轉至 redirect_uri?code=CODE&state=STATE,企業可根據code參數獲得員工的userid。code長度最大爲512字節。
參考資料
企業微信 API文檔:https://work.weixin.qq.com/api/doc
開發時請留意企業微信與企業號的接口差異:https://work.weixin.qq.com/api/doc#12060
(1) Quick Start
https://github.com/Wechat-Group/weixin-java-tools/wiki/CP_Quick-Start
(2) 微信消息路由器
https://github.com/Wechat-Group/weixin-java-tools/wiki/CP_微信消息路由器
(3)WxCpConfigStorage
https://github.com/Wechat-Group/weixin-java-tools/wiki/CP_WxCpConfigStorage
(4)同步回覆消息
https://github.com/Wechat-Group/weixin-java-tools/wiki/CP_同步回覆消息
(5)刷新access_token
https://github.com/Wechat-Group/weixin-java-tools/wiki/CP_刷新access_token
(6)用戶身份二次驗證
https://github.com/Wechat-Group/weixin-java-tools/wiki/CP_用戶身份二次驗證
(7)主動發送消息
https://github.com/Wechat-Group/weixin-java-tools/wiki/CP_主動發送消息
(8)臨時素材(多媒體文件)管理
https://github.com/Wechat-Group/weixin-java-tools/wiki/CP_多媒體文件管理
(9) 用戶管理
https://github.com/Wechat-Group/weixin-java-tools/wiki/CP_用戶管理
(10)部門管理
https://github.com/Wechat-Group/weixin-java-tools/wiki/CP_部門管理
(11)標籤管理
https://github.com/Wechat-Group/weixin-java-tools/wiki/CP_標籤管理
(12)自定義菜單管理
https://github.com/Wechat-Group/weixin-java-tools/wiki/CP_自定義菜單管理
(13)OAuth2網頁授權
https://github.com/Wechat-Group/weixin-java-tools/wiki/CP_OAuth2網頁授權
(14)http代理支持
https://github.com/Wechat-Group/weixin-java-tools/wiki/CP_http代理支持
(15)如何調用未支持的接口
https://github.com/Wechat-Group/weixin-java-tools/wiki/CP_如何調用未支持的接口
(16)如何執行本項目單元測試
https://github.com/Wechat-Group/weixin-java-tools/wiki/CP_如何執行本項目單元測試
可以運行 demo-1 的代碼來對weixin-java-tools的有一個更好的瞭解。
項目demo-1: https://github.com/Wechat-Group/weixin-java-tools
啓動方式: https://github.com/Wechat-Group/weixin-java-tools/wiki/CP_demo代碼
企業微信開發異常整理:http://www.cnblogs.com/shirui/category/1053578.html