新页面
接入说明
本文档展示了如何通过http请求,完成于易百电子凭证系统完成对接。 本文档主要面向的读者为各有需求接入电子凭证的,有一定开发能力的技术人员。
本文档中必填字段仅限于易百自制码,第三方制码可能存在部分字段无法返回。在对接时可与易百技术人员沟通
配置密钥
取码对接方对接时,需跟业务同事沟通后把公钥发送到指定邮箱。易百电子凭证系统会分配app_id, version, saleChannelId, 易百电子凭证系统公钥等信息
开发者调用接口前需自行生成RSA密钥,RSA密钥包含:
- 应用私钥(APP_PRIVATE_KEY)
- 应用公钥(APP_PUBLIC_KEY)
RSA私钥与公钥生成方法
1.运行 openssl
CMD> openssl
2.生成明文RSA私钥
OpenSSL> genrsa -out rsa_private_key.pem 2048
- 其中
rsa_private_key.pem
为私钥保存的文件名,2048
位为密钥长度 - 默认情况下,openssl 输出的密钥格式为 PKCS#1-PEM
3.生成明文RSA公钥
OpenSSL> rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
- 其中
rsa_private_key.pem
为私钥保存的文件名,rsa_public_key.pem
为公钥保存的文件名
4.如果是Java语言,私钥需要转成PKCS8格式
OpenSSL> pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -out rsa_private_key.pkcs8 -nocrypt
- 其中
rsa_private_key.pem
为私钥保存的文件名,rsa_private_key.pkcs8
为私钥PKCS8格式保存的文件名
生成密钥后在电子凭证管理中心进行密钥配置,配置完成后可以获取:
- 电子凭证公钥(WHALE_PUBLIC_KEY)。
第三步:搭建和配置开发环境
1.调用方法
内容 | 说明 |
---|---|
通讯方式 | 采用 HTTPS 方式访问 |
提交方法 | POST (application/json) |
交互数据格式 | JSON |
字符编码 | UTF-8 |
签名算法 | SHA256WithRSA |
签名验证 | 提交和返回数据都需要验证签名 |
2.报文结构
请求报文和返回报文都采用如下的报文结构
序号 | 参数 | 类型 | 参考数据 | 参数说明 | 备注 |
---|---|---|---|---|---|
1 | action | String | MakeCode | 交易类型 | 具体接口有详细说明 |
2 | app_id | String | 2014072300007148 | 应用ID | 开放平台分配给开发者的应用ID |
3 | biz_content | String | BASE64 | 报文内容BASE64 | 具体接口中有详细说明,本域需要采用BASE64编码 |
4 | timestamp | String | 1483372334 | Unix时间戳 | 单位:秒 |
5 | version | String | 20171212 | 版本号 | 用于兼容不同的报文协议对应后台不同的处理方式 |
6 | sign | String | 7E65B60DCFA42B04 | 数据签名 | 详见:签名算法 |
注意事项
- 其中biz_content字段是对请求参数或返回参数进行BASE64编码后得到的,例如:
{
"traceNo": "99000009100010101732123",
"originalTraceNo": "99000009100010101732124"
}
- BASE64编码后得到:
ewogICAgICAgICAidHJhY2VObyI6ICI5OTAwMDAwOTEwMDAxMDEwMTczMjEyMyIsCiAgICAgICAgICJvcmlnaW5hbFRyYWNlTm8iOiAiOTkwMDAwMDkxMDAwMTAxMDE3MzIxMjQiCiAgICAgfQ==
-
赋值给biz_content字段。
-
如果请求报文无法解析,或传过来的app_id无效,则异常提示返回的报文中sign字段为空。
报文举例
{
"action" : "efuli.cashvoucher.send",
"app_id" : "2014072300007148",
"biz_content" : "ewogICAgICAgICAidHJhY2VObyI6ICI5OTAwMDAwOTEwMDAxMDEwMTczMjEyMyIsCiAgICAgICAgICJvcmlnaW5hbFRyYWNlTm8iOiAiOTkwMDAwMDkxMDAwMTAxMDE3MzIxMjQiCiAgICAgfQ==",
"timestamp" : "1483372334",
"version" : "20171212",
"sign" : "7E65B60DCFA42B04"
}
3.签名算法
a.筛选并排序
获取所有请求参数,不包括字节类型参数,如文件、字节流,剔除sign字段,剔除值为空的参数,并按照第一个字符的键值ASCII码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值ASCII码递增排序,以此类推。
- 注意:biz_content字段需要先Base64编码,再进行拼接
b.拼接
将排序后的参数与其对应值,组合成“参数=参数值”的格式,并且把这些参数用&字符连接起来,此时生成的字符串为待签名字符串。
c.签名值计算
使用各自语言对应的SHA256WithRSA签名函数利用应用私钥(APP_PRIVATE_KEY)对待签名字符串进行签名,并进行Base64编码。
示例报文
{
"action" : "efuli.cashvoucher.send",
"app_id" : "2014072300007148",
"biz_content" : "ewogICAgICAgICAidHJhY2VObyI6ICI5OTAwMDAwOTEwMDAxMDEwMTczMjEyMyIsCiAgICAgICAgICJvcmlnaW5hbFRyYWNlTm8iOiAiOTkwMDAwMDkxMDAwMTAxMDE3MzIxMjQiCiAgICAgfQ==",
"timestamp" : "1483372334",
"version" : "20171212",
"sign" : "7E65B60DCFA42B04"
}
应用私钥(APP_PRIVATE_KEY)
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAv0iJ6VYAUSxiudvCtj1GxZjxk3bsT1sINouo+jZydoE8rddB
KeRkM1Wjyz1/20KfEv28ySnRQzOEpAFwRdjDcfF/5ql6+2HLfSRhJTLmyGz5zLdr
HJk/9ZJDpv5KY5q5CoV4lQ4m6GQBEjN/xxRvyE0sUNV8huUpEzDqHIL/JOEF+REz
gJYSL6Lc/2NDtErzjIJhAQjD5oYcRp/7oPChDnuIIhuSfGAyVOIItZyRQz/9n4/D
ptA21s51f0j2NoTd9PUqFo51PsaRrPwgAW3dzNFG6lkqDtm/x5Psknurm94A7Wrk
ZlBgex8lpSNu6eVy2tMsMCGZdk+REqI2ru4+iQIDAQABAoIBAAzUpMuOBT9spsKo
xwrKWXDvrWSi2X8JMCfYfmEqPctNJ/DRO4G/3CjFWdNMMMNYWKtBceRcdbj4P7Fw
l0NYIuQFuvqR67no+WlPg2SnYWuYQ7lDpF+qt+uVAAy3ie3cdwUJpuj4pgt4icna
wntsF4NsCcjySQQTYwnyggGfl9W1VK0S5WQUIp3OKKjiG/zHXeXssoRIzLshHkK6
TSbmsaPCVUwlZ5o3SNmYKL5KNnkaz0IFFRCeE70HrHuP3lGuO65FInZm9HiqzaJn
t1jiFTo+XIk7A+DBfyMJh2EZh0srw9WpxvK5Ka4pOnJjx1pXDjxG4K6fjPCEZVDY
QJwOY8ECgYEA3zpvhPwF7FXBMUzqdrf/IYwedIrbzRom+mZdVxoRjASreeSIZK8y
Br7EGvh/KVL96bVHh+FeQAB1JGF94CKPWX6BWq35AkPOS9kTwTWTZDYe5czR/h4f
Dj0rlP+bdHcimtNlmyfS9PCwCNT+NZLaI/jxDhuXZrSLtebpyGYfqWUCgYEA212F
WkDsAHfE4CoKkeI+nq4C/s5/1MsZZxFgsuYnB2KQZtiOEaNQ7rz1fnvz5f+OsZEL
9KA5kn4ZZ0pDo51cZa95l0wVKlNLw4tij624k20GTvhIre8Exj27XE/4L2pvhMQ0
iYGR5Syfh0nXyWfokRNvOQOFkKCcJlZ9aZuPAFUCgYB9FI88YsMm4/42k7SlBQBu
WccO4me7CzZgBE+06KSAYnV6/XT3hbtwUCAuRKNsEla4R51nI/7duePpmL8hgfv0
14+/sc/fVwMXOPF6x3xpIHI7rYLU8yfPoLL08Cy5G7BGNMGwKKZqHRtmN4KhnkGg
+nKHxyoUoIHQUS0Z3y9KiQKBgDkJR/L/jl1Qxs/CHp1vxfhcJks6ReJ+LEywKARb
8ynoZsNW6xmK7TAl0W7hq7jRibiBjio8vrtoLhK9LHkOIUgPJ/4+ugIXRkvBog7Z
jHRIlKtTwxH2Y7dntZ9663zon7ZVjZNzLQv5XkE+4exsJ/wQoYqhb8j6+Z6+Pj2H
RNdBAoGAE0sqRZTX8MmA2yqRVMkm3Y+LOoKNuDLOj89Bjwg93aKwtVstUKx8yqw8
ivCY5jfIrFCb83l1JQDBjhKIUG2NfKJZiIeE1BQOdVkdVUyU5hYxdHRm4s4gJB2Q
hsIEATHf/URhKlP7nMi4qKecTFYpJuMcsT6uisahbMGSEJDutlI=
-----END RSA PRIVATE KEY-----
拼接报文参数
String
List
action=efuli.cashvoucher.send&app_id=2014072300007148&biz_content=ewogICAgICAgICAidHJhY2VObyI6ICI5OTAwMDAwOTEwMDAxMDEwMTczMjEyMyIsCiAgICAgICAgICJvcmlnaW5hbFRyYWNlTm8iOiAiOTkwMDAwMDkxMDAwMTAxMDE3MzIxMjQiCiAgICAgfQ==×tamp=1483372334&version=20171212
签名值计算
gUTdEB0lAS/ECkP98weSHf6k31Fmd4hcw0zPG8ewbMTfDFSubKlel/1C16upb2AHzN873HMwUlkcTg7ZuN92KDIkfsbINd2IwVY2tWMvKt5O8gqC2a8XbS25ZObUlLK5zZmU7mQ/DLbyY+EAhkYdGnwskloJkydi2zmLv99xT5G01yXBLSNiTrPBTsc2OhBkA44kknnok0x+hS4HfcgQwGPMG4y+V5aT1bhPDypwdbfAg+EN/5XoSECsIcsvBirdk+BGPjBIuwHHF+Hir/3E3i20ImtlowBc6jwh5qFOVqGN/w2UEPfg6xJxHyW04FBipt6mw7huD4PA4pA4qZRnsg==
签名Demo Java版