strs: TStringList;
tmpStr: string;
begin
strs := TStringList.Create;
try
strs.Add(token);
strs.Add(timestamp);
strs.Add(nonce);
strs.Sort;
tmpStr := strs[0] + strs[1] + strs[2];
tmpStr := SHA1(tmpStr);
if tmpStr = signature then
Result := True
else
Result := False;
finally
FreeAndNil(strs);
end;
end;
函數的返回結果爲真時,表示接入成功!該函數,參考
csdn朋友上傳的範例,表示感謝。在這個範例中,提供了SHA1函數的單元,因此,你要下載回來。
準備完這個函數,接下來,如何使用這個函數呢?
由於微信服務器是向接入的web服務器發送Get請求,因此,咱們要在本身實現的kbmMW web server的PerformGet方法中來調用這個CheckSignature。
function TDJ_FrmPhoneHTTPService.PerformGet(ClientIdent: TkbmMWClientIdentity; const AURL: string;
const Args: array of Variant): Variant;
var
FuncName: string;
qv: TkbmMWHttpQueryValues;//處理Get請求傳遞來的參數.
begin
if Length(Args) < 1 then
kbmMWRaiseException(KBMMW_ERR_SERVICE_HTTP_URLMISSING, 'Missing URL.')
else
begin
FuncName := UpperCase(copy(Args[0], 2, Length(Args[0]) - 1));
if FuncName.Equals('WECHAT.HTML') then
begin
// 轉微信接口
qv := TkbmMWHttpQueryValues.Create;
qv.AsString := Args[2];//取得get請求傳遞來的參數.
try
// 驗證接入
if qv.ValueByName['echostr'] <> '' then
//若是echostr不爲空,代表是驗證請求
begin
Result := '';
if
dmwx.
CheckSignature(qv.ValueByName['id'], qv.ValueByName['signature'],
qv.ValueByName['timestamp'], qv.ValueByName['nonce']) then
Result := qv.ValueByName['echostr'];
//若是驗證成功,返回echostr,告知微信服務器驗證成功. end; SetResponseMimeType('text/HTML'); SetResponsecharset('utf-8'); finally FreeAndnil(qv); end; exit;//結束本次對Get的響應. end; ....略去下面的實現 在實際的項目,我是這樣實現的,將微信的接口代碼,實如今一個單元wechatImpl中,再實現一個DataModule,對wechatImpl的方法進一步封裝,封裝的時候,來實現對數據庫的操做。 仍是以驗證爲例,來看一下DataModule中是如何實現的? function tdmwx.CheckSignature(id, signature, timestamp, nonce: string): Boolean; begin result:=False; if not qWXFWH.Active then qWXFWH.Open; if qWXFWH.Locate('fid', VarArrayOf([id]), []) then//查詢服務號表,是否存在對應的id記錄 begin if wechatImpl.CheckSignature(signature, timestamp, nonce, qWXFWH.FieldByName('FToken').AsString)//存在,則取在表中定義的token值,去調用驗證函數. then Result := true; end; end; 其中,qWXFWH是一個kbmMWuniDACQuery對象,用以保存微信服務號的一張表,表結構以下: CREATE TABLE WX_FWH ( FID INTEGER,//一個服務號的id,達到管理多個服務號的目的。 FTOKEN VarChar(32),//每一個服務號的token值 FAPPID VarChar(16), FAPPSECRET varchar(16), FACCESSTOKEN VARCHAR (512), FEXPIRESIN INTEGER, FGETDATE DATETIME); 在註冊服務器時,要先在這個表中增長註冊信息,好比:id=1,token=kbmmwtoken1 對應的註冊內容爲: url=www.test.cc/wechat.html?id=1 token=kbmmwtoken1 這樣,當微信服務器發送驗證請求時,會把id看成參數一併傳遞過來,datamodule的CheckSignature方法,會根據id的值,取得數據表中定義token值,而後再調用微信接口的驗證方法。 總結一下上面的內容,爲了實現微信接入,我將實現的代碼分爲三層: 1.在kbmmw web server的get方法中調用數據庫層的驗證函數 2.在數據庫層實現驗證函數,從取表中取得預先定義的微信號的相關信息,如id,token,再調用具體的微信接口 3.實現具體的微信接口,供數據庫層調用。 計劃等微信接口的實現所有完成後共享給朋友們,無奈近期時間緊,瑣事多,還須要一段時間。就先把實現完成的思路先放上來分享。 對接入web server的url地址驗證是作微信服務的第一步,因此,上面相關的內容必定要理解,纔可繼續進行下去。 其實是這樣: 關注你服務號的微信用戶,向你的服務號發送消息,微信平臺,會往你驗證的url進行轉發,這就至關於你微信服務號的微信用戶,向你的Web server發送消息。你開發的Web server的目的,就是響應這些消息,與你的微信服務號關注者進行互動!