愛招飛幫助手冊 愛招飛幫助手冊
  • FastERP-1
  • Smart
  • PinToo
  • FastWeb
  • FastERP-2 企業管理系統 (opens new window)
  • 印染業ERP (opens new window)
  • 工廠終端機 (opens new window)
  • TARS
  • MARS
  • TaskRunner
  • Flying
  • FastDesk
  • HiDesk
  • HiNAT
  • FastBPM
  • 設備故障診斷 (opens new window)
  • 設備最佳運轉效益 (opens new window)
  • 企業智能助手SmeGPT (opens new window)
  • 燈號管理 (opens new window)
  • 戰情室 (opens new window)
  • 能源管理 (opens new window)
  • 人車定位 (opens new window)
  • 戰情指揮系統 (opens new window)
  • FastERP-1
  • FastWeb
  • Smart
  • PinToo
  • Flying
  • TARS
  • 通用功能

    • Report
    • Script
    • Echarts
    • Chart
    • DB Install
  • FastERP-1
  • Smart
  • PinToo
  • FastWeb
  • FastERP-2 企業管理系統 (opens new window)
  • 印染業ERP (opens new window)
  • 工廠終端機 (opens new window)
  • TARS
  • MARS
  • TaskRunner
  • Flying
  • FastDesk
  • HiDesk
  • HiNAT
  • FastBPM
  • 設備故障診斷 (opens new window)
  • 設備最佳運轉效益 (opens new window)
  • 企業智能助手SmeGPT (opens new window)
  • 燈號管理 (opens new window)
  • 戰情室 (opens new window)
  • 能源管理 (opens new window)
  • 人車定位 (opens new window)
  • 戰情指揮系統 (opens new window)
  • FastERP-1
  • FastWeb
  • Smart
  • PinToo
  • Flying
  • TARS
  • 通用功能

    • Report
    • Script
    • Echarts
    • Chart
    • DB Install
  • TaskRunner幫助主頁
  • 學習手冊

    • 安裝配置
    • 快速上手
    • 界面介紹
    • 功能介紹
    • 預設資料
    • RestAPI說明
    • WebSocket說明
    • MQTT說明
    • Python說明
    • 自定程式
    • 公共單元
    • 工作流
    • 運行衛士
    • 自定報表
    • 自動化作業
    • 控制元件使用
    • 微信公眾號服務
      • 基本配置
      • 使用方法
    • 函式程式

  • 開發手冊

目录

微信公眾號服務

# 微信公眾號服務

  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
控制元件使用
系統函式

← 控制元件使用 系統函式→

Copyright © 2021-2025 愛招飛IsoFace | ALL Rights Reserved
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式