愛招飛幫助手冊 愛招飛幫助手冊
  • 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
  • FastWeb幫助主頁
  • 學習手冊

    • 基本入門

    • 功能介紹

    • 控制元件說明

    • 系統工具

    • 系統管理

    • 云服務工具

    • 資料庫工具

    • 專用模板

    • 外部功能

      • 超級伺服器
      • 壓力測試
      • 配置中心
      • SSL證書
      • 本地列印
      • 圖靈數據分析
      • 微信平臺功能接入
        • 1. 準備工作
          • 1.1. 帳號與資質準備
          • 1.2. 基礎資料與配置
        • 2. FastWeb基本設定
        • 3. FastWeb微信接入開發
        • 4. 反向代理設定
        • 5. 微信公眾號服務開發
    • 開發流程

    • 函式程式

  • 開發手冊

目录

微信平臺功能接入

# 微信平臺功能接入

  FastWeb中提供了微信平臺接入相關的功能,接入后,使用者可以藉助微信平臺的相關功能,實現FastWeb與微信平臺的整合運用。接下來將介紹微信功能接入的方法。

# 1. 準備工作

  在進行微信接入開發(比如微信公眾號、微信網頁應用、微信支付、企業微信等)前,需要先做好一系列準備工作,避免開發過程中因為許可權、資質或環境問題卡住。以下是一個比較全面的準備清單:

# 1.1. 帳號與資質準備

  • 微信公眾號/小程式

    • 確認已經註冊並完成認證(需要企業主體認證,個人主體許可權有限)。
    • 確認帳號型別:服務號、訂閱號、小程式,功能許可權差異很大。
  • 企業資質

    • 如果涉及支付或高級介面(如模版訊息、微信支付),必須完成企業認證。
  • 開發者許可權

    • 確保你有對應公眾號/小程式的開發許可權,可以進入微信公眾平臺/微信開放平臺配置。

# 1.2. 基礎資料與配置

  • AppID 和 AppSecret
    • 在公眾平臺開發設定里獲取。
  • 伺服器配置
    • 域名(必須是已備案的 https 域名,支援 TLS 1.2 及以上)。
    • 外網可訪問的伺服器,用於接收微信的回撥(訊息、事件、支付通知等)。
  • IP 白名單(部分介面需要配置)。

# 2. FastWeb基本設定

  在配置中心中可以對微信接入所需的專案進行設定。

# 3. FastWeb微信接入開發

  以下將以掃碼為例,說明如何在FastWeb中進行開發,以實現掃碼獲取數據的功能。

  在使用下述程式碼前,使用者應該要了解FastWeb中的JS互動模式,可參考URLFrame與JS的互動。

  微信平臺開發的目標平臺為移動終端,故在設計模組時,請在[系統工具]-[模組列表(APP)]中建立模組並進行設計。

  下面是例子,說明如何呼叫微信調出掃碼的界面:

procedure btnScanCodeOnClick(sender: tobject);
var
  js: string = '';
begin
  //UGCM.wsctWeChatMiroApp_Scaner(wssid,UgAppEdit01.JSId,'scaner');
  js := js + 'wx.ready(function(){' + #13#10;
  js := js + '  wx.scanQRCode({' + #13#10;
  js := js + '    needResult: 1,' + #13#10; // 預設為0,掃瞄結果由微信處理,1則直接返回掃瞄結果,
  js := js + '    scanType: ["qrCode","barCode"],' + #13#10; // 可以指定掃二維碼還是一維碼,預設二者都有
  js := js + '    success: function (res) {' + #13#10;
  js := js + '    console.log("掃碼成功", res);' + #13#10;
  js := js + '    setTimeout(() => {ajaxRequest('+UgAppEdit01.JSName+', "scaner", ["scanerresult=" +  encodeURIComponent(JSON.stringify(res))])}, 100)' + #13#10; //掃碼結束后,會將掃碼結果發送至此非同步請求,以觸發下一步的動作
  js := js + '    },' + #13#10;
  
  js := js + '    fail: function (res) {' + #13#10;
  js := js + '    console.error("掃碼失敗", res);' + #13#10;
  js := js + '    },' + #13#10; 
  
  js := js + '    complete: function () {' + #13#10;
  js := js + '    console.log("掃碼結束");' + #13#10;
  js := js + '    }' + #13#10; 
  
  js := js + '  });' + #13#10;
  
  js := js + '});';
  UniSession.AddJS(js); //將js發送至控制檯,以呼叫微信啟用掃碼
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

  當掃碼結束后,會返回掃碼的結果,通過下方的程式碼,可以將掃碼的結果回填至FastWeb的編輯框。

procedure UgAppEdit01OnAjaxEvent(sender: tcomponent;eventname: string;params: tunistrings);
var 
 O:TJsonObject;
 S:String;
