1、HJ1350接口(环保报送清单)示例代码
1.1登录获取token
function TFrmMain.LoginWeb(aQysb, aPwd: string): string;
vartoken, publicKey, input, loginstr: string;js: ISuperObject;cert: TStrings;
beginBLoginWeb := False;cert := TStringList.Create;url := 'https://nscqd.vecc.org.cn/vin/scqd/getPublicKey';response := HttpGet(url);js := SO(response);if js['status'].AsString = 'success' thenbeginpublicKey := 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' thenbeginFToken := js['data.token'].AsString;edtKey.Text := FToken;BLoginWeb := True;Result := FToken;endelsebeginShowError(js['errors'].AsString);Abort;end;endelsebeginShowError(js['errors'].AsString);Abort;end;
end;
1.2拼装JSON
一定要按照这个顺序,不然签名会出错
svin := '';
svin := svin + '[';
while not QrySJTS.Eof do
beginsvin := 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 thenbeginsvin := svin + '},';endelsebeginsvin := svin + '}';end; QrySJTS.Next;
end;
签名方法
function SHA1(AData: string): string;
varLen: 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;