已幫助多家醫(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×tamp=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×tamp=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