(圖來源於方蓓?)
首先要理解公眾號的流程。通過圖知道,我們要:
1、你要有個web服務器,用於和微信服務器通訊。你的web服務器必須讓微信服務器能找到。
2、通信要求按照微信公眾號開發要求的格式提供相關的數據。(get和post)
3、關於白名單問題:一定要確認清楚。特別是調試時上網的機器ip是隨機的。否則會返回錯誤。
有了這樣的思路,問題就簡單了,無論選用何種開發工具。
關於access_token:
access_token是公眾號的全局唯一接口調用憑據,公眾號調用各接口時都需使用access_token。開發者需要進行妥善保存。access_token的存儲至少要保留512個字符空間。
access_token的有效期目前為2個小時,需定時刷新,重復獲取將導致上次獲取的access_token失效。
公眾平台的API調用所需的access_token的使用及生成方式說明:
1、建議公眾號開發者使用中控服務器統一獲取和刷新Access_token,其他業務邏輯服務器所使用的access_token均來自於該中控服務器,不應該各自去刷新,否則容易造成沖突,導致access_token覆蓋而影響業務;
2、目前Access_token的有效期通過返回的expire_in來傳達,目前是7200秒之內的值。中控服務器需要根據這個有效時間提前去刷新新access_token。在刷新過程中,中控服務器可對外繼續輸出的老access_token,
此時公眾平台后台會保證在5分鍾內,新老access_token都可用,這保證了第三方業務的平滑過渡;
3、Access_token的有效時間可能會在未來有調整,所以中控服務器不僅需要內部定時主動刷新,還需要提供被動刷新access_token的接口,這樣便於業務服務器在API調用獲知access_token已超時的情況下,可以觸發access_token的刷新流程。
公眾號可以使用AppID和AppSecret調用本接口來獲取access_token。AppID和AppSecret可在“微信公眾平台-開發-基本配置”頁中獲得(需要已經成為開發者,且帳號沒有異常狀態)。
調用接口時,請登錄“微信公眾平台-開發-基本配置”提前將服務器IP地址添加到IP白名單中,點擊查看設置方法,否則將無法調用成功。
我們看用Tidhttp實現的get和post
procedure GetDemo; var IdHttp : TIdHTTP; Url : string;//請求地址 ResponseStream : TStringStream; //返回信息 ResponseStr : string; begin //創建IDHTTP控件 IdHttp := TIdHTTP.Create(nil); //TStringStream對象用於保存響應信息 ResponseStream := TStringStream.Create(''); try //請求地址 Url := 'http://dict.youdao.com/'; try IdHttp.Get(Url,ResponseStream); except on e : Exception do begin ShowMessage(e.Message); end; end; //獲取網頁返回的信息 ResponseStr := ResponseStream.DataString; //網頁中的存在中文時,需要進行UTF8解碼 ResponseStr := UTF8Decode(ResponseStr); finally IdHttp.Free; ResponseStream.Free; end; end;
//如果Get需要添加請求參數,則直接在地址后添加,各參數間用&連接。如:http://dict.youdao.com?param1=1¶m2=2
procedure PostDemo; var IdHttp : TIdHTTP; Url : string;//請求地址 ResponseStream : TStringStream; //返回信息 ResponseStr : string; RequestList : TStringList; //請求信息 RequestStream : TStringStream; begin //創建IDHTTP控件 IdHttp := TIdHTTP.Create(nil); //TStringStream對象用於保存響應信息 ResponseStream := TStringStream.Create(''); RequestStream := TStringStream.Create(''); RequestList := TStringList.Create; try Url := 'http://f.youdao.com/?path=fanyi&vendor=fanyiinput'; try //以列表的方式提交參數 RequestList.Add('text=love'); IdHttp.Post(Url,RequestList,ResponseStream); //以流的方式提交參數 RequestStream.WriteString('text=love'); IdHttp.Post(Url,RequestStream,ResponseStream); except on e : Exception do begin ShowMessage(e.Message); end; end; //獲取網頁返回的信息 ResponseStr := ResponseStream.DataString; //網頁中的存在中文時,需要進行UTF8解碼 ResponseStr := UTF8Decode(ResponseStr); finally IdHttp.Free; RequestList.Free; RequestStream.Free; ResponseStream.Free; end; end;
==================================
Post請求在網頁中多使用List形式提交參數。
不過在一些API中規定了POST的請求格式為 JSON 格式或 XML,這是需要注意發起請求前需要先設置 ContentType 屬性,使用Stream方式提交已上面代碼為例:
提交 JSON 格式:IdHttp.Request.ContentType :='application/json';
提交 XML 格式: IdHttp.Request.ContentType :='text/xml';
如未按要求格式提交,一般會返回 HTTP 1.1 / 415
//(https://www.cnblogs.com/limingliyu/archive/2016/07/03/5638966.html)
那么獲取公眾號access_token 的獲取就簡單了
procedure GetToken(http: TIdHTTP;AppID, AppSecret: String);
var
Url: string;
J: TJSONObject;
begin
Url := Format(TokenUrl, [AppID, AppSecret]);//AppID,AppSecret在你的公眾平台上可以查到
J := TJSONObject.ParseJSONValue(GetMethod(http,Url, 1)) as TJSONObject;
try
if J.Count > 0 then
begin
Access_Token := J.GetValue('access_token').Value;//這就是后面做什么都要用到的access_token,每天獲取的次數是每天2000次,所以不能每次用都重新獲取
Expires_IN := J.GetValue('expires_in').Value.ToInteger;//access_token的過期時間,7200秒,所以要在過期前重新獲取
end;
finally
J.Free;
end;
end;
==================================================
返回的結果:
{
"access_token": "7_ApAFIX15HI_hv8fpSou94-0HS38zWzvMO6hJBLXiWLc5VxvEloLmwKXlK5BP9dLNirRSV6F3c-sXWjsYzj77e0B5RVjt_hAZiSpRpOhfQBlPiO5-_cQp5QN9B-wzPEl2A0n8F8CwIudwGUD9ETPfABANCY", "expires_in": 7200 }
function GetMethod(HTTP: TIdHTTP; Url: String; Max: Integer): String; var RespData: TStringStream; begin RespData := TStringStream.Create('', TEncoding.UTF8); try try HTTP.Get(Url, RespData); HTTP.Request.Referer := Url; Result := RespData.DataString; except Dec(Max); if Max = 0 then begin Result := ''; Exit; end; Result := GetMethod(http,Url, Max); end; finally FreeAndNil(RespData); end; end;
OK,Goodluck!
(程序參考網上相關博客,在此感謝)