异步接口

异步任务接口用于大批量数据的处理,提交后接口即返回,企业微信会在后台继续执行任务。执行完成后,通过任务事件通知企业获取结果。

异步接口目前只用于通讯录的更新。

用异步接口最大的好处是我们可以用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
    }
  ]
}


本页地址:http://www.foxtable.com/mobilehelp/topics/0226.htm