版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
發(fā)票查驗服務(wù)對接規(guī)范1.概述 32.壓縮與解壓縮 32.1示例代碼 32.1.1Java開發(fā) 32.1.2C++開發(fā) 62.1.3C#開發(fā) 92.2壓縮方法說明 122.3壓縮方法驗證 123.證書加密說明 123.1加解密使用的密鑰說明 123.1.1演示版密鑰使用說明 123.1.2正式版密鑰使用說明 13JAVA開發(fā) 133.2.1Jar包說明 133.2.2方法說明 133.2.3加解密流程說明 143.2.4示例代碼 143.3C++開發(fā) 153.3.1DLL庫說明 153.3.2方法說明 153.3.3加解密流程說明 173.3.4示例代碼 17C#開發(fā) 193.5加解密錯誤碼 194.對接說明 204.1調(diào)用說明 204.2獲取身份令牌 204.2.1請求報文示例與數(shù)據(jù)項說明 204.2.2返回報文示例與數(shù)據(jù)項說明 224.3外層報文說明 224.3.1公共請求參數(shù) 224.3.2公共返回參數(shù) 234.4錯誤碼 245.服務(wù)說明 255.1發(fā)票查驗 255.1.1支持查驗的票種 255.1.2請求報文示例與數(shù)據(jù)項說明 255.1.3返回報文示例與數(shù)據(jù)項說明 265.1.4返回報文中resultCode數(shù)據(jù)項說明 326.對接聯(lián)系人 32照此規(guī)范2.壓縮與解壓縮2.1示例代碼1.1Java開發(fā)torgapachecommonscodecbinaryBaseyteArrayInputStreamyteArrayOutputStreamIOExceptionInputStreamOutputStreamtilzipGZIPInputStreamilzipGZIPOutputStreampublicclassGZipUtils{publicstaticintBUFFER=1024;publicstaticStringEXT=".gz";publicstaticbooleancompress(byte[]data,ByteArrayOutputStreambaos)throwsIOException{ByteArrayInputStreambaisnewByteArrayInputStreamdata;try{returntrue;catch(Exceptione){ckTracereturnfalse;4finally{}}publicstaticvoidcompress(InputStreamis,OutputStreamos)throwsException{utputStreamgosnewGZIPOutputStreamoswhile((count=is.read(data,0,BUFFER))!=-1){writedatacount}}IOException{try{returntrue;catch(Exceptione){ckTracereturnfalse;finally{baisclose}}treamisOutputStreamosthrowsExceptionnputStreamgisnewGZIPInputStreamiswhile((count=gis.read(data,0,BUFFER))!=-1){tedatacount}}publicstaticvoidmain(String[]args)throwsIOException{Stringstr="";presstestpresstest}tprintlnByteArrayOutputStreambaosnewByteArrayOutputStream;if(false==strZipReturn){tprintln}osflushosclosetrSystemoutprintlnoutputStrlength);ByteArrayOutputStreambaosnewByteArrayOutputStream);rif(false==strReturn){outprintln}aosflushaoscloseessagenewStringdataystemoutprintlnstrMessage}}2.1.2C++開發(fā)boolCompressData(INconststring&sSrcData,OUTstring&sDstData,string&sErr){nsSrcDatasizeuLongfiDataCnt=compressBound(iOrgLen+1);//壓縮后的最長長度,需要把字符ytefpDstDatanullptrYQAutoPtrBytefPtrDstDatapDstDataiDataCnt);pDstData{}memset(pDstData,0,iDataCnt);BytefpInpuDataBytef*)sSrcData.c_str();intiRltcompresspDstDataiDataCntpInpuDataiOrgLenboolbRltfalse;ingsTmp{NDTbRlttrue;eakErrsTmptostringiRltZERRNObRltfalse;eakRRORsErrsTmptostringiRltZSTREAMERROR";bRltfalse;eakORsErrsTmptostringiRltZDATAERRORbRltfalse;eakRsErrsTmptostringiRltZMEMERROR;bRltfalse;eakORsErrsTmptostringiRltZBUFERROR";bRltfalse;eakERRORsErrsTmptostringiRltZVERSIONERRORbRltfalse;eakbRltfalse;eak}{ntintiBaseLeniDataCnt2;unsignedcharpBaseDatanullptr;YQAutoPtrunsignedcharAutoPtrpBaseData,iBase64Len);rpBaseData{}memset(pBase64Data,0,iBase64Len);memcpy(pBase64Data,pDstData,iDataCnt);BaseEncodepBase4Data,mLen);signcharpBaseData}}rcDataintiOrgnLenOUTstringsDstDatastring{ifsSrcDataemptyiOrgnLen0)){sErr確";}intiDcdDataLen=0;char*pDcdData=nullptr;intiSrcDataLensSrcDatalength+1;YQAutoPtrcharPtrDcdDatapDcdDataiSrcDataLen;pDcdData{}memset(pDcdData,0,iSrcDataLen);memcpy(pDcdData,sSrcData.c_str(),iSrcDataLen);BaseDecodepDcdData&iDcdDataLen);intiDeBsLenstrlenpDcdData)+1;BytefpBSrcDataBytef)pDcdData;ytefpDstDatanullptrYQAutoPtrBytefPtrDstDatapDstDataiOrgnLen+1);pDstData{}memset(pDstData,0,iOrgnLen+1);uLongfiDstLen=iOrgnLen+1;tiRltuncompresspDstDataiDstLenpBSrcDataiDcdDataLenboolbRltfalse;ringsTmp{NDTgncharpDstDatabRlt=true;eakErrsTmptostringiRltZERRNObRltfalse;eakRRORbRltfalse;eakORsErrsTmptostringiRltZDATAERROR";bRltfalse;eakRsErr=sTmp+to_string(iRlt)+",Z_MEM_ERROR";bRltfalse;eakORsErr=sTmp+to_string(iRlt)+",Z_BUF_ERROR";bRltfalse;eakERRORsErr=sTmp+to_string(iRlt)+",Z_VERSION_ERROR";bRltfalse;eakbRltfalse;eak}}2.1.3C#開發(fā)CAencrypt{{meZlibzlibdllmeZlibzlibdllernalstaticboolIsIntPtrSizetnsiprivatestaticexternintcompress32(byte[]dest,refSystem.UInt32destLen,bytesource,System.UInt32sourceLen);tSetAnsiBytesourceSystemUInt2sourceLen);tnsiprivatestaticexternintcompress_64(byte[]dest,refSystem.UInt32destLen,bytesource,System.UInt32sourceLen);trSetAnsiBytesourceSystemUInt2sourceLen);[DllImport(NameZlib32,EntryPoint="compressBound",ExactSpelling=true,CharSetCharSetAnsiCallingConventionCallingConvention.StdCall)]publicstaticexternSystemUInt32compressBound_32(System.UInt32lLength);[DllImport(NameZlib64,EntryPoint="compressBound",ExactSpelling=true,CharSetCharSetAnsiCallingConventionCallingConvention.StdCall)]publicstaticexternSystem.UInt32compressBound_64(System.UInt32lLength);{bytearrBufSrc=Encoding.UTF8.GetBytes(value);SystemUIntnBufSrcSystemUIntarrBufSrcLengthDst{fDstcompressBoundnBufSrc}{fDstcompressBoundnBufSrc}tncompressarrBufDstrefnBufDstarrBufSrcnBufSrc}{compressarrBufDstrefnBufDstarrBufSrcnBufSrc}//Compress(byteArray,byteArray.Length,reftmpArray,refaa);ifiRtn{bytearrDstActnewbyte[nBufDst];ArrayCopyarrBufDst,arrDstAct,nBufDst);ertToBaseStringarrDstAct}}publicstaticstringzlibDecompressstringstrSource){{temUIntsourceLenSystemUIntBufferSourceLengthSystemUIntdestLen00;byteBufferByteDest=newbyte[destLen];==uncompress_64(BufferByteDest,=uncompress=uncompress_32(BufferByteDest,ifiRtn{bytearrDstActnewbyte[destLen];SourceSourceArrayCopy(BufferByteDest,arrDstAct,destLen);stringstrRe=System.Text.Encoding.UTF8.GetString(BufferByteDest,0,ferByteDestLengthtrReTrim}iRtn{return壓縮后的內(nèi)容";}}}2.2壓縮方法說明(1)壓縮與解壓縮的函數(shù)需要配對使用;UTF)→CA加密→壓縮→Base64編碼;Base解壓縮→CA解密→內(nèi)層報文(明文,UTF-8格式)。2.3壓縮方法驗證(1)壓縮前報文(UTF-8格式):(2)壓縮后報文(經(jīng)過Base64編碼)HsIAAAAAAAAADMfLJrvMVfUrHavEhOToCiuFghMSFISUVziJLSBAKG4N+0rAAAA用戶可以用上面壓縮前、壓縮后的報文在自己的壓縮、解壓縮函數(shù)上進(jìn)行測試,如果結(jié)果與上面的一致,則說明3.證書加密說明3.1加解密使用的密鑰說明3.1.1演示版密鑰使用說明公(1)演示版調(diào)用方公鑰:CLIENT_DECRYPTCER=YS01TEST.cer(2)演示版調(diào)用方私鑰:CLIENT_DECRYPTPFX=YS01TEST.pfx(3)演示版調(diào)用方私鑰密碼:CLIENT_DECRYPTPFX_KEY=szeNe6kEb551云稅中臺公鑰:PLATFORM_DECRYPTCER=51fapiao_20180523.cer3.1.2正式版密鑰使用說明用3.2.1Jar包說明Jar中的核心類是CaApi,封裝了加解密的算法實(shí)現(xiàn)。3.2.2方法說明加密并簽名方法archar是是archar是rchar是是false為測試,要使用測是解密并驗簽方法archar是是archar是是是false為測試,要使用測archar是3.2.3加解密流程說明Ak3.2.4示例代碼c客戶端解密得到明文d。publicstaticvoidmain(String[]args){orintiii{try{byteclientPfx=FileUtils.readFileToByteArray(newgetPropertyAddressCLIENTDECRYPTPFXbyte]clientCer=FileUtils.readFileToByteArray(newegetPropertyAddressCLIENTDECRYPTCERlientPswgetPropertyCLIENTDECRYPTPFXKEYbyteserverCer=FileUtils.readFileToByteArray(newegetPropertyAddressPLATFORMDECRYPTCERbyte]serverPfx=FileUtils.readFileToByteArray(newlegetPropertyAddressPLATFORMDECRYPTPFXerverPswgetPropertyPLATFORMDECRYPTPFXKEY公鑰加密bytea=CaApi.encrypt7sign(newString(serverCer),clientPfx,gbCaApidecryptchecknewStringclientCerserverPfxse的公鑰加密bytec=CaApi.encrypt7sign(newString(clientCer),serverPfx,SystemoutprintlnnewStringnewBase4().encode(c)));鑰驗簽ingdCaApidecryptchecknewStringserverCerclientPfxcfalsetemoutprintlnd}xceptione{e.printStackTrace();}}}3.3C++開發(fā)3.3.1DLL庫說明3.3.2方法說明加密并簽名方法內(nèi)容是容是容是是保護(hù)是是是是是解密并驗簽方法內(nèi)容是內(nèi)容是長度是的保護(hù)是是是容是EMigCertLen度明文明文長度題題長度列號列號3.3.3加解密流程說明3.3.4示例代碼lSOFCtestCAdemodemodll態(tài)庫方法,傳參的證書均從工程中讀取。inintargcTCHARargv{charpSMtrustsNULLpSMencBaseCertNULL*pSM2sigPfx=NULL;encharpSMpasswdcharpSMpasswdcharpSMinDatagfdfdgfdggj98098";ataLenstrlenpSMinDatantiFileLenTempif(readFile("trust.txt",NULL,&iFileLenTemp)>0){pSMtrusts=newchar[iFileLenTemp+1];memset(pSM2trusts,0,iFileLenTemp+1);adFiletrusttxtpSMtrustsiFileLenTempreturnif(readFile("test2.cer",NULL,&iFileLenTemp)>0){pSM2encBase64Cert=newchar[iFileLenTemp+1];memset(pSM2encBase64Cert,0,iFileLenTemp+1);readFile("test2.cer",pSM2encBase64Cert,&iFileLenTemp);returnif(readFile("test2_123456.pfx",NULL,&iFileLenTemp)>0){pSMsigPfx=newchar[iFileLenTemp+1];memset(pSM2sigPfx,0,iFileLenTemp+1);readFiletestpfxpSM2sigPfx,&iFileLenTemp);iFileLenTempreturnntrvrszOutDataLensizeofszOutDatarvaisinoPKCSsignedAndEnvelopedMultipSMtrustspSMencBase4Cert,pSM2sigPfx,iSM2sigPfxLen,pSM2passwd,pSM2inData,iSM2inDataLen,\UTszOutDataOUTiOutDataLenprintf("aisino_PKCS7_signedAndEnvelopedMultierr:%d\n",rv);inoPKCSgetLastErrorprintfLastErrorcodeis:%d\n",rv);returnprintf("aisino_PKCS7_signedAndEnvelopedMultiok!\n");}rszSigCertLensizeofszSigCertszTMOutDataDataLensizeofszTMOutDataszSubjecttLensizeofszSubjectrszSerialalLensizeofszSerialrvaisinoPKCSunpackMultiINpSMtrustsINpSMsigPfxINiSM2sigPfxLen,INpSM2passwd,INszOutData,INiOutDataLen,\OUTszSigCertiSigCertLenszTMOutData,&iTMOutDataLen,szSubject,ialiSerialLenif(rv!=0){printf("aisino_PKCS7_unpackMultierr:%d\n",rv);noPKCSgetLastErrorprintfLastErrorcodeis:%d\n",rv);returnprintf("aisino_PKCS7_unpackMultiok!\n");}eturn}3.4C#開發(fā)3.5加解密錯誤碼12試信任鏈或測試證書34證書驗證錯誤(包括過期)56密文不是合格的ca加密密文,檢查是正確ca789文件的公鑰不是一對4.對接說明4.1調(diào)用說明調(diào)用方先將進(jìn)4.2獲取身份令牌向51發(fā)票開放平臺調(diào)用令牌接口地址獲取access_token,攜帶令牌才可以調(diào)用中臺服務(wù)。有效期24小時,當(dāng)前token失效或過期才需要申請新的token,請開發(fā)者做好令牌的管理。程序終端說明:為解決多終端用戶獲取身份令牌次數(shù)不足的問題,接口新增“終端號”節(jié)點(diǎn)。如需使用多終域經(jīng)理。多終端的使用方式建議按場景來確定。用場景3:將電腦編號作為終端號。如企業(yè)使用過程中會在多臺電腦上使用多款產(chǎn)品,且每款產(chǎn)品4.2.1請求報文示例與數(shù)據(jù)項說明{ationCode}請求數(shù)據(jù)項說明1archar是2taxpayerIdrchar是3rminalIdrchar3否或0;多終端,4rchar是cSHA5Codearchar是6amparchar是yyyyMMddHHmmss格式7archar是xpayerIdtesigntypeauthoCodetimestamp拼,4.2.2返回報文示例與數(shù)據(jù)項說明報文示例{token"expires_in":"access_token的過期時長(單位秒)"}返回報文數(shù)據(jù)項說明1archar是2Varchar是3archar是4是accesstoken的過期時長(單位秒)4.3外層報文說明4.3.1公共請求參數(shù){}請求數(shù)據(jù)項說明:是1是tCode是是是是cSHA是ArfaceCodezipCodeencryptCodeaccessdatagramsigntype行含有密鑰散列函數(shù)算法,得到結(jié)果作為簽4.3.2公共返回參數(shù)報文示例:{e}回數(shù)據(jù)項說明:1Code1acSHAezipCodeencryptCodeaccesstagramsigntype列函數(shù)算法,得到結(jié)果作為簽4.4錯誤碼123數(shù)4567有誤8發(fā)票代碼有誤95.服務(wù)說明5.1發(fā)票查驗5.1.1支持查驗的票種目前支持查驗的發(fā)票種類為:(國稅查驗平臺支持的發(fā)票)10增值稅普通發(fā)票(電子)11增值稅普通發(fā)票(卷式)5.1.2請求報文示例與數(shù)據(jù)項說明{pdmmq}char是char是qchar是charchar6校驗碼后六位(發(fā)票類型5.1.3返回報文示例與數(shù)據(jù)項說明{"invoiceList":[{"invoiceInfo":{"resultCode":"","salerAccount":"","invoiceDate":"",r"blueInvoiceCode":"",No"engineNo":"",ionNoateNo"salerPhone":"","transportGoodsInfo":"","registrationNo":"",efficealNoualAddress"buyerPhone":"",dualNodualAddressdAccountAccount"detailList":[{o}}archararcharultCodearchar項說明”ultTiparchararchar2charchar8ntcharcharcharonecharcharuyerTaxNocharuyerNamecharuyerAddressPhonecharyerAccountcharchar8ddcharcharntcharmarkcharmachineNocharchar8yeechar8iewerchar8char6lueInvoiceCodecharlueInvoiceNochar8ionMarkharY已作廢N:未作廢char(機(jī)動車票返回信息)icleTypechar(機(jī)動車票、二手車票返回信息)andModelchar(機(jī)動車票、二手車票返回信息)oduceAreachar(機(jī)動車票、二手車票返回信息)edNochar(機(jī)動車票、二手車票返回信息)nspectionNochar(機(jī)動車票、二手車票返回信息)char(機(jī)動車票、二手車票返回信息)leIdentificatichar0(機(jī)動車票、二手車票返回信息)ateOfImportchar(機(jī)動車票、二手車票返回信息)tyCodechar(機(jī)動車票、二手車票返回信息).ertificachar(機(jī)動車票、二手車票返回信息).tchar(機(jī)動車票、二手車票返回信息).tyNamechar(機(jī)動車票、二手車票返回信息)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 大培訓(xùn)大考試管理制度
- 修理廠員工培訓(xùn)考核制度
- 資產(chǎn)評估培訓(xùn)管理制度
- 危險廢棄物人員培訓(xùn)制度
- 運(yùn)管處安全培訓(xùn)制度
- 2025福建廣電網(wǎng)絡(luò)集團(tuán)股份有限公司連江分公司招聘筆試歷年參考題庫附帶答案詳解
- 2025湖北荊州市城市發(fā)展控股集團(tuán)有限公司校園招聘19人筆試歷年參考題庫附帶答案詳解
- 2025浙江寧波市江北區(qū)國資國企系統(tǒng)招聘36人筆試歷年參考題庫附帶答案詳解
- 2025浙江臺州市社會發(fā)展工程管理有限公司招聘2人筆試歷年參考題庫附帶答案詳解
- 2025江蘇南京江北新區(qū)生命健康產(chǎn)業(yè)發(fā)展管理辦公室下屬國企招聘4人筆試歷年參考題庫附帶答案詳解
- 嗜酸性粒細(xì)胞與哮喘發(fā)病關(guān)系的研究進(jìn)展
- 傳染病學(xué)-病毒性肝炎
- 《陸上風(fēng)電場工程可行性研究報告編制規(guī)程》(NB/T 31105-2016)
- 京瓷哲學(xué)手冊樣本
- 五年級簡便計算100題
- 三年級作文寫小狗海灘冬天童話故事
- (康德卷)重慶市2024屆高三一診物理試卷(含答案)
- 重慶市沙坪壩小學(xué)小學(xué)語文五年級上冊期末試卷
- 龍虎山正一日誦早晚課
- 《國際學(xué)術(shù)論文寫作與發(fā)表》學(xué)習(xí)通超星課后章節(jié)答案期末考試題庫2023年
- 中考滿分(合集15篇)
評論
0/150
提交評論