软件下载

HJ1350接口(环保报送清单)

1、HJ1350接口(环保报送清单)示例代码

1.1登录获取token

function TFrmMain.LoginWeb(aQysb, aPwd: string): string;
var
  token, publicKey, input, loginstr: string;
  js: ISuperObject;
  cert: TStrings;
begin

  BLoginWeb := False;

  cert := TStringList.Create;
  url := 'https://nscqd.vecc.org.cn/vin/scqd/getPublicKey';
  response := HttpGet(url);
  js := SO(response);
  if js['status'].AsString = 'success' then
  begin
    publicKey := js['data.publicKey'].AsString;

    cert.Add('-----BEGIN PUBLIC KEY-----');
    cert.Add(publicKey);
    cert.Add('-----END PUBLIC KEY-----');
    cert.SaveToFile('public.pem');
    cert.Free;

    loginstr := '{"username":"' + aQysb + '","password":"' + aPwd + '"}';
    loginstr := public_encrypt(loginstr);
    loginstr := StringReplace(loginstr, #$A, '', [rfReplaceAll]);

    js := SO();
    js.S['logininfo'] := loginstr;
    url := 'https://nscqd.vecc.org.cn/vin/scqd/login';
    response := HttpPostJson(url, js.AsString);
    response := UTF8Decode(response);

    js := SO(response);
    if js['status'].AsString = 'success' then
    begin
      FToken := js['data.token'].AsString;
      edtKey.Text := FToken;
      BLoginWeb := True;
      Result := FToken;
    end
    else
    begin
      ShowError(js['errors'].AsString);
      Abort;
    end;
  end
  else
  begin
    ShowError(js['errors'].AsString);
    Abort;
  end;
end;

1.2拼装JSON

一定要按照这个顺序,不然签名会出错

svin := '';
svin := svin + '[';
while not QrySJTS.Eof do
begin
  svin := svin + '{';
  svin := svin + '"ccdate":"' + QrySJTS.FieldByName('ccdate').AsString + '",';
  svin := svin + '"ccjl":"' + QrySJTS.FieldByName('ccjl').AsString + '",';
  svin := svin + '"ccsy":"' + QrySJTS.FieldByName('ccsy').AsString + '",';
  svin := svin + '"dpscc":"' + QrySJTS.FieldByName('dpscc').AsString + '",';
  svin := svin + '"dpxh":"' + QrySJTS.FieldByName('dpxh').AsString + '",';
  svin := svin + '"fdjh":"' + QrySJTS.FieldByName('fdjh').AsString + '",';
  svin := svin + '"fdjsb":"' + QrySJTS.FieldByName('fdjsb').AsString + '",';
  svin := svin + '"fdjsccdz":"' + QrySJTS.FieldByName('fdjsccdz').AsString + '",';
  svin := svin + '"gkwww":"' + QrySJTS.FieldByName('gkwww').AsString + '",';
  svin := svin + '"obdwz":"' + QrySJTS.FieldByName('OBDWZ').AsString + '",';
  svin := svin + '"qddjh":"' + QrySJTS.FieldByName('QDDJH').AsString + '",';
  svin := svin + '"sb":"' + QrySJTS.FieldByName('sb').AsString + '",';
  svin := svin + '"sccdz":"' + QrySJTS.FieldByName('sccdz').AsString + '",';
  svin := svin + '"scdate":"' + QrySJTS.FieldByName('scdate').AsString + '",';
  svin := svin + '"vin":"' + QrySJTS.FieldByName('vin').AsString + '",';
  svin := svin + '"xslcgk":"' + QrySJTS.FieldByName('XSLCGK').AsString + '",';
  svin := svin + '"xxgkh":"' + QrySJTS.FieldByName('xxgkh').AsString + '",';
  svin := svin + '"zcdl":"' + QrySJTS.FieldByName('zcdl').AsString + '",';
  svin := svin + '"zljjzl":"' + QrySJTS.FieldByName('zljjzl').AsString + '",';
  svin := svin + '"zljzl":"' + QrySJTS.FieldByName('zljzl').AsString + '"';
  if QrySJTS.RecNo < QrySJTS.RecordCount then
  begin
	svin := svin + '},';
  end
  else
  begin
	svin := svin + '}';
  end;  
  QrySJTS.Next;
end;

签名方法

function SHA1(AData: string): string;
var
  Len: cardinal;
  mdctx: EVP_MD_CTX;
  inbuf, outbuf: array[0..1023] of char;
begin 
  StrPCopy(inbuf, AData);
  LoadSSL;

  EVP_DigestInit(@mdctx, EVP_sha1);
  EVP_DigestUpdate(@mdctx, @inbuf, StrLen(inbuf));
  EVP_DigestFinal(@mdctx, @outbuf, Len);

  FreeSSL;
  BinToHex(outbuf, inbuf, Len);
  inbuf[2 * Len] := #0;
  result := StrPas(inbuf);
end;
posted @ 2025-11-06 21:01  QQ2601127485  阅读(9)  评论(0)    收藏  举报