begin
  if SameText(EventName, 'sacnresult') then // webview內jssdk掃碼
  begin
    O := TJsonObject(UGCM.ParseJSONValue(Params.Values['callbackdata']));
    try
      if O <> nil then
      begin
        UgAppEdit01.Text := UGCM.GetJSONString(O,'result');
        //if UgAppEdit01.Text <> '' then
        // btnQueryOnClick(nil);
      end;
    finally
      O.Free;
    end;
  end
  else if SameText(EventName, 'scaner') then // H5掃碼
  begin
    O := TJsonObject(UGCM.ParseJSONValue(UGMM.HTTPDecode(Params.Values['scanerresult'])));
    try
      if O <> nil then
      begin
        S := UGCM.GetJSONString(O,'resultStr');
        UgAppEdit01.Text :=  Copy(S,Pos(',',S)+1,Length(S));
        //if UgAppEdit01.Text <> '' then
        // btnQueryOnClick(nil);
      end;
    finally
      O.Free;
    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

  上述方法對微信平臺中接入的FastWeb網頁都適用。

# 4. 反向代理設定

  如果使用者的FastWeb服務端不能直接經由外網訪問,則需要適用反向代理的方式,將這些服務接入外網供使用者訪問。

  微信平臺接入通常需要開啟Web服務與WebSocket服務。因此需要將FastWeb中的http服務與websocket服務通過反向代理搭建起來。

  建議使用一臺中國大陸境內可供外網訪問的Linux伺服器來完成上述工作,需使用備案的域名,以滿足微信服務接入的要求。使用Nginx來實現反向代理功能。Nginx反向代理的http與Websocket服務建議使用不同的域名做處理,且兩個域名都需要申請SSL證書。以下是示例的配置方案:

# http配置
server
    {
        listen 443 ssl http2;
        #listen [::]:443 ssl http2;
        server_name wxserver.sample.com;
        index index.html index.htm index.php default.html default.htm default.php index.nginx-debian.html;
        root  /var/www/html;

        client_max_body_size 512M;
		#include blockip.conf;
        ssl_certificate /etc/nginx/ssl/wxserver.sample.com/fullchain.cer;
        ssl_certificate_key /etc/nginx/ssl/wxserver.sample.com/key.pem;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;
        ssl_ciphers "TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
        ssl_session_cache builtin:1000 shared:SSL:10m;

		location  / {
				# 這裡的 ip 是後端 http
				proxy_pass http://192.168.0.201:8802/;
				proxy_read_timeout  300;
				proxy_connect_timeout   300;
				proxy_redirect  off;

				# 代理參數,請照複製
				proxy_set_header Host $http_host;
				proxy_set_header X-Real-IP $remote_addr;
				proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
				proxy_set_header X-Forwarded-Proto $scheme;
		}
    }

# websocket配置	
server
    {
        listen 443 ssl http2;
        #listen [::]:443 ssl http2;
        server_name wsserver.sample.com;
        index index.html index.htm index.php default.html default.htm default.php index.nginx-debian.html;
        root  /var/www/html;

        client_max_body_size 512M;
		#include blockip.conf;
        ssl_certificate /etc/nginx/ssl/wsserver.sample.com/fullchain.cer;
        ssl_certificate_key /etc/nginx/ssl/wsserver.sample.com/key.pem;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;
        ssl_ciphers "TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
        ssl_session_cache builtin:1000 shared:SSL:10m;
		# websocket
		location / {
		    # 這裡的 ip 是後端 websocket
			proxy_pass http://192.168.0.201:8804/;
			 
            # websocket代理的配置
			proxy_http_version 1.1;
			proxy_set_header Upgrade $http_upgrade;
			proxy_set_header Connection "upgrade";
			 
			proxy_set_header Host $host;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_set_header X-Forwarded-Proto $scheme;

			proxy_read_timeout 600s;
			proxy_send_timeout 600s;
			proxy_connect_timeout 600s;
		}
    }
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

# 5. 微信公眾號服務開發

  在使用微信公眾號服務前,請先在FastWeb配置中心中配置好基礎設定、微信公眾號、資料庫等環節的配置。勾選啟用。

  FastWeb提供了推送接收訊息的介面,通過向此介面發送訊息,可以實現自定義配置的功能。

http://域名/WeixinServer/PushMessage
1

  FastWeb中微信伺服器的功能實現邏輯在自定RestAPIReplyWechatMessage中,使用者可以在該自定程式中編寫程式碼,實現微信公眾號自定義回覆功能。支援回覆的訊息文字型別如下:

訊息型別 說明
text 接收到的內容格式為文字訊息
image 接收到的內容格式為圖片訊息
location 接收到的內容格式為位置資訊
link 接收到的內容格式為鏈接
event 接收到的內容格式為事件(使用者訂閱公眾號等事件)

  以下是ReplyWechatMessage的功能結構,將在其中進行註釋說明。

function RestAPI:String;
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('FastERP1操作手冊'),UpperCase(msg)) > 0 then
      begin
        docout := TNativeXml.CreateName('xml',nil);
        try
          url := RequestInfo.Host;
          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', url, xeCData)); 
          MsgText := docout.WriteToString;
        finally
          FreeAndNil(docout);
        end;
      end
      else
      begin
          MsgText := ReplyMsgText('已收到您的訊息:['+msg+']')
      end
  end;
  result := MsgText;
end; 
begin
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
147
148
149
圖靈數據分析
開發案例

← 圖靈數據分析 開發案例→

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