对接支付宝的城市服务(水费)
支付宝商家账户申请
- 申请网址 : b.alipay.com
- 注册流程
1. 申请商家版支付宝
2. 进行实名认证,等待审核(3个工作日)
3. 成为开发者
4. 签约支付功能(详见支付宝支付能力)中的一种,可以多种
5. 审核支付功能 (3-5个工作日)
6. 开发者配置、Admin配置
支付宝方相关概念
- 支付宝应用: 所有支付对外都功能都称之应用,应用又分为第三方应用和自研型应用。
- 第三方应用: 主要服务对象是ISV(独立软件服务商)。
- 自研型应用: 主要给商户自己用。自研型应用又分为小程序、网页&移动应用、生活号。
- 应用审核 : 创建应用会收集名称和图标,需要等待审核。
- 商户: 所有支付宝的对公客户都被称为商户。
- 独立软件服务商 :即ISV,Independent Software Vendors , 特指专门从事软件的开发、生产、销售和服务的企业。 这个扮演的角色主要是帮助那些不具备软件开发的公司(比如很多企事业单位)去完成软件开发。所以支付宝选第三方应用的时候,会选择第三方代理公司,这里的代理就是ISV。
支付宝支付能力
目前官方https://docs.open.alipay.com/ 文档中支付能力包括:
- 1. 当面付
- 2. APP支付
- 3. 手机网站支付
- 4. 电脑网站支付
- 5. 花呗分期
- 6. 刷脸付
- 7. 收单资金结算到银行账户的到账消息
支付宝第三方开发流程
支付宝密钥生成
密钥生成工具地址: https://docs.open.alipay.com/291/105971
- 下载文件的名字: RSA签名验签工具windows_V1.4
- 注意 : 1. 双击脚本文件 “RSA签名验签工具.bat” 即运行RSA签名验签工具。
2. RSA2签名方式使用算法:SHA256withRSA
RSA签名方式使用算法:SHA1withRSA
3. 签名验签工具不要放在文件路径名存在空格的文件夹下。
- 密码生成后:
开发者就可以在应用的开发配置页面进行配置。点击“设置应用公钥”后,复制上一步生成的公钥,点击“保存”,即可完成公钥的设置。
签名验签,私钥的加签和公钥的验签都用下面这个包
groupid : com.alipay.sdk
artifactid : alipay-sdk-java
Lastest Version : 3.7.26.ALL
Java证书管理工具keytool
说明:和支付宝对接用的是SSLServerSocket, 我们开启服务端Socket,等待支付宝来调用。
Keytool生成密钥
- 生成服务端
keytool -genkey -alias serverkey -keyalg RSA -validity 365 -keystore d:\key\kserver.keystore
输入密钥库口令及地区信息等(密钥库口令123456)
- 输入密钥口令(1234567)
- 建议用PKC12标准
keytool -importkeystore -srckeystore d:\key\kserver.keystore -destkeystore d:\key\kserver.keystore -deststoretype pkcs12
(此时报错:keytool 错误: java.lang.Exception: 目标 pkcs12 密钥库具有不同的 storepass 和 keypass。请在指定了 -destkeypass 时重试。)
更改命令如下:
keytool -importkeystore -srckeystore d:\key\kserver.keystore -destkeypass 1234567 -destkeystore d:\key\kserver.keystore -deststoretype pkcs12
所以尽量库密码和私钥密码一致。
- 根据私钥导出服务端证书
keytool -export -alias serverkey -keystore d:\key\kserver.keystore -file d:\key\server.crt
- 将服务证书导入到客户端Trust keystore中
keytool -import -alias serverkey -file d:\key\server.crt -keystore d:\key\tclient.keystore
- 生成客户端
keytool -genkey -alias clientkey -keyalg RSA -validity 365 -keystore d:\key\kclient.keystore
密钥库和密钥的密码都设置成abcdef
执行:
keytool -importkeystore -srckeystore d:\key\kclient.keystore -destkeystore d:\key\kclient.keystore -deststoretype pkcs12
就不会再让加-destkeypass 时重试
- 根据私钥导出客户端证书
keytool -export -alias clientkey -keystore d:\key\kclient.keystore -file d:\key\client.crt
- 将客户端证书导入到服务端Trust keystore中
keytool -import -alias clientkey -file d:\key\client.crt -keystore d:\key\tserver.keystore
数据加密额外补充
对称加密
对称加密是一种很快速很简单的加密方式,加密和解密用相同的密钥,密钥越短,解密耗时越短,密钥越长,解密时间就越长。所以使用对称加密需要注意两个方面:
一是如何平衡耗时和安全性。二是加解密双方需要如何传送和保管密钥,一旦密钥泄露,可是天大的事情。
非对称加解密(公钥和私钥对)
非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。
RSA数字签名算法,历史二十年,经历无数攻击依然屹立不倒。
公钥 : 可以随便在网络上传输,也可以告知别人,大家都可以看得到。
私钥 : 自己的非常重要非常私密的。
着重注意 : 这个秘钥对中,如果使用任意一把来加密数据,那么只有使用另外一把才能解密数据。
而用法有两种:
第一种用法:公钥加密,私钥解密。---用于加解密
第二种用法:私钥签名,公钥验签。---用于签名
签章,也叫签名,也叫数字签名
签章 : 其实就是用私钥加密,对应的公钥解密的过程。为什么会出现签章这个过程?第一种情况:A要给B发密文,那么A肯定用B的公钥加密,然后B用自己私钥解密
就可以。但是C也可以拿B的公钥加密,冒充A发给B,B用自己私钥解密,认为是A发的,所以就出现风险问题。第二种情况: A要给B发送明文,随便哪个人都可以冒充A给B发信息。所以,这两种情况B都无法认证A是否是真的A,那么签章就是避免冒充的。
数字签名的过程:
A 要给 B 发送一段明文,第一,如何避免有人冒充A? 第二,如何避免A发送的内容没有被篡改过?
第一步 :明文 ---- 经过HASH算法 ---- 生成很短的消息摘要,为什么这么做?
1. hash算法不可逆。
2.消息内容不重复,哪怕明文改一个字,重新hash后生成的摘要都和之前的不一样,目的就是防止明文内容被篡改。
第二步 :消息摘要 ---- A的私钥进行加密 ---- 得到A的数字签名(Signature),相当于古代A按的指拇印。
第三步 :把数字签名附加到明文信息中,传给B。B拿到这份信件后,同样需要做两件事,第一核实是否是A发过来的,第二,核实A发过来的内容没有被篡改。
第四步 : B用A的公钥对A的数字签名进行解密,解密成功,便确认是A发来的,不是C或者D冒充。接着,B 把明文再进行hash运算,和解密数字签名得到的消息摘要对比,如果一致,说明信件没有被篡改。
数字证书
我们再来试想一个场景,A本来想把自己的公钥给B,用作他们的加解密,但是B没有拿到A的公钥前,有个别有用心的C冒充A,把C的公钥发给了B。此时B认为拿到了A的公钥,于是,他就用误认为A的公钥(实际是C的公钥)给A写信:我的银行密码是888888。C拦截到B的信件后,用自己的私钥就解密打开了。
那么,如何避免公钥冒用呢?前面说到用签名的方式,可以验证发信人的真实身份。这里要避免公钥冒用,就产生了数字证书。
数字证书的特点:
i. 由专门的机构签发的数字证书才安全有效。
ii、签发数字证书是收费的。
iii、不会被冒充,安全可信。
iv、数字证书有使用期限,过了使用期限,证书变为不可用。CA也可以在使用期内,对证书进行作废操作。
v、CA的公钥已经集成到操作系统中了。
生成数字证书的流程如下:
i、持有人将公钥以及身份信息发送给权威机构。
ii、权威机构负责对持有人的身份进行验证,确保公钥和持有人的信息准确无误。
iii、权威机构使用自己私钥对持有人公钥进行数字签名,生成数字证书。
iv、为了确保证书不被篡改,权威机构对数字证书进行hash计算(指纹算法),生成摘要(指纹),使用自己的私钥对摘要进行数字签名,放到数字证书中。
v、对持有人收费。
这样,就可以避免公钥被冒用。
综上,私钥可以通过数字签名来保证自己的唯一和真实,公钥可以用权威机构颁发的数字证书来保证不会被冒用,就大大的增加了数据在网络上传送的安全性。
额外说明
第一点:你把所有准备工作做好,用支付宝对外的在线客服联系支付宝,支付宝会派人和你对接。会提供给你对接的接口以及数据交互的demo代码。
第二点:即便是测试,也需要真实的事业单位账号。
第三点:支付宝的接口也不是一层不变的,需要和他们联调,按照联调结果上线。
第四点:这里不提供源码,我接到任务时也是丈二和尚摸不着头脑,慢慢和支付宝方沟通,自然会水到渠成。