微信支付接入指引与支付安全
文章目录
- 微信支付接入指引与支付安全
- 一、微信产品介绍
- 1.1 付款码支付
- 1.2 JSAPI支付
- 1.3 小程序支付
- 1.4 Native支付
- 1.5 APP支付
- 1.6 刷脸支付
- 二、接入指引
- 2.1 获取商户号
- 2.2 获取AppID
- 2.3 绑定商户号与AppId
- 2.4 获取秘钥和证书
- 2.4.1 申请API秘钥
- 2.4.2 申请API证书
- 三、支付安全
- 3.1 对称加密与非对称加密
- 3.1.1 优缺点
- 3.2 身份认证
- 3.3 数字签名
- 3.3.1 摘要算法介绍
- 3.4 数字证书
- 3.4.1 Https中的数字证书
一、微信产品介绍
官方网站:微信支付 - 中国领先的第三方支付平台 | 微信支付提供安全快捷的支付方式 (qq.com)
我们可以看一下“产品中心”中的”支付产品“
1.1 付款码支付
产品中心 - 微信支付商户平台 (qq.com)
1.2 JSAPI支付
产品中心 - 微信支付商户平台 (qq.com)
”线下场所“是商户展示自己的商户二维码,用户进行扫描并输入金额
“公众号场景”是指用户在微信内进入商家的公众号内进行支付
“PC网站场景”是用户在网站中展示一个二维码,用户进行扫描
1.3 小程序支付
产品中心 - 微信支付商户平台 (qq.com)
在小程序中下单并且进行支付
1.4 Native支付
商户展示支付二维码,用户扫一扫完成支付的模式,这种方式适用于pc网站
之前提到的JSAPI支付也适用于pc网站的情景
Native支付是用户扫描二维码后直接展示由商家指定的的支付金额
JSAPI支付是用户扫描二维码后需要由用户自己去输入一个支付金额
1.5 APP支付
是指商户通过在移动端独立的APP应用程序中集成微信支付模块从而完成支付流程的一种方式。
这种支付方式我们需要有一个APP,例如向美团
1.6 刷脸支付
用户在刷脸设备前通过摄像头刷脸,然后识别身份后进行的一种支付方式,适用于线下实体场所的一个收银场景
二、接入指引
2.1 获取商户号
我们接下来都用PC端进行练习
下面是接入流程,在上面的页面往下翻
之后根据步骤填写信息即可
完成后进行登录,就可以看到后台页面了
后台中会有一个登录账号,这个账号就是我们的商户id
2.2 获取AppID
我们下面进行第三步“绑定场景”,在这个步骤中我们需要一个AppId
将AppId和刚刚申请到的商户号进行关联
怎么申请AppID?我们需要申请一个微信公众号
地址:微信公众平台 (qq.com)
在此处进行注册
账号的类型选择服务号
按照下面的步骤进行填写
等待一到两个工作日后,我们就可以将此步骤获取到AppId与上一个步骤获取到的商户号进行绑定
在页面的首页,找到菜单栏当中的设置与开发
2.3 绑定商户号与AppId
进入到网址:https://pay.weixin.qq.com/
下面的截图是视频中的截图
此步骤完成后,在公众号这边会收到一个申请绑定的消息,点击同意即可
2.4 获取秘钥和证书
重新回到商户平台微信支付 - 中国领先的第三方支付平台 | 微信支付提供安全快捷的支付方式 (qq.com)
选择“账户中心”
之后选择左侧菜单栏中“安全中心”下的“API安全”
之后我们会看到三个参数
API秘钥对应V2版本的API
API v3秘钥对应V3版本的API
2.4.1 申请API秘钥
API秘钥对应V2版本的API
API v3秘钥对应V3版本的API
API秘钥:专门针对V2版本的API设置的秘钥。
如果是第一次设置,后面就是一个设置按钮,如果不是第一次,后面就是一个修改按钮
APIV3秘钥:如果我们想接入的版本是APIv3版本,就需要设置APIv3秘钥(与设置API秘钥一个样)
如果是一次的话,后面的按钮时设置,不是第一次的话,后面的按钮是修改
我们可以借助一个随机密码生成器生成随机密码 - 密码生成器 - 密码批量生成器 (bmcx.com)
2.4.2 申请API证书
如果我们接入的是APIv3这个版本,在所有的API接口当中,我们都需要去使用这个API证书
如果我们接入的是APIv2版本的话,只需要在一些高级接口,比如说退款、企业红包、企业退款等等接口当中使用我们的API证书,在基本的支付流程中是不需要使用API证书的
如何申请证书?
之后按照要求填写即可
下载一个证书工具,下载完后进行解压,安装
填写信息的时候注意,商户名称要和营业执照的名称保持一致
将下面的请求串复制到我们的商户平台中
也就是粘贴到下面的框框中
之后会生成一个证书串,进行复制
然后再打开证书工具,粘贴找下面的位置,点击下一步
现在我们就可以查看证书文件
也就是下面的这种压缩包,一定要妥善的保管起来
三、支付安全
3.1 对称加密与非对称加密
实现机密性最常用的手段就是加密,只有有特殊钥匙(密钥)的人才能对加密的文本进行解密
明文:加密前的消息
密文:加密后的文本
解密:使用密钥还原明文的过程
加密算法是公开的,但是密钥是保密的
密钥:一个字符串,度量单位是bit,如密钥长度128个bit位,就是16字节的二进制串
按照密钥的使用方式,加密可以分为两大类:对称加密和非对称加密
对称加密:加密和解密的时候使用的密钥是同一个,是对称的,只要保证了对称的安全性,那通信过程就可以说具有了机密性
AES加密算法:密钥长度128、192或256,安全强度很高,性能很好,应用最为广泛的加密算法
加密分组模式:将明文分组加密,微信支付中使用AEAD_AES_256_GCM
非对称加密:有两个密钥,一个公钥publicKey,一个私钥privateKey。公钥可以公开给任何人使用,而私钥必须是严格保密的
使用公钥加密后只能使用私钥解密,反过来,私钥解密后也只能公钥解密
RSA加密算法:最著名的非对称加密算法
3.1.1 优缺点
对称加密
- 优点:运算速度快
- 缺点:秘钥需要信息交换的双方共享,一旦被窃取,消息会被破解
非对称加密
- 优点:私钥严格保密,公钥任意分发,黑客获取公钥无法破解密文
- 缺点:运算速度非常慢
3.2 身份认证
有了对称加密与非对称加密后,离安全性还差的挺远
Pat、Doug、Susan三个人有Bob的私钥
Susan发信与Bob收信的时候
如果Bob也想给Susan写信,这个时候Susan也要有自己的公钥和私钥,然后将公钥分给他的朋友们
假如我们使用私钥加密,公钥解密会出现什么效果呢?
Bob用自己的私钥对信进行了加密,那Susan、Doug、Pat三个人都可以对Bob的信进行解密
私钥加密,公钥解密并不是为了实现加密
Bob用私钥加密的信Susan用公钥解开,这表明Susan能够确认这封信确实是Bob发出的,而不是别人
私钥加密,公钥解密的作用其实就是为了身份验证
3.3 数字签名
Bob决定给Pat写一封不加密的信件,但是要保证Pat收到的信没有被篡改过,也就是说要保证信息的完整性
实现完整性的手段主要是摘要算法,也就是常说的散列函数、哈希函数
-
Bob写完信之后先用摘要算法生成信件原文的摘要MessageDigest
-
Bob将摘要附在信件原文的下面,一起发送给pat
-
Pat收到信之后也是两个步骤,Pat使用和Bob一样的摘要算法,加密信件的原文,得到信件的摘要
-
Pat将加密后的摘要和Bob在原文中附加的摘要做一个对比,如果一致说明信件是没有被篡改过的
但是有一个漏洞,如果信件被黑客截获,并且黑客直接修改了原文,然后生成新的摘要,附加在原文的下面,伪装成原信件和原摘要
此时Pat是判断不出来的
因此摘要算法不具有机密性
如何真正保证数据无法被篡改?
一定要加入秘钥,确保信息的机密性
具体的流程如下
-
Bob写完信后先用摘要算法生成信件的摘要
-
Bob使用自己的私钥将将摘要加密,加密后的结果称之为数字签名
-
Bob将数字签名附在信的原文下面,一起发给Pat
-
Pat收信后,取下数字签名,用Bob的公钥解密得到信件的摘要
-
Pat使用和Bob一样的摘要算法加密信件原文,得到信件的摘要
-
Pat根据原文生成的摘要与Bob传输过来的摘要进行比对,如果一致就说明是Bob发的,并且是没有经过篡改的
1,2,3过程叫做签名流程
4,5,6过程叫做验签,验证签名
黑客无法获取Bob的私钥,我们也是能够保证信息的机密性
微信中签名与验签就是这个原理
3.3.1 摘要算法介绍
一个任意长度的字符串Z数据经过哈希运算之后会得到固定长度的字符串数据H,那我们就说H就是自己的哈希结果,又称作数据指纹或摘要
MD5就是一个非常典型的摘要算法
摘要算法特点
1.不可逆:只有算法,没有秘钥,只能加密,不能解密
AES算法属于对称加密的一种,需要一个秘钥去加密和解密
RSA算法是非对称加密的典型算法,需要公钥和私钥
对称加密和非对称加密,解密的时候都是需要钥匙的,但是摘要算法是没有密钥的,也是不能解密的
2.难题友好性:想要破解,只能暴力枚举
3.发散性:只要对原文进行一点点改动,摘要就会发生剧烈变化(雪崩效应)
4.抗碰撞性:原文不同,计算后的摘要也要不同
可能会有两份不同的原文对应同一份摘要
常见摘要算法:MD5、SHA1、SHA2 (SHA224、SHA256、SHA384)
MD5、SHA1不具有强的抗碰撞性
目前用的比较多的就是SHA2 ,实际上是系列算法的统称
3.4 数字证书
Doug想要欺骗Pat,将自己的PublicKey给了Pat,他和Pat说这是Bob的公钥,但实际是Doug的公钥
因此Doug就可以冒充Bob,Doug可以用自己的私钥做成一个数字签名,然后给Pat,Pat用假的Bob公钥进行验签,也是可以成功的,此时Pat误以为是和Bob通信,但是其实是Doug
这种场景就是你误以为和微信服务器进行通信,其实是和黑客进行通信
此时就会有一个公钥的信任问题:黑客可以伪造公钥,怎么判断公钥是真实的?
答案:数字证书
- 公钥: Bob的公钥
为了方式Bob的公钥被伪造,公钥不会采用直接发布的形式,他会被放在数字证书中
- 所有者: Bob
证书的申请者
- 颁发者: CA(Certificate Authority,证书认证机构
- 有效期:证书的使用期限
- 签名哈希算法:指定摘要算法,用来计算证书的摘要
- 指纹:证书的摘要,保证证书的完整性(指纹也叫摘要)
- 签名算法:用于生成签名,确保证书是由CA签发
- 序列号:证书的唯一标识
接下来看一下CA为Bob颁发数字证书的流程
- CA用证书信息中指定的Hash算法,根据证书信息计算整个信息的摘要,也就是指纹
- CA根据证书中的签名算法用自己CA的私钥进行加密生成证书的签名
- 把签名和证书的基本信息一起发布,Bob就得到了一个数字证书
Bob拿到数字证书给Pat发送邮件的时候,只要在签名的同时再附上数字证书就可以了
Pat收到信后首先把数字证书取出,对数字证书中的证书签名进行验证
对数字证书中的证书签名进行验证:
Pat用证书中指定的Hash算法根据证书信息计算整个证书的摘要,并且使用CA的公钥从数字证书的公钥解析出数字的摘要
将两个摘要进行比对,如果一致则说明验签通过,Pat就可以从数字证书中取出Bob的公钥
之后Pat要对信件的签名进行验证
需要先用Hash算法计算信件的摘要
之后从数字证书中解析出来的Bob公钥对信件的签名进行解密,得到信件的摘要
必须两个摘要是否相等,如果一致则验签通过
通过后Pat就可以放心的读取信件的内容了
3.4.1 Https中的数字证书
应用数字证书的具体场景:https协议。此协议主要用于网页加密
首先有一个网站要使用https协议,首先网站需要向CA申请数字证书,CA会用自己的私钥对数字证书的基本信息进行加密、签名
数字证书的基本信息当中是存有网站公钥的,有了数字证书和一些必要的条件后,网站就可以以https协议的形式发布在互联网上了
如果有一个客户端浏览器向这个网站发出一个加密的请求,那网站对网页进行加密后,会连同它的数字证书一起发给这个客户端的浏览器。客户端的浏览器接收到服务器发送过来的数字证书之后,会使用CA的公钥(证书认证机构的公钥)去解密这个数字证书,并对数字证书进行验签
默认情况下我们的操作系统当中都会有权威的CA证书列表,CA证书列表里面就会存有CA公钥
与此同时客户端也会判断当前访问的网址和数字证书信息中证书持有者是不是一致的,如果不一致说明这个网站是伪装的
数字证书过期、数字证书被吊销或者是办法数字证书的CA机构不正规。这时我们的浏览器都会发出一些网站不安全的警告信息
如果数字证书是可靠的,客户端就可以顺利从证书中获取网站的公钥。