
欢迎来到预见猿份,本站项目均为站长原创,学习中有问题可直接提交给站长老苗解决(微信:mrt_0607)。
苗润土老师,20余年一线项目经验,2014年加入黑马,星辰wms、云岚到家、学成在线项目作者,历任高级讲师、教学主管及课程研究员。 b站老苗
第八章 支付模块(学员专享)
学习目标
- 能够说出对接小程序支付接口的流程
- 能够测试通过支付服务的支付和退款接口
- 能够说出支付服务核心表设计
- 能够说出如何防止重复支付
- 能够说出对接支付服务接口有哪些及流程
- 能够对接支付服务的支付接口
- 能够对接支付服务查询支付结果接口
- 能够开发支付结果通知功能
- 能够说出取消订单模块的设计方案
- 能够实现取消订单自动退款功能
- 能够说出策略模式在取消订单模块的应用方案
1 支付服务
1.1 支付接口调研
通常项目的支付业务会开发独立的支付服务,由支付服务对接第三方支付平台,如:微信、支付宝、聚合支付平台等。
对于小程序支付需要对接微信的小程序支付接口,对于APP支付和PC网站支付可以对接微信、支付宝或第三方聚合支付平台。
目标:根据需求调研支付接口,确定本项目需要对接哪些接口。
1)界面原型
用户下单成功提示用户支付,用户支付成功即下单成功,下单成功后家政服务人员才可以进行抢单,如下图:

