使用delphi+intraweb進行微信開發1--微信平台接入


示例代碼已經放出!請移步使用delphi+intraweb進行微信開發1~4代碼示例進行下載,雖為示例代碼但是是從我項目中移出來的,封裝很完備適於自行擴展和修改。

 

iw14.0.50來了,在新的版本中最吸引我的就是增加了完善的httphandler功能:終於可以直接在地址欄輸入url打開iw功能頁面了;可以自由使用EasyUI等js框架了;顯示模式對話框也不再七繞八繞惹人煩了;呵呵,我感覺iw第一次接近主流web開發工具了!

興奮過了,來嘗試一下吧。其實iw的坑還是挺多的,雖然已經接近主流了,但是,后面慢慢都會說到…

1、新建一個iw工程,選擇Stand Alone Server / Service ,這種模式下進行開發是最理想的,調試很方便,正式發布時可以再建立一個library型的工程發布到.net服務器上。(是的,大家沒有看錯,現在iw已經脫離了isapi模式,可以像部署.net mvc4應用一樣部署到iis上,后面會解釋,.net虛擬主機也可以發布iw應用了!巨大的進步。)

 

2、保存工程后在工程中添加一個新的單元文件,例如起名為wxapi.pas,這個文件中的代碼將承擔微信接入工作。代碼如下:

interface

uses
  Classes, IW.Content.Base, System.SysUtils,HTTPApp, IWApplication,
  IW.HTTP.Request, IW.HTTP.Reply;

type
  /// <summary>
  /// 從TContentBase繼承下來的類,就相當於asp.net中的httphandler
  /// </summary>
  TWxApi = class(TContentBase)
  protected
    function Execute(aRequest: THttpRequest; aReply: THttpReply; const aPathname: string; aSession: TIWApplication; aParams: TStrings): Boolean; override;
  public
    constructor Create; override;
  end;

implementation

uses
  ServerController, UserSessionUnit, Crypt.SHA1;

{ TWxApi }

constructor TWxApi.Create;
begin
  inherited;
  // 文件不需要真實存在
  FileMustExist := False;
end;

function TWxApi.Execute(aRequest: THttpRequest; aReply: THttpReply;
  const aPathname: string; aSession: TIWApplication;
  aParams: TStrings): Boolean;
var
  signature: string;
  timestamp: string;
  nonce: string;
  echostr: string;
  strs: TStringList;
  tmpStr: string;
begin
  Result := True;

  signature := aParams.Values['signature'];
  timestamp := aParams.Values['timestamp'];
  nonce := aParams.Values['nonce'];
  echostr := aParams.Values['echostr'];

  strs := TStringList.Create;
  strs.Add('MyTestToken');    // Token,要和微信接口配置信息保持一致
  strs.Add(timestamp);
  strs.Add(nonce);
  strs.Sort;

  tmpStr := strs[0]+strs[1]+strs[2];
  tmpStr := SHA1(AnsiString(tmpstr));

  if tmpStr=signature then
  begin
    aReply.WriteString(echostr)
  end else begin
    aReply.WriteString('如果看到這個提示說明此鏈接地址可作為微信接口地址使用。');
  end;
  aSession.Terminate; // 釋放會話資源,本handler無需會話
end;

end.

如代碼所示,TContentBase即iw版httphandler的基礎類,如果不需要顯示iwForm,從這個類型繼承下來即可。如果需要使用iwForm還有個TContentForm基礎類可以使用,哇哦,在瀏覽器地址欄輸入url也可以直接打開iwform了哦。TWxApi.Execute中的代碼即微信接入的代碼,非常簡單,不了解的看看微信幫助:微信接入指南

 

3、在ServerController中注冊此httphandler,直接貼出ServerController注冊代碼:
procedure TIWServerController.IWServerControllerBaseConfig(Sender: TObject);
begin
  // 在ServerController.OnConfig事件中注冊我們定義的微信Handler
  // ServerController.OnConfig事件在整個應用程序生命周期中只被運行一次
  with THandlers.Add('', 'wxapi.php', TWxApi.Create) do
  begin
    CanStartSession := True;            // 從字面上理解是能夠啟動會話
    RequiresSessionStart := False;      // 從字面上理解是需要啟動會話,這兩個屬性必須進行設置,否則輸入 /wxapi.php 將轉向主窗體
                                        // 也就是不設置CanStartSession和RequiresSessionStart,則必須先執行/$/start 啟動會話后才
                                        // 能正常訪問 /wxapi.php頁面,這個顯然不是我們需要的。
  end;
