(廣西廣播電視技術(shù)中心)
微信是騰訊公司于2011年推出的一個為智能終端提供即時通訊服務的免費應用程序,目前已有超過9億用戶,成為中國社會互聯(lián)網(wǎng)社交的一種生活方式。騰訊公司利用個人微信的廣大用戶基數(shù),擴展了訂閱號、服務號和企業(yè)號,隨后企業(yè)號發(fā)展為企業(yè)微信。企業(yè)微信提供了通訊錄管理、應用管理、消息推送、身份驗證、移動端SDK、素材、OA數(shù)據(jù)接口、企業(yè)支付、電子發(fā)票等接口(API),開發(fā)人員可以使用這些API,為企業(yè)接入更多個性化的辦公應用。同時,開發(fā)人員還可以開發(fā)出其他不依賴于微信API的獨立運行的后臺應用,僅使用微信客戶端來呈現(xiàn)前端頁面。
由后臺程序向微信客戶端主動發(fā)送消息是常用的一種應用。企業(yè)微信開放了消息發(fā)送接口,企業(yè)可以使用這些接口讓自定義應用與企業(yè)微信后臺或用戶間進行雙向通信。在此,后臺程序可以按需求自動判斷發(fā)送條件、自主組織消息形式、選擇接收用戶等。可發(fā)送的消息類型主要包括文本、圖片、語音、視頻、文件、文本卡片、圖文消息,多種類型的消息極大的滿足了企業(yè)應用的需求。
主動發(fā)送消息是指,企業(yè)后臺調(diào)用接口通過應用向指定成員發(fā)送消息。其時序圖如圖1所示。
企業(yè)應用的后臺程序按照微信給定的方式向微信授權(quán)API發(fā)送已知的corpid和secret,微信API端返回包含了access_token等信息的json串,開發(fā)者提取出access_token并用于發(fā)消息接口,此時企業(yè)應用與微信端才建立起連接并互相取得信任,然后才能開始后臺程序與企業(yè)微信之間的交互。access_token有時效性,過期后要再次訪問授權(quán)接口來獲取。后臺程序自定義的消息主體data也是json串,它和access_token一起被發(fā)送至微信API,再由微信API發(fā)送至微信后臺,最終由微信后臺轉(zhuǎn)發(fā)至個人微信app。
圖1 主動發(fā)送消息時序圖
在后臺程序向企業(yè)微信主動發(fā)送消息時,主要用到以下信息:
1.corpid:每個企業(yè)都擁有唯一的corpid;
2.userid: 每個成員都有唯一的userid,即所謂“帳號”;
3.agentid: 每個應用都有唯一的agentid;
4.secret:secret是企業(yè)應用里面用于保障數(shù)據(jù)安全的“鑰匙”,每一個應用都有一個獨立的訪問密鑰,為了保證數(shù)據(jù)的安全,secret不能泄漏。目前secret有兩種:一是通訊錄管理secret,二是應用secret,主動發(fā)送消息主要用的是應用secret。每個應用有獨立的secret,所以每個應用的access_token應該分開來獲??;
5.access_token:access_token是企業(yè)后臺去企業(yè)微信的后臺獲取信息時的重要票據(jù),由corpid和secret產(chǎn)生。所有接口在通信時都需要攜帶此信息用于驗證接口的訪問權(quán)限。
依據(jù)主動發(fā)送消息的機制,程序設計為兩個部分:企業(yè)應用的后臺程序和訪問微信API的接口程序。后臺程序用于滿足企業(yè)應用的各種需求,如判斷發(fā)送條件、組織消息及形式、選擇接收用戶、返回用戶訪問信息等。接口程序用于向微信端發(fā)送認證、建立連接、發(fā)送消息、建立用戶訪問界面等與微信的各種交互。
本文根據(jù)實際工作需求,從處于內(nèi)網(wǎng)的OA系統(tǒng),向用戶發(fā)送工作流消息提醒,即當用戶有新的工作流時,在微信app上會接收到企業(yè)號推送的文本消息。因此,本文設計的兩部分程序分別如下所述。
在此,后臺程序主要用于掃描數(shù)據(jù)庫,查找滿足發(fā)送條件的用戶名、消息內(nèi)容、調(diào)用接口程序,并根據(jù)返回值判斷是否發(fā)送成功改寫數(shù)據(jù)表等。因為此程序具有機械重復的特性,采用Python語言編寫.exe可執(zhí)行程序,可大大提高掃描效率和節(jié)省內(nèi)存開支。具體程序如表1所示:
表1 后臺程序
#c u r.e x e c u t e("s e l e c t u s e r_i d f r o m w e b m a i l")c o n n = p y m y s q l.c o n n e c t(h o s t='1 2 7.0.0.1',u s e r='r o o t',p a s s w o r d='*****',d b='T D_O A',p o r t=****,c h a r s e t='u t f 8')c u r = c o n n.c u r s o r()p r i n t "b e g i n f l o w"s q l=u"S E L E C T a.t o_i d, a.b o d y_i d, b.f r o m_i d, b.c o n t e n t,a.s m s_i d,c.w x_u i d F R O M s m s a, s m s_b o d y b,w e i x i n_m e m b e r c W H E R E a.t o_i d=c.w x_u n a m e A N D a.r e m i n d_f l a g>=1 A N D b.s m s_t y p e=7 A N D a.b o d y_i d=b.b o d y_i d A N D a.s m s_i d>1 1 2 0 2 9 0 A N D a.w x_f l a g=0 O R D E R B Y b.b o d y_i d D E S C"s q l=s q l.e n c o d e('u t f-8')c u r.e x e c u t e(s q l)r e s u l t = c u r.f e t c h a l l()f o r r o w i n r e s u l t:s q l_u p d a t e=u"u p d a t e s m s s e t w x_f l a g=1 w h e r e s m s_i d=%d" % r o w[4]t e x t = r o w[3].e n c o d e('u t f-8')u s e r = r o w[5].e n c o d e('u t f-8')p a r a m s = {"t o u s e r":u s e r,"a g e n t i d":"6","c o n t e n t":t e x t}r = r e q u e s t s.p o s t('h t t p://1 9 2.1 6 8.***.***/***/T D-r e s p o n s e-***.p h p',p a r a m s)r e s u l t = r.t e x t.e n c o d e('u t f-8')i f 's u c c e s s' i n r e s u l t:p r i n t s q l_u p d a t e c u r.e x e c u t e(s q l_u p d a t e)c o n n.c o m m i t()p r i n t "e n d f l o w"c u r.c l o s e()c o n n.c l o s e()t i m e.s l e e p(4)
此程序間隔4秒掃描一次數(shù)據(jù)庫,查找該接收微信消息的用戶和消息主體,組織成json串形式的參數(shù),調(diào)用接口程序并傳參;若返回值中含有success,則改寫數(shù)據(jù)表。一次發(fā)送完成。
企業(yè)微信提供了許多接口地址,但是仍需要開發(fā)人員編寫接口程序。本文的接口程序采用php語言編寫如表2,使用了跨域訪問函數(shù)curl()。
表2 接口程序
$opt[CURLOPT_SSL_VERIFYPEER]= FALSE;}curl_setopt_array($ch,$opt);$data = curl_exec($ch);curl_close($ch);return $data;}$corpid="wx***********7b6";$corpsecret="5Gw********_*************V1I";$Url="https://qyapi.weixin.qq.com/cgi-bin/ge ttoken?corpid=$corpid&corpsecret=$corpsecret";$res = curlPost($Url);$ACCESS_TOKEN=json_decode($res)->access_token;$Url="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$ACCESS_TOKEN";$touser=$_POST['touser'];$msgtype="text";$agentid=**********;$content=$_POST['content'];$safe=0;$arr=array('touser'=>$touser,'msgtype'=>$msgtype,'agentid'=>$agentid,'text'=>array('content'=>$content),'safe'=>0);$data=json_encode($arr);$res = curlPost($Url,$data);$errmsg=json_decode($res)->errmsg;if($errmsg==="ok"){echo "success";}else{echo "error".$errmsg;}?>
該程序首先發(fā)送corpid和corpsecret到指定地址以獲取access_token;接收后臺程序發(fā)送來的參數(shù),組合其他信息形成data的json串,再將access_token和data發(fā)送至指定地址,由微信端向個人用戶發(fā)送消息;最后微信端會向接口程序返回相關(guān)信息。
因業(yè)務的特殊性,OA系統(tǒng)部署在內(nèi)網(wǎng)web服務器上,向外網(wǎng)微信端發(fā)送消息要經(jīng)過重重關(guān)卡。大致的網(wǎng)絡結(jié)構(gòu)圖如圖2所示。
根據(jù)網(wǎng)絡結(jié)構(gòu),本文設計把后臺程序部署在內(nèi)網(wǎng)OA服務器上,把接口程序部署在DMZ區(qū)的前置服務器上。當后臺程序發(fā)送微信消息時,首先調(diào)用前置服務器上的接口程序,由接口程序向微信端發(fā)送交互請求和消息主體。用戶訪問企業(yè)應用時,首先訪問的是前置服務器上的頁面,再由頁面程序與后臺程序進行交互。采用此種程序部署方式,只暴露了接口程序和訪問頁面,大大的提高了后臺程序和后臺服務器的安全性。
目前該程序已經(jīng)部署并正常使用,發(fā)送消息準確、及時。現(xiàn)在程序只使用了文本消息,后續(xù)還可開發(fā)更多形式的消息推送,或利用企業(yè)微信提供的接口還可開發(fā)功能更多更復雜的后臺程序,如考勤、辦公、文件共享等。微信用戶以后仍會增多,微信程序會更加普及,企業(yè)微信的開發(fā)和利用,使得職工在不增加手機app、不增加內(nèi)存消耗的情況下,就能便利的享受企業(yè)文化、接收企業(yè)信息和接受企業(yè)的管理。
[1]騰訊控股有限公司.企業(yè)微信API文檔.https://work.weixin.qq.com/api/doc
圖2 網(wǎng)絡結(jié)構(gòu)圖