微信公眾號:1-IDHTTP控件:GET/POST 請求獲取access_token


(圖來源於方蓓?)

首先要理解公眾號的流程。通過圖知道,我們要:
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&param2=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!

(程序參考網上相關博客,在此感謝)


免責聲明!

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



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