版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quá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ù)上進行測試,如果結(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,封裝了加解密的算法實現(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)容是容是容是是保護是是是是是解密并驗簽方法內(nèi)容是內(nèi)容是長度是的保護是是是容是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)用方先將進4.2獲取身份令牌向51發(fā)票開放平臺調(diào)用令牌接口地址獲取access_token,攜帶令牌才可以調(diào)用中臺服務(wù)。有效期24小時,當前token失效或過期才需要申請新的token,請開發(fā)者做好令牌的管理。程序終端說明:為解決多終端用戶獲取身份令牌次數(shù)不足的問題,接口新增“終端號”節(jié)點。如需使用多終域經(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(機動車票返回信息)icleTypechar(機動車票、二手車票返回信息)andModelchar(機動車票、二手車票返回信息)oduceAreachar(機動車票、二手車票返回信息)edNochar(機動車票、二手車票返回信息)nspectionNochar(機動車票、二手車票返回信息)char(機動車票、二手車票返回信息)leIdentificatichar0(機動車票、二手車票返回信息)ateOfImportchar(機動車票、二手車票返回信息)tyCodechar(機動車票、二手車票返回信息).ertificachar(機動車票、二手車票返回信息).tchar(機動車票、二手車票返回信息).tyNamechar(機動車票、二手車票返回信息)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年零售連鎖店經(jīng)營承包合同范本版
- 2024年餐飲合伙合同協(xié)議書新穎樣本
- 2024水保技術(shù)服務(wù)合同
- 2025年度中央空調(diào)安裝與節(jié)能降耗合同范本3篇
- 2024年項目承包建設(shè)合同
- 二零二五年度企業(yè)勞動合同續(xù)簽范本合同模板2篇
- 二零二五年家庭和諧伴侶責任協(xié)議3篇
- 二零二五年度企業(yè)員工住房產(chǎn)權(quán)轉(zhuǎn)讓協(xié)議范本3篇
- 二零二五年度倉儲用地使用權(quán)轉(zhuǎn)讓合同3篇
- 二零二五年度MyOracleSupport企業(yè)資源規(guī)劃與ERP系統(tǒng)集成服務(wù)合同
- 管線管廊布置設(shè)計規(guī)范
- 提升教練技術(shù)--回應ppt課件
- 招聘與錄用選擇題
- 《工資、薪金的個人所得稅的計算》教學設(shè)計
- 精品洲際酒店集團皇冠酒店設(shè)計標準手冊
- 周視瞄準鏡的初步設(shè)計-北京理工大學-光電學院小學期作業(yè)
- Writing寫作教學設(shè)計
- 心房起搏電極的位置選擇ppt課件
- 四川省南充市2019-2020學年九年級上期末數(shù)學試卷(含答案解析)
- 上海市寶山區(qū)2019屆高三英語一模含答案
- 《數(shù)與形》教學反思
評論
0/150
提交評論