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;

浙公网安备 33010602011771号