支付寶小程序?qū)訃?guó)家醫(yī)保接口岖研,簽名算法SM2(SM3withSM2)、加密算法SM4

已幫助多家醫(yī)院對(duì)接國(guó)家醫(yī)保警检,如有問(wèn)題可私信評(píng)論

第1章 范圍
本文檔適用于兩定機(jī)構(gòu)調(diào)用接入醫(yī)保移動(dòng)支付中心服務(wù)孙援,主要表述了電子憑證結(jié)算涉及
的接口出入?yún)⒄{(diào)用示例。
天津市醫(yī)保移動(dòng)支付本期建設(shè)包含支付寶小程序和國(guó)家醫(yī)保局 APP 移動(dòng)支付應(yīng)用場(chǎng)景扇雕。
第2章 接口規(guī)則
2.1 協(xié)議規(guī)則
規(guī)則 規(guī)則描述
傳輸方式 為保證交易安全性拓售,采用 HTTPS 傳輸
提交方式 采用 POST 方法提交
數(shù)據(jù)格式 提交和返回?cái)?shù)據(jù)都為 JSON 格式
字符編碼 統(tǒng)一采用 UTF-8 字符編碼
簽名算法 SM2
加密算法 SM4
簽名要求 請(qǐng)求和接收數(shù)據(jù)均需要校驗(yàn)簽名,詳細(xì)方法請(qǐng)參考安全規(guī)范-簽名算法
加密要求 請(qǐng)求和接收數(shù)據(jù)均需要校驗(yàn)簽名镶奉,詳細(xì)方法請(qǐng)參考安全規(guī)范-加密算法
判斷邏輯 先判斷協(xié)議字段返回础淤,再判斷業(yè)務(wù)返回,最后判斷交易狀態(tài)
2.2 格式規(guī)定
2.2.1 日期哨苛、時(shí)間格式
日期:YYYYMMDD鸽凶;
14
時(shí)間: HHMMSS。
2.2.2 交易金額格式約定
以元為單位建峭,具體根據(jù)接口示例約定保留位數(shù)玻侥。
2.3 安全規(guī)范
2.3.1 簽名算法(SM2)
2.3.1.1 概述
根據(jù) SM2 算法(Signature 的 algorithm 選擇 SM3withSM2),簽名報(bào)文迹缀。通過(guò)對(duì)報(bào)文數(shù)
據(jù)篩選使碾、排序和拼接,組成待簽名報(bào)文數(shù)據(jù)祝懂。
2.3.1.2 請(qǐng)求參數(shù)簽名
2.3.1.2.1 篩選
獲取所有請(qǐng)求參數(shù),不包括字節(jié)類型參數(shù)拘鞋,如文件砚蓬、字節(jié)流,剔除 signData盆色、encData灰蛙、
extra 字段。
2.3.1.2.2 排序
將篩選的參數(shù)按照第一個(gè)字符的鍵值 ASCII 碼遞增排序(字母升序排序)隔躲,如果遇到相
同字符則按照第二個(gè)字符的鍵值 ASCII 碼遞增排序摩梧,以此類推。
2.3.1.2.3 拼接
將排序后的參數(shù)與其對(duì)應(yīng)值宣旱,組合成“參數(shù)=參數(shù)值”的格式仅父,并且把這些參數(shù)用&字符
連接起來(lái),最后拼接上應(yīng)用密鑰 appSecret 在“…參數(shù)=參數(shù)值…”后,此時(shí)生成的字符串
為待簽名字符串笙纤,將待簽名字符串 SM2 運(yùn)算耗溜,即是簽名(signData)的值(“signData”、
“encData”省容、“extra”參數(shù)不參與簽名)抖拴。
JOSN 對(duì)象簽名規(guī)范(如 data):內(nèi)部按字母順序升序排列空值不參與簽名 將整理好的
JSON 內(nèi)容,輸出 JSON 字符串后拼接參與簽名腥椒,例如下面的示例請(qǐng)求報(bào)文阿宅,參數(shù)值都是示例,
開(kāi)發(fā)者僅參考報(bào)文格式即可笼蛛。
加簽報(bào)文示例:
15
{
"appId":"43AF047BBA47FC8A1AE8EFB2XXXXXXXX",
"data":{"appId":"43AF047BBA47FC8A1AE8EFB2XXXXXXXX","appUserId":"o8z4C5avQXqC0aWFPf1Mzu6D7
WCQ_bd","idNo":"350181199011193519","idType":"01","phoneNumber":"13763873033","userName":
"測(cè)試"},
"encType":"SM4",
"signData":"URVQNdVNn5mz2EhKZhLTlXNwAWTSncFoSe8Ilx7jhn81eABJ46sdRRN1ZiAiQjPUTixG9bwqEhiJu
pHRGmyO5w==",
"signType":"SM2",
"timestamp":"20200207175759",
"version":"2.0.1"
}
組成的待簽名字符串:
appId=43AF047BBA47FC8A1AE8EFB2XXXXXXXX&data={"appId":"43AF047BBA47FC8A1AE8EFB2XXXXXXXX","
appUserId":"o8z4C5avQXqC0aWFPf1Mzu6D7WCQ_bd","idNo":"350181199011193519","idType":"01","p
honeNumber":"13763873033","userName":"測(cè)試"}
&encType=SM4&signType=SM2&timestamp=20200207175759&version=2.0.1&key=4117E877F5FA0A018889
1283E4B617D5
2.3.1.2.4 簽名結(jié)果
使用各自語(yǔ)言對(duì)應(yīng)的 SM2 簽名函數(shù)家夺,對(duì)拼接得出的待簽名字符串使用私鑰進(jìn)行 SM2 簽
名后,再將字節(jié)碼進(jìn)行 Base64 編碼伐弹,即是簽名結(jié)果拉馋,如簽名結(jié)果。
簽名結(jié)果示例:
URVQNdVNn5mz2EhKZhLTlXNwAWTSncFoSe8Ilx7jhn81eABJ46sdRRN1ZiAiQjPUTixG9bwqEhiJupHRGmyO5w=
2.3.1.3 返回參數(shù)驗(yàn)簽
2.3.1.3.1 篩選
獲取所有請(qǐng)求參數(shù)惨好,不包括字節(jié)類型參數(shù)煌茴,如文件、字節(jié)流日川,剔除 signData蔓腐、encData、
extra 字段龄句。
16
2.3.1.3.2 排序
將篩選的參數(shù)按照第一個(gè)字符的鍵值 ASCII 碼遞增排序(字母升序排序)回论,如果遇到相
同字符則按照第二個(gè)字符的鍵值 ASCII 碼遞增排序,以此類推分歇。
2.3.1.3.3 拼接
將排序后的參數(shù)與其對(duì)應(yīng)值傀蓉,組合成“參數(shù)=參數(shù)值”的格式,并且把這些參數(shù)用&字符
連接起來(lái)职抡,最后拼接上應(yīng)用密鑰 appSecret 在“…參數(shù)=參數(shù)值…”葬燎,此時(shí)生成的字符串為
待簽名字符串,將待簽名字符串 SM2 運(yùn)算缚甩,即是簽名(signData)的值(“signData”谱净、
“encData”、“extra”參數(shù)不參與簽名)擅威。
請(qǐng)求報(bào)文示例:
{
"appId":"43AF047BBA47FC8A1AE8EFB2XXXXXXXX",
"data":{"appId":"43AF047BBA47FC8A1AE8EFB2XXXXXXXX","appUserId":"o8z4C5avQXqC0aWFPf1Mzu6D7
WCQ_bd","idNo":"350181199011193519","idType":"01","phoneNumber":"13763873033","userName":
"測(cè)試"},
"encType":"SM4",
"signData":"URVQNdVNn5mz2EhKZhLTlXNwAWTSncFoSe8Ilx7jhn81eABJ46sdRRN1ZiAiQjPUTixG9bwqEhiJu
pHRGmyO5w==",
"signType":"SM2",
"timestamp":"20200207175759",
"version":"2.0.1"
}
組成的待簽名字符串:
appId=43AF047BBA47FC8A1AE8EFB2XXXXXXXX&data={"appId":"43AF047BBA47FC8A1AE8EFB2XXXXXXXX","
appUserId":"o8z4C5avQXqC0aWFPf1Mzu6D7WCQ_bd","idNo":"350181199011193519","idType":"01","p
honeNumber":"13763873033","userName":"測(cè)試"}
&encType=SM4&signType=SM2&timestamp=20200207175759&version=2.0.1&key=4117E877F5FA0A018889
1283E4B617D5
17
2.3.1.3.4 簽名結(jié)果
使用對(duì)應(yīng)的 SM2 驗(yàn)簽函數(shù)壕探,對(duì)拼接得出的待簽名字符串使用公鑰進(jìn)行 SM2 進(jìn)行驗(yàn)簽,對(duì)
比驗(yàn)簽內(nèi)容的簽名與返回報(bào)文里的 signData 字段比較是否驗(yàn)簽通過(guò)郊丛。
2.3.2 加密算法(SM4)
2.3.2.1 概述
根據(jù) SM4 加密算法李请,加密報(bào)文瞧筛。通過(guò)對(duì)報(bào)文數(shù)據(jù)篩選、排序和拼接捻艳,組成待加密報(bào)文數(shù)
據(jù)驾窟。
2.3.2.2 請(qǐng)求報(bào)文加密
1、組裝請(qǐng)求報(bào)文 根據(jù) API 列表定義參數(shù)认轨,整理請(qǐng)求報(bào)文绅络;
加密報(bào)文示例:
{
"appId":"43AF047BBA47FC8A1AE8EFB2XXXXXXXX",
"data":{"appId":"43AF047BBA47FC8A1AE8EFB2XXXXXXXX","appUserId":"o8z4C5avQXqC0aWFPf1Mzu6D7
WCQ_bd","idNo":"350181199011193519","idType":"01","phoneNumber":"13763873033","userName":
"測(cè)試"},
"encType":"SM4",
"signData":"URVQNdVNn5mz2EhKZhLTlXNwAWTSncFoSe8Ilx7jhn81eABJ46sdRRN1ZiAiQjPUTixG9bwqEhiJu
pHRGmyO5w==",
"signType":"SM2",
"timestamp":"20200207175759",
"version":"2.0.1"
}
2、將 data 字段值嘁字,轉(zhuǎn)換為字符串 jStr恩急;
待加密串示例:
{"appId":"43AF047BBA47FC8A1AE8EFB2XXXXXXXX","appUserId":"o8z4C5avQXqC0aWFPf1Mzu6D7WCQ_bd"
,"idNo":"350181199011193519","idType":"01","phoneNumber":"13763873033","userName":"測(cè)試"}
18
3、根據(jù) SM4 加密算法纪蜒,先使用 appId(渠道 id)作為 Key 加密 appSecret(渠道秘鑰)
生成新的秘鑰串衷恭。(補(bǔ)充:傳入 SM4 加密算法長(zhǎng)度秘鑰為 32 位,實(shí)際底層算法秘鑰應(yīng)用長(zhǎng)
度為前 16 位)纯续;
4随珠、使用 3 獲得的報(bào)文加密密鑰,截取新秘鑰串的前 32 位作為 SM4 密鑰猬错,加密 jStr(data
字段值)字符串(補(bǔ)充:傳入 SM4 加密算法秘鑰長(zhǎng)度為 32 位窗看,實(shí)際底層算法秘鑰應(yīng)用長(zhǎng)度
為前 16 位),并將加密結(jié)果轉(zhuǎn)換為大寫倦炒,獲得加密密文 encData显沈;
密文示例:
4470B6B96A8E0BADA051A318E6B6FBED66B9FC5AB2A4A3C66FDDD3C70BCADD6EF526AB57DC1DC916385CEF348
43AABFCBAF8F1FDEA9DC51A2A56AB3EA3E170201E4EDD3137D6D1BA6A4A773F6F4872A718F56742E5052AD1C0
4E99C91EA048990F06A96E6E1E534E40BD28DFDC204ACA03CAE0DFE0DE5229EDADBD27BBD32DD4C3F9ADC833C
D3CF01CD012CE1799BB6F
5、將加密結(jié)果 encData逢唤,加入請(qǐng)求報(bào)文中拉讯,并清空?qǐng)?bào)文的 data 字段;
加密請(qǐng)求報(bào)文示例:
{
"appId":"43AF047BBA47FC8A1AE8EFB2XXXXXXXX",
"encData":"64A9C5A7AB3AEA5FC01DE87025F999521C08D25DA13BD715D7E036A7D7C1DBCB6AB7914898A23A
99C97EBEFE5277247AD7D0DD9B18F4DCC71A2C280C5143F25B857C795E6BA9F399652C3A4264FC2CBBA7E06B0
8E151362301659FC3F3773480966E8D19AB082B64A4F9B9BDBABCE57DC2CA95C9975090885AB286BB736BA3BB
98F3540962552F40C8350926B93CD21CB7A624E6C4E41E349627E7B36B5C1B5F94604EDC42EA6034D63B2D387
A87F42130F0D47B9445F9D729566FE183F9A959",
"encType":"SM4",
"signData":"URVQNdVNn5mz2EhKZhLTlXNwAWTSncFoSe8Ilx7jhn81eABJ46sdRRN1ZiAiQjPUTixG9bwqEhiJu
pHRGmyO5w==",
"signType":"SM2",
"timestamp":"20200207175759",
"version":"2.0.1"
}
6鳖藕、返回報(bào)文解密魔慷;
19
響應(yīng)報(bào)文示例:
{
"appId":"43AF047BBA47FC8A1AE8EFB2XXXXXXXX",
"encData":"64A9C5A7AB3AEA5FC01DE87025F999521C08D25DA13BD715D7E036A7D7C1DBCB6AB7914898A23A
99C97EBEFE5277247AD7D0DD9B18F4DCC71A2C280C5143F25B857C795E6BA9F399652C3A4264FC2CBBA7E06B0
8E151362301659FC3F3773480966E8D19AB082B64A4F9B9BDBABCE57DC2CA95C9975090885AB286BB736BA3BB
98F3540962552F40C8350926B93CD21CB7A624E6C4E41E349627E7B36B5C1B5F94604EDC42EA6034D63B2D387
A87F42130F0D47B9445F9D729566FE183F9A959",
"encType": "SM4",
"code": "0",
"message": "成功",
"signData": "
OTk0MUYwREIyODk1RDhDRDQ5NjQzRTU1RENCN0ZGMzdCRUY4MzFFNDMxMTM1OTY0MEM1MDk3N0E4REE2Nzk2QQ=="
,
"signType": "SM2",
"timestamp": "20161226093147927",
"success": true,
"version": "2.0.1"
}
加密密文數(shù)據(jù) enctData 示例:
64A9C5A7AB3AEA5FC01DE87025F999521C08D25DA13BD715D7E036A7D7C1DBCB6AB7914898A23A99C97EBEFE5
277247AD7D0DD9B18F4DCC71A2C280C5143F25B857C795E6BA9F399652C3A4264FC2CBBA7E06B08E151362301
659FC3F3773480966E8D19AB082B64A4F9B9BDBABCE57DC2CA95C9975090885AB286BB736BA3BB98F35409625
52F40C8350926B93CD21CB7A624E6C4E41E349627E7B36B5C1B5F94604EDC42EA6034D63B2D387A87F42130F0
D47B9445F9D729566FE183F9A959
7、根據(jù) encType 聲明加密算法吊奢,先使用 appId(渠道 id)作為 Key 加密 appSecret(渠
道秘鑰)生成新的秘鑰串盖彭。(補(bǔ)充:傳入 SM4 加密算法長(zhǎng)度秘鑰為 32 位,實(shí)際底層算法秘
鑰應(yīng)用長(zhǎng)度為前 16 位)页滚;
20
8、根據(jù) encType 聲明加密算法铺呵,使用 7 獲取的報(bào)文解密密鑰裹驰,解密 encData 獲取明文
字符串 jStr 示例:
{"appId":"43AF047BBA47FC8A1AE8EFB2XXXXXXXX","appUserId":"o8z4C5avQXqC0aWFPf1Mzu6D7WCQ_bd"
,"idNo":"350181199011193519","idType":"01","phoneNumber":"13763873033","userName":"測(cè)試"}
9、將 jStr 轉(zhuǎn)換為 JSON 賦值 data片挂,獲取解密后返回報(bào)文示例:
{
"appId":"43AF047BBA47FC8A1AE8EFB2XXXXXXXX",
"data":{"appId":"43AF047BBA47FC8A1AE8EFB2XXXXXXXX","appUserId":"o8z4C5avQXqC0aWFPf1Mzu6D7
WCQ_bd","idNo":"350181199011193519","idType":"01","phoneNumber":"13763873033","userName":
"測(cè)試"},
"encType": "SM4",
"code": "0",
"message": "成功",
"signData": "
OTk0MUYwREIyODk1RDhDRDQ5NjQzRTU1RENCN0ZGMzdCRUY4MzFFNDMxMTM1OTY0MEM1MDk3N0E4REE2Nzk2QQ=="
,
"signType": "SM2",
"timestamp": "20161226093147927"幻林,
"success": true,
"version": "2.0.1"
}
2.3.3 報(bào)文公共參數(shù)
3.3.3.1 請(qǐng)求報(bào)文
參數(shù) 參數(shù)名稱 類型 可空 參數(shù)說(shuō)明
appId 渠道 id String(32) N
version 版本號(hào) String(6) N 2.0.1
timestamp 當(dāng)前時(shí)間 String(32) N 時(shí)間戳
21
參數(shù) 參數(shù)名稱 類型 可空 參數(shù)說(shuō)明
encType 加密方式 String(6) N SM4
encData 加密數(shù)據(jù) String(max) N
signType 簽名方式 String(6) N SM2
signData 簽名串 String(200) N
3.3.3.2 返回報(bào)文
參數(shù) 參數(shù)名稱 類型 可空 參數(shù)說(shuō)明
code 響應(yīng)狀態(tài)碼 int N
appId 渠道 id String(32) N
timestamp 當(dāng)前時(shí)間 String(32) N 時(shí)間戳
encType 加密方式 String(6) N SM4
signType 簽名方式 String(6) N SM2
signData 簽名串 String(200) N
encData 加密數(shù)據(jù) String(max) N
message 響應(yīng)異常信息 String(max) Y
success 響應(yīng)標(biāo)識(shí) boolean Y
version 版本號(hào) String(6) N 2.0.1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贞盯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子沪饺,更是在濱河造成了極大的恐慌躏敢,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,686評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件整葡,死亡現(xiàn)場(chǎng)離奇詭異件余,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)遭居,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門啼器,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人俱萍,你說(shuō)我怎么就攤上這事端壳。” “怎么了枪蘑?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,160評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵损谦,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我岳颇,道長(zhǎng)照捡,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,736評(píng)論 1 284
  • 正文 為了忘掉前任赦役,我火速辦了婚禮麻敌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘掂摔。我一直安慰自己术羔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,847評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布乙漓。 她就那樣靜靜地躺著级历,像睡著了一般。 火紅的嫁衣襯著肌膚如雪叭披。 梳的紋絲不亂的頭發(fā)上寥殖,一...
    開(kāi)封第一講書(shū)人閱讀 50,043評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音涩蜘,去河邊找鬼嚼贡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛同诫,可吹牛的內(nèi)容都是我干的粤策。 我是一名探鬼主播,決...
    沈念sama閱讀 39,129評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼误窖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼叮盘!你這毒婦竟也來(lái)了秩贰?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,872評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤柔吼,失蹤者是張志新(化名)和其女友劉穎毒费,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體愈魏,經(jīng)...
    沈念sama閱讀 44,318評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡觅玻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,645評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蝌戒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片串塑。...
    茶點(diǎn)故事閱讀 38,777評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖北苟,靈堂內(nèi)的尸體忽然破棺而出桩匪,到底是詐尸還是另有隱情,我是刑警寧澤友鼻,帶...
    沈念sama閱讀 34,470評(píng)論 4 333
  • 正文 年R本政府宣布傻昙,位于F島的核電站,受9級(jí)特大地震影響彩扔,放射性物質(zhì)發(fā)生泄漏妆档。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,126評(píng)論 3 317
  • 文/蒙蒙 一虫碉、第九天 我趴在偏房一處隱蔽的房頂上張望贾惦。 院中可真熱鬧,春花似錦敦捧、人聲如沸须板。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,861評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)习瑰。三九已至,卻和暖如春秽荤,著一層夾襖步出監(jiān)牢的瞬間甜奄,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,095評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工窃款, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留课兄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,589評(píng)論 2 362
  • 正文 我出身青樓晨继,卻偏偏與公主長(zhǎng)得像第喳,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子踱稍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,687評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容