WHMCS API addticketreply不使用消息

时间:2012-11-21 23:41:29

标签: pascal indy whmcs

我已经尝试了所有我能想到的东西,并且不能使用addticketreply命令来连接WHMCS的API。它来自窗口的应用程序,而不是PHP或任何东西。简单查询字符串,所有字符都包含在第一个换行符之前。在该换行之后,不包括任何其他信息。

我尝试了一种urlencode方法,没有去,API只是插入所有文本,包括编码部分哈哈并且不会解码。我尝试用[{1}}替换换行符\n,但WHMCS只显示<br>哈哈

有关如何通过API获取完整消息(包括新行)的任何线索?文档真的缺乏这个。

变量adminusername也根本不起作用!我已经尝试了一个全名,不,我已经尝试过用户名和用户ID和nope,仍然插入我登录的用户名以进行故障单回复。我正在使用的用户是具有完全访问权限的超级管理员。

API的查询字符串如下所示:

<br>

我应该提到我在邮政中使用Indy。其他所有工作,任何其他命令传递工作,甚至更新票证,消息更新。它不会超过第一次突破。

编辑代码:正如我上面提到的,我让IdHTTP使用post params对我的文本进行编码,因此它应该可以工作,并且正如我在上面提到的那样,我已经尝试对其进行预编码,结果是WHMCS不会解码然后只显示accesskey=key&adminusername=Name of Person&ticketid=488&message=asdf asdf Nothing past that first line goes :( sad sad sad&action=addticketreply&responsetype=json&username=admin&password=mypassword 和其他的。既然有人问我应该提一下,我正在使用Indy 10!所以我最新版本。

%20

1 个答案:

答案 0 :(得分:2)

换行符,空格和其他保留字符需要进行URL编码,例如:

accesskey=key&adminusername=Name%20of%20Person&ticketid=488&message=asdf%20asdf%0D%0ANothing%20past%20that%20first%20line%20goes%20%3A%28%0D%0Asad%20sad%20sad&action=addticketreply&responsetype=json&username=admin&password=mypassword

如果您通过POST请求发送值,请确保您使用的是Indy的最新版本。 TIdHTTP.Post(TStrings)为您处理编码,例如:

var
  Params: TStringList;
begin
  Params := TStringList.Create;
  try
    Params.Add('accesskey=key');
    Params.Add('adminusername=Name of Person');
    Params.Add('ticketid=488');
    Params.Add('message=asdf asdf'+CRLF+'Nothing past that first line goes :('+CRLF+'sad sad sad');
    Params.Add('action=addticketreply');
    Params.Add('responsetype=json');
    Params.Add('username=admin');
    Params.Add('password=mypassword');
    IdHTTP1.Post(URL, Params);
  finally
    Params.Free;
  end;
end;

但是,如果您通过URL查询字符串发送值,则必须手动对URL进行编码,TdHTTP将无法为您处理,例如:

var
  URL: String;
begin
  URL := 'http://host/path?accesskey=key&adminusername=Name of Person&ticketid=488&message=asdf asdf'+CRLF+'Nothing past that first line goes :('+CRLF+'sad sad sad&action=addticketreply&responsetype=json&username=admin&password=mypassword';
  IdHTTP1.Get(TIdURI.URLEncode(URL));
end;

或者:

var
  URL: String;
  Params: TStringList;
  I: Integer;
begin
  Params := TStringList.Create;
  try
    Params.Add('accesskey=key');
    Params.Add('adminusername=Name of Person');
    Params.Add('ticketid=488');
    Params.Add('message=asdf asdf'+CRLF+'Nothing past that first line goes :('+CRLF+'sad sad sad');
    Params.Add('action=addticketreply');
    Params.Add('responsetype=json');
    Params.Add('username=admin');
    Params.Add('password=mypassword');

    for I := 0 to Params.Count-1 do
      Params[i] := TIdURI.ParamsEncode(Params[i]);

    Params.Delimiter := '&';
    Params.StrictDelimiter := True;
    Params.Quotechar := #0;

    URL := 'http://host/' + TIdURI.PathEncode('path') + '?' + Params.DelimitedText;
    IdHTTP1.Get(URL);
  finally
    Params.Free;
  end;
end;