end;

如代碼所示,紅色的THandlers.Add('', 'wxapi.php', TWxApi.Create)這段代碼就完成了httphandler的注冊,在瀏覽器地址欄輸入http://localhost/wxapi.php即可訪問剛剛注冊的這個控制器。

但是這段代碼中有個不大不小的坑,詳見我代碼中的注釋。

這個坑是handler注冊后啟動iw應用但是不先在瀏覽器地址欄輸入/$/start啟動程序,而是直接輸入/wxapi.php驗證httphandler時失敗,頁面自動導航到主窗體!閱讀幫助后發現,需要設置TContentBase.RequiresSessionStart:=false否則會導致iw應用必須先啟動會話訪問主窗體才能使用httphandler,按照幫助的說明設置了TContentBase.RequiresSessionStart:=false雖然直接輸入/wxapi.php不再導航到主窗體了,但是會提示404代碼錯誤,單步跟蹤發現httphandler代碼確實已經執行了,這樣不應該出現404錯誤,多方查證和實驗發現還需要設置TContentBase.CanStartSession := True,呵呵,這個在幫助中沒有提到,估計是新版本新增加的屬性。好了,現在在地址欄輸入http://localhost/wxapi.php能正常打開頁面了。

 

4、將編譯完成的iw應用拷貝到主機上進行測試,實戰微信接入

,居然提示配置失敗!這是什么情況,我使用的代碼是從別人寫好的一個Delphi版微信接入接口代碼中拷貝的,那個程序相同的代碼沒有任何問題,當時第一個念頭是頁面編碼不正確,好吧,我改,iw的handler默認的編碼是utf-8格式的,於是我嘗試了gbk,iso-8859-1等多種編碼格式,均提示上述錯誤。萬般無奈只好寫日志看看到底handler代碼執行沒有,結果令人震驚,放到真實服務器上后,微信驗證時handler代碼居然沒有執行,而在我本機調試時和真實服務器的瀏覽器上瀏覽時都很好沒有任何問題。巨大的坑啊,連着好幾天各種測試,各種修改,都准備放棄了,呵呵,結果看了下iw自己的httphandler示例,發現在其ServerController中實現了一個事件:OnBrowserCheck,於是嘗試在自己代碼中增加了相同事件代碼進行測試,哇塞,可以了。。。

procedure TIWServerController.IWServerControllerBaseBrowserCheck(
  aSession: TIWApplication; var rBrowser: TBrowser);
begin
  // 這個事件代碼很重要,我在這里卡了好幾天! 
  //
  // 在沒有實現這個事件的時候,在任何瀏覽器輸入 /wxapi.php 都能成功響應,唯獨到了
  // 微信中就顯示配置失敗,后來在代碼中使用了日志輸出才發現iw能收到微信請求,但是
  // TWxApi.Execute方法卻沒有執行,后來去官網閱讀了相關幫助,才發現iw只有支持的瀏
  // 覽器才可正常響應輸出,而微信發出的web請求顯然不屬於任何一個已知的瀏覽器
  if rBrowser is TOther then begin
    rBrowser.Free;
    rBrowser := TInternetExplorer.Create(8); // 以兼容IE8頁面瀏覽進行頁面內容輸出
  end;
end;

,呵呵,太不容易了,就這么幾行代碼折騰好幾天,不過iw終於可以用於微信開發了。

 

我認為Delphi的強大在於除編譯器外所有源代碼均提供,這樣出現問題了可以通過閱讀源碼解決,但是iw太封閉了,沒有源碼就算了,幫助也跟不上,在線那個幫助實在太太太弱了,建議用iw的朋友結合在線幫助和iw自己的示例工程一起看,少走彎路!不過,iw發展到今天確實已經挺好用了,尤其對於有delphi情節的人,能用自己最擅長的語言和開發工具進行web開發真是挺爽的一件事情。

 

未完,待續。。。

 

下一次講講iw的最新部署方式,以.net mvc4方式部署在iis上,呵呵,如果只看iw在線幫助關於mvc方式部署就去實踐,也有小坑哦!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM