发送模版消息
模版消息主要用于下发业务通知,没有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")
= "2019年12月27日"
jo("data")("expDate")("color")
= "#173177"
jo("data")("expDate")
= New JObject()
jo("data")("expDate")("value")
= "2019年12月27日"
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")
= "2019年12月27日"
jo("data")("expDate")("color")
= "#173177"
jo("data")("expDate")
= New JObject()
jo("data")("expDate")("value")
= "2019年12月27日"
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。
我们在编写代码的时候,必须按照接口说明,严格区分大小写,否则是无法取到数据的。