微信公眾號服務
# 微信公眾號服務
TaskRunner中內建微信公眾號服務的開發框架,使用者可以通過TaskRunner的開發,實現微信公眾號中的自動回覆訊息的功能,接下來將詳細說明微信公眾號開發的實現方法。
# 基本配置
微信推送伺服器需要使用到備案的域名以及包含公網IP可訪問的伺服器,在設定後續的專案前,請先提前準備好。
設定微信伺服器配置,注意下方的配置項要與微信公眾平臺中的伺服器配置一致。


# 使用方法
TaskRunner提供了推送接收訊息的介面,通過向此介面發送訊息,可以實現自定義配置的功能。
http://域名/WeixinServer/PushMessage
1
TaskRunner中微信伺服器的功能實現邏輯在自定程式ReplyWechatMessage
中,使用者可以在該自定程式中編寫程式碼,實現微信公眾號自定義回覆功能。支援回覆的訊息文字型別如下:
訊息型別 | 說明 |
---|---|
text | 接收到的內容格式為文字訊息 |
image | 接收到的內容格式為圖片訊息 |
location | 接收到的內容格式為位置資訊 |
link | 接收到的內容格式為鏈接 |
event | 接收到的內容格式為事件(使用者訂閱公眾號等事件) |
以下是ReplyWechatMessage
的功能結構,將在其中進行註釋說明。
var
docout: TNativeXml;
Articles,node:TXmlNode;
MsgType,MsgText:string;
touser, fromuser, msg: string;
url:String;
picurl:String;
var
event:string;
//使用文字回覆訊息的功能函式
function ReplyMsgText(Amsg:String):string;
begin
Result := '';
docout := TNativeXml.CreateName('xml',nil);
try
docout.Root.NodeNew('ToUserName').NodeAdd(docout.NodeNewTextType('ToUserName', touser, xeCData));
docout.Root.NodeNew('FromUserName').NodeAdd(docout.NodeNewTextType('FromUserName', fromuser, xeCData));
docout.Root.NodeNew('CreateTime').NodeAdd(docout.NodeNewTextType('CreateTime', IntToStr(DateTimeToUnix(now,false)), xeCData));
docout.Root.NodeNew('MsgType').NodeAdd(docout.NodeNewTextType('MsgType', 'text', xeCData));
docout.Root.NodeNew('Content').NodeAdd(docout.NodeNewTextType('Content', Amsg, xeCData));
Result := docout.WriteToString;
finally
FreeAndNil(docout);
end;
end;
begin
//獲取要發送的使用者資訊,發送的訊息型別
touser := UGParams.Values['FromUserName'];
fromuser := UGParams.Values['ToUserName'];
msgtype := UGParams.Values['msgtype'];
if msgtype = 'event' then
begin
event := UGParams.Values['event'];
//使用者訂閱公眾號事件
if event = 'subscribe' then
begin
docout := TNativeXml.CreateName('xml',nil);
try
msg := '親愛好朋友,感謝您的關注!';
docout.Root.NodeNew('ToUserName').NodeAdd(docout.NodeNewTextType('ToUserName', touser, xeCData));
docout.Root.NodeNew('FromUserName').NodeAdd(docout.NodeNewTextType('FromUserName', fromuser, xeCData));
docout.Root.NodeNew('CreateTime').NodeAdd(docout.NodeNewTextType('CreateTime', IntToStr(DateTimeToUnix(now,false)), xeCData));
docout.Root.NodeNew('MsgType').NodeAdd(docout.NodeNewTextType('MsgType', 'text', xeCData)); //
docout.Root.NodeNew('Content').NodeAdd(docout.NodeNewTextType('Content', msg, xeCData));
MsgText := docout.WriteToString;
finally
FreeAndNil(docout);
end;
end
//使用者取消訂閱公眾號事件
else if event = 'unsubscribe' then
begin
docout := TNativeXml.CreateName('xml',nil);
try
msg := '感謝您的支援與厚愛,期待再次合作!';
docout.Root.NodeNew('ToUserName').NodeAdd(docout.NodeNewTextType('ToUserName', touser, xeCData));
docout.Root.NodeNew('FromUserName').NodeAdd(docout.NodeNewTextType('FromUserName', fromuser, xeCData));
docout.Root.NodeNew('CreateTime').NodeAdd(docout.NodeNewTextType('CreateTime', IntToStr(DateTimeToUnix(now,false)), xeCData));
docout.Root.NodeNew('MsgType').NodeAdd(docout.NodeNewTextType('MsgType', 'text', xeCData));
docout.Root.NodeNew('Content').NodeAdd(docout.NodeNewTextType('Content', msg, xeCData));
MsgText := docout.WriteToString;
finally
FreeAndNil(docout);
end;
end
//使用者點選功能表按鈕事件
else if event = 'CLICK' then
begin
msg := '無內容';
if UGParams.Values['EventKey'] = 'about' then
msg := '您點選了聯繫方式';
docout := TNativeXml.CreateName('xml',nil);
try
docout.Root.NodeNew('ToUserName').NodeAdd(docout.NodeNewTextType('ToUserName', touser, xeCData));
docout.Root.NodeNew('FromUserName').NodeAdd(docout.NodeNewTextType('FromUserName', fromuser, xeCData));
docout.Root.NodeNew('CreateTime').NodeAdd(docout.NodeNewTextType('CreateTime', IntToStr(DateTimeToUnix(now,false)), xeCData));
docout.Root.NodeNew('MsgType').NodeAdd(docout.NodeNewTextType('MsgType', 'text', xeCData));
docout.Root.NodeNew('Content').NodeAdd(docout.NodeNewTextType('Content', msg, xeCData));
MsgText := docout.WriteToString;
finally
FreeAndNil(docout);
end;
end
//使用者呼叫微信掃碼事件
else if (event = 'scancode_push') or (event = 'scancode_waitmsg') then
begin
docout := TNativeXml.CreateName('xml',nil);
try
msg := '掃碼結果:'+ UGParams.Values['ScanType']+UGParams.Values['ScanResult'];
docout.Root.NodeNew('ToUserName').NodeAdd(docout.NodeNewTextType('ToUserName', touser, xeCData));
docout.Root.NodeNew('FromUserName').NodeAdd(docout.NodeNewTextType('FromUserName', fromuser, xeCData));
docout.Root.NodeNew('CreateTime').NodeAdd(docout.NodeNewTextType('CreateTime', IntToStr(DateTimeToUnix(now,false)), xeCData));
docout.Root.NodeNew('MsgType').NodeAdd(docout.NodeNewTextType('MsgType', 'text', xeCData));
docout.Root.NodeNew('Content').NodeAdd(docout.NodeNewTextType('Content', msg, xeCData));
MsgText := docout.WriteToString;
finally
FreeAndNil(docout);
end;
end;
end
//使用者發送的內容為文字訊息
else if msgtype = 'text' then
begin
msg := UGParams.Values['Content'];
//以下為一個示例,通過在微信公眾號中發送文字訊息JS001,觸發JS001自定程式的執行
if msg = 'JS001' then
begin
try
UGCM.RunScript(msg);
MsgText := ReplyMsgText(msg+'自定程式執行成功!');
except
MsgText := ReplyMsgText(msg+'自定程式執行失敗!'+ExceptionMessage);
end;
end
//以下為一個示例,向用戶發送一個帶預覽圖片的鏈接
else if Pos(UpperCase('操作手冊'),UpperCase(msg)) > 0 then
begin
docout := TNativeXml.CreateName('xml',nil);
try
url := UGCM.RunScript('printreport',nil,'s');
docout.Root.NodeNew('ToUserName').NodeAdd(docout.NodeNewTextType('ToUserName', touser, xeCData));
docout.Root.NodeNew('FromUserName').NodeAdd(docout.NodeNewTextType('FromUserName', fromuser, xeCData));
docout.Root.NodeNew('CreateTime').NodeAdd(docout.NodeNewTextType('CreateTime', IntToStr(DateTimeToUnix(now,false)), xeCData));
docout.Root.NodeNew('MsgType').NodeAdd(docout.NodeNewTextType('MsgType', 'news', xeCData));
docout.Root.NodeAdd(docout.NodeNewInt('ArticleCount', 1));
Articles := docout.Root.NodeNew('Articles');
node := Articles.NodeNew('item');
node.NodeNew('Title').NodeAdd(docout.NodeNewTextType('Title', '愛招飛紡織印染業操作手冊', xeCData));
node.NodeNew('Description').NodeAdd(docout.NodeNewTextType('Description', '愛招飛紡織印染業操作手冊、使用說明', xeCData));
node.NodeNew('PicUrl').NodeAdd(docout.NodeNewTextType('PicUrl', 'https://isoface.net/isoface/images/logo/isoface_02.png', xeCData));
node.NodeNew('Url').NodeAdd(docout.NodeNewTextType('Url', UGMM.BaseHost + url, xeCData));
MsgText := docout.WriteToString;
finally
FreeAndNil(docout);
end;
end
else
begin
MsgText := ReplyMsgText('已收到您的訊息:['+msg+']')
end
end
end.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146