作者:apiaoapiao_622 | 来源:互联网 | 2017-05-11 02:01
因ERP系统需要与微信公众号做数据接口,现准备做一个中间服务器。开发环境:XE10使用控件:IdHTTPServer因刚开发阶段,在路由路上直接做了测试机的80端口转发,申请微信公众测试号后,却一直配置失败。跟踪发现是服务器无法收到微信发来的GET请求
因ERP系统需要与微信公众号做数据接口,现准备做一个中间服务器。
开发环境:XE10
使用控件:IdHTTPServer
因刚开发阶段,在路由路上直接做了测试机的80端口转发,申请微信公众测试号后,却一直配置失败。跟踪发现是服务器无法收到微信发来的GET请求。代码如下:
Delphi/Pascal code?
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdBaseComponent,
IdComponent, IdCustomTCPServer, IdCustomHTTPServer, IdHTTPServer, IdContext,
IdHashSHA, IdGlobal;
type
TForm1 = class(TForm)
IdHTTPServer1: TIdHTTPServer;
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure IdHTTPServer1CommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
private
{ Private declarations }
public
{ Public declarations }
function SHA1(Input: String): String;
function CheckSignature(ARequestInfo: TIdHTTPRequestInfo): boolean;
end;
var
Form1: TForm1;
Const
Token = 'weixin';
implementation
{$R *.dfm}
function TForm1.SHA1(Input: String): String;
begin
with TIdHashSHA1.Create do
try
Result := LowerCase(HashBytesAsHex(TidBytes(Bytesof(Input))));
finally
Free;
end;
end;
function TForm1.CheckSignature(ARequestInfo: TIdHTTPRequestInfo): boolean;
var
signature, timestamp, nonce, echostr: String;
tmpstr: TStringList;
temp: String;
begin
tmpstr := TStringList.Create;
try
signature := ARequestInfo.Params.Values['signature'];
timestamp := ARequestInfo.Params.Values['timestamp'];
nonce := ARequestInfo.Params.Values['nonce'];
echostr := ARequestInfo.Params.Values['echostr'];
tmpstr.Add(Token);
tmpstr.Add(timestamp);
tmpstr.Add(nonce);
tmpstr.Sort;
temp := StringReplace(tmpstr.text, #13#10, '', [rfReplaceAll]);
Result := SHA1(temp) = signature;
finally
tmpstr.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
IdHTTPServer1.Active := True;
end;
procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
Memo1.Lines.Add('123');
if CheckSignature(ARequestInfo) then
if ARequestInfo.Params.Values[&#39;echostr&#39;] <> &#39;&#39; then
begin
Memo1.Lines.Add(ARequestInfo.Params.Values[&#39;echostr&#39;]);
AResponseInfo.ContentType := &#39;text/html; charset=UTF-8&#39;;
AResponseInfo.ContentText := ARequestInfo.Params.Values[&#39;echostr&#39;];
end;
end;
end.
以上就是开发微信服务器接口的实例教程的详细内容,更多请关注 第一PHP社区 其它相关文章!