用户使用的是微信小程序,所以支付过程是使用微信支付,点击确认支付即弹出微信支付界面,输入支付密码确认支付,支付成功后显示下单成功。
2) 小程序支付调研
参考“微信支付调研 v1.0”文档。
通过调研小程序支付,我们系统需要与小程序支付接口对接有:
下单接口:家政系统后端调用 微信支付的下单接口。
支付通知:微信支付调用家政系统后端接口。
商户订单号查询:家政系统后端调用 微信支付的商户订单号查询接口。
这里有一个问题不方便广大学生学习:
就是在小程序调起支付这里,微信会校验小程序的APPID与微信支付商户的ID是否绑定,微信支付商户的ID怎么获取呢?是需要注册商户上传企业资料及法人资料,微信审核通过后方可 注册成功,所以注册成为一个普通商户对大家有限制。
针对这些限制我们尝试调研其它的接口。
3) 扫码支付调研
下边调研扫码支付支付,此接口不存在小程序端调起支付的限制,要注意:开发小程序一定要对接微信小程序的支付接口,在小程序上使用 的扫码支付是不符合小程序支付的用户需求的,这里仅是用于学习。
参考“微信支付调研 v1.0”文档。
4)如何保证接口安全性?
第三方支付平台除了使用https协议进行加密传输以外,还通过接口签名以及敏感参数加密的方式保证接口的安全性。
拿 微信支付接口为例,请求任何微信支付接口都需要对请求参数进行签名,微信会进行验签,如果通过才会进行业务处理。
详细参见:https://pay.weixin.qq.com/docs/merchant/development/interface-rules/signature-generation.html
什么是签名和验签
签名是对原始数据通过签名算法生成的一段数据(签名串),用于证明数据的真实性和完整性。签名通常使用密钥进行生成,这个密钥可以是对称密钥或非对称密钥中的私钥。
验签是对签名串进行验证的过程,用于确认数据的真实性和完整性。验签的过程通常使用与签名过程中相对应的公钥进行解密。
签名和验签是为了防止内容被篡改。
参考微信支付的文档,签名方式如下:
第一步生成签名串:
签名串一共有五行,每一行为一个参数。结尾以\n(换行符,ASCII编码值为0x0A)结束,包括最后一行。如果参数本身以\n结束,也需要附加一个\n。
HTTP请求方法\n
URL\n
请求时间戳\n
请求随机串\n
请求报文主体\n
示例:
GET\n
2/v3/certificates\n
31554208460\n
4593BEC0C930BF1AFEB40B4A08C8FB242\n
5\n第二步计算签名值
使用商户私钥对待签名串进行SHA256 with RSA签名,并对签名结果进行Base64编码得到签名值。
第三步请求设置http头
通过HTTP Authorization头来传递签名信息,如下:
Authorization: 认证类型 签名信息示例:
Authorization: WECHATPAY2-SHA256-RSA2048 mchid="1900009191",nonce_str="593BEC0C930BF1AFEB40B4A08C8FB242",signature="uOVRnA4qG/MNnYzdQxJanN+zU+lTgIcnU9BxGw5dKjK+VdEUz2FeIoC+D5sB/LN+nGzX3hfZg6r5wT1pl2ZobmIc6p0ldN7J6yDgUzbX8Uk3sD4a4eZVPTBvqNDoUqcYMlZ9uuDdCvNv4TM3c1WzsXUrExwVkI1XO5jCNbgDJ25nkT/c1gIFvqoogl7MdSFGc4W4xZsqCItnqbypR3RuGIlR9h9vlRsy7zJR9PBI83X8alLDIfR1ukt1P7tMnmogZ0cuDY8cZsd8ZlCgLadmvej58SLsIkVxFJ8XyUgx9FmutKSYTmYtWBZ0+tNvfGmbXU7cob8H/4nLBiCwIUFluw==",timestamp="1554208460",serial_no="1DDE55AD98ED71D6EDD4A4A16996DE7B47773A8C"
WECHATPAY2-SHA256-RSA2048:这是签名算法的标识,表明使用的是基于SHA-256和RSA-2048的签名方法。mchid="1900009191":商户ID(Merchant ID),这是微信支付分配给商户的唯一标识。nonce_str="593BEC0C930BF1AFEB40B4A08C8FB242":随机字符串(Nonce String),用于确保HTTP请求的不可重复性(non-replayability)。每次请求都应该不同。signature="... ":签名(Signature),这是经过签名算法计算后得到的一串字符,用于验证请求的完整性和真实性。这里省略了一部分,因为签名太长了。签名是通过将其他参数与商户的私钥一起进行加密运算得出的。timestamp="1554208460":时间戳(Timestamp),表示请求的时间点,通常为Unix时间戳格式(从1970年1月1日00:00:00开始所经过的时间秒数)。这里的值对应于2019年4月2日 04:14:20 UTC。serial_no="1DDE55AD98ED71D6EDD4A4A16996DE7B47773A8C":证书序列号(Serial Number),用于标识微信支付颁发给商户的数字证书。
微信支付收到请求根据请求头Authorization的内容进行验签,验证信息是否被篡改。
同样,如果微信支付通知支付结果给业务系统,业务系统也需要使用SHA256 with RSA进行验签。
参考:https://pay.weixin.qq.com/docs/merchant/development/interface-rules/signature-verification.html
- 获取证书
- 检查平台证书序列号
- 检查时间戳是否已过期
- 获取应答时间戳、应答随机串、应答报文主体,组成验签串,行尾以
\n结束,举例如下:Bash1554209980\n c5ac7061fccab6bf3e254dcf98995b8c\n {"data":[{"serial_no":"5157F09EFDC096DE15EBE81A47057A7232F1B8E1","effective_time":"2018-03-26T11:39:50+08:00","expire_time":"2023-03-25T11:39:50+08:00","encrypt_certificate":{"algorithm":"AEAD_AES_256_GCM","nonce":"4de73afd28b6","associated_data":"certificate","ciphertext":"..."}}]}\n
- 获取应答签名,
BashWechatpay-Signature: uOVRnA4qG/MNnYzdQxJanN+zU+lTgIcnU9BxGw5dKjK+VdEUz2FeIoC+D5sB/LN+nGzX3hfZg6r5wT1pl2ZobmIc6p0ldN7J6yDgUzbX8Uk3sD4a4eZVPTBvqNDoUqcYMlZ9uuDdCvNv4TM3c1WzsXUrExwVkI1XO5jCNbgDJ25nkT/c1gIFvqoogl7MdSFGc4W4xZsqCItnqbypR3RuGIlR9h9vlRsy7zJR9PBI83X8alLDIfR1ukt1P7tMnmogZ0cuDY8cZsd8ZlCgLadmvej58SLsIkVxFJ8XyUgx9FmutKSYTmYtWBZ0+tNvfGmbXU7cob8H/4nLBiCwIUFluw==使用 base64 解码
Wechatpay-Signature字段值,将保存为文件signature.txt。Java$openssl base64 -d -A <<< \ 'CtcbzwtQjN8rnOXItEBJ5aQFSnIXESeV28Pr2YEmf9wsDQ8Nx25ytW6FXBCAFdrr0mgqngX3AD9gNzjnNHzSGTPBSsaEkIfhPF4b8YRRTpny88tNLyprXA0GU5ID3DkZHpjFkX1hAp/D0fva2GKjGRLtvYbtUk/OLYqFuzbjt3yOBzJSKQqJsvbXILffgAmX4pKql+Ln+6UPvSCeKwznvtPaEx+9nMBmKu7Wpbqm/+2ksc0XwjD+xlvlECkCxfD/OJ4gN3IurE0fpjxIkvHDiinQmk51BI7zQD8k1znU7r/spPqB+vZjc5ep6DC5wZUpFu5vJ8MoNKjCu8wnzyCFdA==' > signature.txt
- 最后,获取证书中的公钥,验证签名,得到验签结果。
Java$ openssl dgst -sha256 -verify 1900009191_wxp_pub.pem -signature signature.txt << EOF 1554209980 c5ac7061fccab6bf3e254dcf98995b8c {"data":[{"serial_no":"5157F09EFDC096DE15EBE81A47057A7232F1B8E1","effective_time":"2018-03-26T11:39:50+08:00","expire_time":"2023-03-25T11:39:50+08:00","encrypt_certificate":{"algorithm":"AEAD_AES_256_GCM","nonce":"d215b0511e9c","associated_data":"certificate","ciphertext":"..."}}]} EOF Verified OK
加密与解密
加密是将原始的、可读的数据(称为明文)通过某种算法和密钥转换成不可读的数据(称为密文)。加密的目的是防止未经授权的访问者能够理解或识别被加密的信息。加密算法通常基于密钥,有对称加密和非对称加密两种主要类型。
解密是加密的逆过程,即将密文还原为明文。只有持有正确密钥的人或系统能够进行解密操作。解密的目的是还原加密前的原始信息,使其能够被理解和使用。
- 对称加密:使用相同的密钥进行加密和解密。这种方法的优点是速度快,适合大量数据的加密处理。常见的对称加密算法包括AES(高级加密标准)、DES(数据加密标准)、3DES(三重数据加密算法)等。
- 非对称加密:使用一对密钥,即公钥和私钥。公钥可以公开分发,而私钥则必须保密。公钥用于加密消息,私钥用于解密消息;或者反过来,在数字签名的情况下,私钥用于创建签名,而公钥用于验证签名。常见的非对称加密算法包括RSA(Rivest-Shamir-Adleman)、ECC(椭圆曲线密码术)等。
需要注意的是,在实际应用中,非对称加密主要用于密钥交换或数字签名,因为它的计算量大,速度相对较慢。对于大量的数据加密,通常会结合使用对称加密和非对称加密技术,即先用对称加密算法加密数据,再用非对称加密算法来保护对称密钥的安全传输。这种组合使用的方式称为混合加密系统。
加密与解密是为了防止内容被泄露,保证内容的机密性。
为了保证安全性,微信支付在回调通知和平台证书下载接口中,对关键信息进行了AES-256-GCM加密,商户收到报文后,要解密出明文,APIv3密钥是解密时使用的对称密钥。参考:https://pay.weixin.qq.com/docs/merchant/development/interface-rules/certificate-callback-decryption.html
5)小结
本节调用了小程序支付接口与扫码支付(Native支付接口)。
由于学习的需要本项目使用Native支付接口。
但是要注意:开发小程序一定要对接微信小程序的支付接口,我们使用 的扫码支付是不符合小程序支付的用户需求的,这里仅是用于学习。
你们对接的哪个支付接口?怎么对接的?
提示:首先说明是对接的小程序支付接口,需要对接哪些接口及与第三方支付平台的交互流程。
如何保证一个外部接口的安全性?
对于登录、支付包含敏感信息的接口一定要使用https进行加密传输。
通过签名、验签防止内容篡改,我们对接第三方支付接口都会进行签名验签的过程,使用非对称加密算法 更安全,比如:SHA256 with RSA算法。
通过加密、解密防止内容暴露,通过非对称加密算法 更安全。
HTTPS协议加解密过程?
HTTPS协议结合了对称加密和非对称加密两种技术,以实现高效而安全的数据传输。下面详细解释这两种加密方式在HTTPS中的作用及工作原理:
非对称加密
非对称加密,也称为公钥加密,使用一对密钥:公钥和私钥。公钥可以公开分发,而私钥必须保密。非对称加密的主要优点是可以解决密钥分发的问题,即如何安全地将密钥从一方传递给另一方。然而,它的计算成本相对较高,不适合大量数据的加密。
在HTTPS中的应用
- 密钥交换:在HTTPS握手过程中,客户端使用服务器的公钥(从服务器的数字证书中获取)来加密一个随机生成的预主密钥(Pre-Master Secret)。这个预主密钥随后被发送到服务器。
- 密钥派生:服务器使用自己的私钥解密预主密钥。然后,客户端和服务器分别使用这个预主密钥以及握手过程中交换的随机数来独立地生成会话密钥(Session Key)。
对称加密
对称加密使用同一个密钥进行数据的加密和解密。与非对称加密相比,对称加密的计算效率更高,适合大量数据的加密。
总结
HTTPS协议巧妙地结合了对称加密和非对称加密的优点:
- 非对称加密用于安全地交换会话密钥,解决了密钥分发的问题。
- 对称加密则用于实际的数据传输,确保了高效率和高性能。
通过这种方式,HTTPS不仅能够提供数据的保密性和完整性,还能有效防止中间人攻击,确保通信双方的身份验证。这种方法在现代互联网安全中得到了广泛应用,是保护在线交易、个人隐私和其他敏感信息的重要手段。
试读到此结束,完整实战与源码需开通会员或购买项目,请花两分钟了解下我们
微信扫码添加添加微信:mrt_0607(备注:预见猿份)
与服务人员沟通确认后开通会员或购买项目,即可获取本章完整内容、配套源码与资料。
