发送模版消息

模版消息主要用于下发业务通知,没有48小时的限制,但必须遵守腾讯的运营规范,以免被封号:

关于模版消息接口,可以参考:

https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html

模版消息接口的内容很多,但实际上我们只需了解其中的发送接口即可,因为模版管理通常是在后台完成的。

测试号可以自定义消息模版,正式的公众号只能从模板库中选择模版。

下图是我在测试号中自定义的一个模版:

模版中类似{{name.DATA}}这样的内容,要在发送的时候替换为实际的内容,注意替换的时候使用的键 名不包括".DATA",例如{{number.DATA}}的键 名是number

下面的代码是我基于上述模版编写的发送代码,你可以直接在命令窗口执行测试:

Dim url As String = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={0}"
Dim
hc As New HttpClient(CExp(url, Functions.Execute("GetAccessToken")))
Dim
jo As New JObject
Dim
ja As New JArray
jo
("touser") = "ofjtFwBSZ5cNqTKLSKx2TNEAxfBI"
jo
("template_id") = "WPpt3ki1Haq-ERpQvWXAgT7IZbfO07mbKtjnRt1Kiek" '模板ID
jo
("url") = "http://www.foxtable.com"
jo
("data") = New JObject()
jo
("data")("name") = New JObject()
jo
("data")("name")("value") = "Foxtable"
jo
("data")("name")("color") = "#173177"
jo
("data")("number") = New JObject()
jo
("data")("number")("value") = "2"
jo
("data")("number")("color") = "#173177"
jo
("data")("expDate") = New JObject()
jo
("data")("expDate")("value") = "20191227"
jo
("data")("expDate")("color") = "#173177"
jo
("data")("expDate") = New JObject()
jo
("data")("expDate")("value") = "20191227"
jo
("data")("expDate")("color") = "#173177"
jo
("data")("remark") = New JObject()
jo
("data")("remark")("value") = "如有疑问,可联系客服QQ:800014337"
jo
("data")("remark")("color") = "#173177"
hc
.content = jo.Tostring()
jo
= JObject.Parse(hc.getdata)
If
jo("errcode") = "0" Then
    MessageBox.show("模版消息发送成功!")
Else
    Messagebox.Show(jo.ToString)
End If

下图是手机端收到的模版消息:



可以看到,模版消息内容是可以设置内容颜色的,常用颜色值可以参考:

http://www.w3school.com.cn/cssref/css_colornames.asp

接收模版消息发送完成事件

微信服务器在完成模版消息发送后,会推送一个事件到Foxtable端的Http服务,这样我们就能知道此模版消息是否已经送达用户。

要记录模版消息是否送达,我们首先要新建一个数据表,表名为TemplateMessage,结构为:

然后修改发送代码为:

Dim url As String = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={0}"
Dim
hc As New HttpClient(CExp(url, Functions.Execute("GetAccessToken")))
Dim
jo As New JObject
Dim
ja As New JArray
jo
("touser") = "ofjtFwBSZ5cNqTKLSKx2TNEAxfBI"
jo
("template_id") = "WPpt3ki1Haq-ERpQvWXAgT7IZbfO07mbKtjnRt1Kiek" '模板ID
jo
("url") = "http://www.foxtable.com"
jo
("data") = New JObject()
jo
("data")("name") = New JObject()
jo
("data")("name")("value") = "Foxtable"
jo
("data")("name")("color") = "#173177"
jo
("data")("number") = New JObject()
jo
("data")("number")("value") = "2"
jo
("data")("number")("color") = "#173177"
jo
("data")("expDate") = New JObject()
jo
("data")("expDate")("value") = "20191227"
jo
("data")("expDate")("color") = "#173177"
jo
("data")("expDate") = New JObject()
jo
("data")("expDate")("value") = "20191227"
jo
("data")("expDate")("color") = "#173177"
jo
("data")("remark") = New JObject()
jo
("data")("remark")("value") = "如有疑问,可联系客服QQ:800014337"
jo
("data")("remark")("color") = "#173177"
hc
.content = jo.Tostring()
jo
= JObject.Parse(hc.getdata)
If
jo("errcode") = "0" Then
    Dim dr As DataRow = DataTables("TemplateMessage").AddNew()
    dr("MsgID") = jo("msgid")
'
动态生成的消息ID,每个消息都不同
    dr("OpenID") = "ofjtFwBSZ5cNqTKLSKx2TNEAxfBI"
'
接收方OpenID
    dr("Description") = "这是消息内容说明"
    dr.Save()
Else
    Messagebox.Show(jo.ToString)
End
If

最后将Foxtable端的HttpRequest事件代码设置为:

Select Case e.path
    Case "wefox"
        If e.Request.HttpMethod.ToUpper = "GET"
            If Functions.Execute("VerifySignature",e) Then
                e.WriteString(e.GetValues("echostr"))
           
End If
        ElseIf e.Request.HttpMethod.ToUpper = "Post"
            Dim xo As Foxtable.XObject = Foxtable.XObject.Parse(e.PlainText)
            Dim st As New
Date(1970,1,1,8,0,0)
            Select Case xo("MsgType")
                Case "text","image"
                   
'保存和回复文本和图片消息的代码
               
Case "event"
                    Select Case xo("Event")
                        Case "subscribe"
'
关注事件
                           
'
处理用户关注事件的代码
                        Case "unsubscribe"
'
取消关注事件
                           
'
处理用户取消关注事件的代码'
                        Case "LOCATION"
'
上报地理位置事件
                           
'
处理用户上报地理位置的代码
                        Case "TEMPLATESENDJOBFINISH"
                            Dim dr As DataRow = DataTables("TemplateMessage").Find("MsgID = " & xo("MsgID").ToString)
                            If dr Is Nothing Then
                                dr = DataTables("TemplateMessage").AddNew()
                                dr("MsgID") = xo("MsgID")
'
动态生成的消息ID,每个消息都不同
                                dr("OpenID") = xo("FromUserName")
'
接收方OpenID
                           
End If
                            dr("Status") = xo("Status") '记录发送状态
                            dr.Save()
                    End Select
            End Select
        End
If

End
Select

大小写的问题

微信的接口有些混乱,以上面的代码为例,有个细节不知你是否已经留意到,发送代码中有一行:

dr("MsgID") = jo("msgid") '动态生成的消息ID,每个消息都不同

而Foxtbale端的HttpRequest事件中有一行类似代码:

dr("MsgID") = xo("MsgID") '动态生成的消息ID,每个消息都不同

前者是jo("msgid"),后者是xo("MsgID"),前者用的是小写的msgid,后者则是混合了大小写MsgID

我们在编写代码的时候,必须按照接口说明,严格区分大小写,否则是无法取到数据的。


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