异步接口
异步任务接口用于大批量数据的处理,提交后接口即返回,企业微信会在后台继续执行任务。执行完成后,通过任务事件通知企业获取结果。
异步接口目前只用于通讯录的更新。
用异步接口最大的好处是我们可以用Excel编辑好通讯录(csv格式),然后通过接口上传到企业微信,批量更新通讯录,更新完成后,会发送一个事件通知到Foxtable端的HTTP服务,我们可以据此获取批量操作的结果。
准备工作
1、首先设计一个名为BatchJob的表,用于记录异步操作信息,表结构如下:
2、在HtppRequest事件增加代码,用于接收异步操作完成事件,参考代码:
If
e.Path =
"wefox" OrElse
e.path =
"wefox1"
Dim wbiz
As New
WXBizCrypt("wxa31aba4cd83af57e","foxtable","ilsmyivvRPNj0qxSiSzWCnqm7cy1w1RcS6w2LBhsh7J")
If e.Request.HttpMethod
= "GET"
Dim ret
As Integer =
wbiz.CheckQYSignature(e)
If ret
<> 0 Then
'如果接入验证失败
Dim err
As String =
wbiz.GetErorDesc(ret)
'获取错误描述
End If
ElseIf e.Request.HttpMethod
= "POST"
'
Dim st
As New
Date(1970,1,1,8,0,0)
Dim msg
As String =
wbiz.DecryptMsg(e)
'解密
If IsNumeric(msg)
Then
'如果解密失败
Dim err
As String =
wbiz.GetErorDesc(CInt(msg))
'获取错误描述
Return
End If
Dim xo
As Foxtable.XObject =
Foxtable.XObject.Parse(msg)
Select Case
xo("MsgType")
Case "text","image","voice","video","shortvideo"
'普通消息
Case
"event" '处理事件
Dim
CorpID As
String = xo("ToUserName")
'企业微信的CorpID
Dim
UserID As
String = xo("FromUserName")
'用户的UserID
Dim
CreateTime As
Date = st.AddSeconds(xo("CreateTime"))
'发送事件
Dim
AgentID As
String = xo("AgentID")
'应用ID
Dim
key As
String = xo("EventKey")
'如果是菜单事件,用于获取按钮的Key或URL,其它事件返回空|
Dim
logFile As
String = "c:\data\wxlog"
& Format(Date.Today,"yyyyMMdd")
& ".txt"
'你可以选择每日或每月一个日志文件
Select
Case xo("Event")
Case
"subscribe" '关注事件
Case
"unsubscribe"
'取消关注事件
Case
"LOCATION"
'上报地理位置事件
Case
"enter_agent"
'进入应用事件
Case
"click" '普通单击事件
Case
"view" '单击跳转到网页事件
Case
"scancode_push","scancode_waitmsg"
'两种扫描二维码事件
Case
"pic_sysphoto","pic_photo_or_album","pic_weixin"
'三种发送图片事件
Case
"location_select"
'主动上报地理位置事件
Case
"batch_job_result"
'异步任务完成事件
Dim Filter
As String =
"JobId = '" &
xo("BatchJob")("JobId").ToString
& "'"
DataTables("BatchJob").AppendLoad(Filter)
Dim
dr As
DataRow = DataTables("BatchJob").Find(Filter)
If
dr IsNot
Nothing Then
dr("JobType")
= xo("BatchJob")("JobType")
dr("ErrCode")
= xo("BatchJob")("ErrCode")
dr("ErrMsg")
= xo("BatchJob")("ErrMsg")
dr.Save()
End
If
End
Select
End
Select
End
If
End
If
批量更新成员
异步操作目前可以实现批量更新成员,全员覆盖成员,全员覆盖部门三项操作。
下面以批量更新成员为例,介绍一下操作过程。
1、首先从下载腾讯提供的模板,地址为:
https://work.weixin.qq.com/wework_admin/downloadfile/batch_user_sample.csv
2、模版文件是csv格式,这是一个文本文件,你可以直接用记事本打开编辑,或者用Excel打开编辑:
如果用Excel编辑,编辑结束后,不能直接保存,只能执行另存命令,选择文件格式为"csv"保存,切记切记。
注意事项:
3、假定基于模板编辑好的成员数据文件为"c:\data\users.csv",我们先要将此文件上传到到微信服务器才能调用,代码为:
Dim
url As
String =
"https://qyapi.weixin.qq.com/cgi-bin/material/add_material?type=file&access_token={0}"
Dim
hc As
new HttpClient(CExp(url,
Functions.Execute("GetQYAccessToken")))
hc.Files.Add("media","c:\data\users.csv")
'指定要上传的普通文件
Dim
jo As
JObject = JObject.Parse(
hc.getdata)
If
jo("errcode")
= "0" Then
Dim dr
As DataRow =
DataTables("Materials").AddNew()
dr("type")=
"file"
dr("mediaID")
= jo("media_id")
dr("UpdateTime")
= Date.Now
dr("FileName") =
"users.csv"
dr.Save()
Else
MessageBox.Show(jo.ToString)
End
If
实际上这是将成员数据文件作为一个素材上传的,具体参考后面的《素材接口》这一章。
4、成员数据文件上传到微信服务器后,会返回一个素材ID(media_id),通过下面的代码,可以批量更新成员信息了:
Dim
url As
String =
"https://qyapi.weixin.qq.com/cgi-bin/batch/syncuser?access_token={0}"
Dim
hc As
new HttpClient(CExp(url,
Functions.Execute("GetQYAccessToken")))
Dim
jo As
New
JObject
jo("media_id")
=
"23GjbO9LxhlPSImEU3opz4pFFG7e71Liz7359NOIAOCFa7NVsn1iBuLNguROwqr64vCd2CdzFvIeI3k8VHFmjuQ"
'通讯录文件的素材ID
jo("callback")
= New
JObject
jo("callback")("url")
= "http://120.198.123.19/wefox/"
jo("callback")("token")
= "foxtable"
jo("callback")("encodingaeskey")
=
"ilsmyivvRPNj0qxSiSzWCnqm7cy1w1RcS6w2LBhsh7J"
hc.Content
= jo.Tostring()
jo =
JObject.Parse(hc.GetData)
If
jo("errcode")
= "0" Then
Dim dr
As DataRow =
DataTables("BatchJob").AddNew()
dr("JobId")
= jo("jobid")
dr.Save()
Else
MessageBox.Show(jo.ToString)
End
If
重要提示:
1、以上提交异步任务的代码,不能在在服务端项目运行,必须在另外的项目运行,否则会提示40057错误。
2、两个项目必须共用BatchJob表。
3、在开发阶段,如果你不想单独新建项目测试,可以另外启动一个Foxtable,打开服务端项目(不要开启HTTP服务)测试上述代码。
5、服务期在批量更新成员信息完成后,会发送一个通知事件到Foxtable的HTTP服务,我们之前在HttpRequwst设置的代码在接收到事件后,会在BatchJob表显示异步任务的执行结果:
可以通过下面的代码获取异步任务更详细的执行结果,保存在Result列中:
Dim
cr As
Row = Tables("BatchJob").Current
Dim
ul As
String =
"https://qyapi.weixin.qq.com/cgi-bin/batch/getresult?access_token={0}&jobid={1}"
Dim
AccessToken As
String = Functions.Execute("GetQYAccessToken")
Dim
JobId As
String = cr("JobId")
Dim
hc As
New HttpClient(CExp(ul,AccessToken,JobId))
Dim
jo As
JObject= JObject.Parse(hc.GetData)
cr("Result")=
jo.ToString()
执行结果的内容通常如下:
{
"errcode": 0,
"errmsg": "ok",
"type": "sync_user",
"total": 2,
"percentage": 100,
"remain_time": 0,
"status": 3,
"result": [
{
"userid": "taobo",
"errcode": 0,
"errmsg": "ok",
"action": 1
},
{
"userid": "yanggang",
"errcode": 0,
"errmsg": "ok",
"action": 1
}
]
}