名词解释:
- 商户API证书,是用来证实商户身份的。证书中包含商户号、证书序列号、证书有效期等信息,由证书授权机构(Certificate Authority ,简称CA)签发,以防证书被伪造或篡改。如何获取请见商户API证书。
- 商户API私钥。商户申请商户API证书时,会生成商户私钥,并保存在本地证书文件夹的文件apiclient_key.pem中。注:不要把私钥文件暴露在公共场合,如上传到Github,写在客户端代码等。
- 微信支付平台证书。平台证书是指由微信支付负责申请的,包含微信支付平台标识、公钥信息的证书。商户可以使用平台证书中的公钥进行应答签名的验证。获取平台证书需通过获取平台证书列表接口下载。
- 证书序列号。每个证书都有一个由CA颁发的唯一编号,即证书序列号。如何查看证书序列号请看这里。
- API v3密钥。为了保证安全性,微信支付在回调通知和平台证书下载接口中,对关键信息进行了AES-256-GCM加密。API v3密钥是加密时使用的对称密钥。商户可以在【商户平台】->【API安全】的页面设置该密钥。
微信支付一般需要四个基本配置信息 :1.商户号 2.APPId 3.AppSecret 4.密钥key (通过商户证书获取) 5. 微信平台证书 (含有微信公钥) 6.证书序列号. 7.
商户号MCH_ID_USER 的获取
先在商户平台 微信支付 - 中国领先的第三方支付平台 | 微信支付提供安全快捷的支付方式(就相当于你的商户账户的管理平台)中注册认证你的微信
登录后的样子是这样的。 然后点击账户中心
可以看到登录账号 。 他就是你的商户号
AppId和AppSecret 的获取
里面会告诉你到相应的平台去申请。比如公众号(服务号和订阅号)、小程序, 就在
微信公众平台【mp.weixin.qq.com】
注册登录(如果是第一次,就需要进行认证信息什么的)。然后点开 设置与开发->开发->基本配置->就可以获取基本信息了。如下图:
我们就可以看到AppID了
微信开放平台 微信开放平台
移动应用(app)等在这申请。同样是先注册,然后登录。
然后点开管理中心,点开创建应用,就可以为你的app进行申请,成功后就有对应appid了 。
到此,我们就可以获取APPID和APPSecret了。
将申请获得的appid进行关联
点击关联APPID,把微信开放平台获取的appid填入,然后确认,进行关联。
然后登录微信开放平台,在消息中心中同意关联即可。
目录
微信支付一般需要四个基本配置信息 :1.商户号 2.APPId 3.AppSecret 4.密钥key (通过商户证书获取) 5. 微信平台证书 (含有微信公钥) 6.证书序列号. 7.
有两种证书,一个是我们上面申请到的我们自己的证书,里面包含有我们商户的私钥等信息。 一般都是通过以下方式来获取。
还有一种是微信平台的证书,里面含有微信平台的公钥等信息,我们直接通过以下方法配置进行了,其实就是把那个微信提供的地址写上去就好了。
API证书管理(商户证书)
申请API证书
点开申请新证书,然后下载证书工具,填入商户号和商户名称,然后根据步骤,获取证书解压到文件夹中。
有两种证书,一个是我们上面申请到的我们自己的证书,里面包含有我们商户的私钥等信息。 一般都是通过以下方式来获取。
商户申请商户API证书时,会生成商户私钥,并保存在本地证书文件夹的文件apiclient_key.pem中。商户开发者可以使用方法PemUtil.loadPrivateKey()加载证书。
# 示例:私钥存储在文件
PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(
new FileInputStream("存放路径"));
还有一种是微信平台的证书,里面含有微信平台的公钥等信息
https://api.mch.weixin.qq.com/v3/certificates
获取平台证书
你可以使用WechatPayHttpClientBuilder
构造的HttpClient
发送请求和应答了。
URIBuilder uriBuilder = new URIBuilder("https://api.mch.weixin.qq.com/v3/certificates"); HttpGet httpGet = new HttpGet(uriBuilder.build()); httpGet.addHeader("Accept", "application/json"); CloseableHttpResponse response = httpClient.execute(httpGet); String bodyAsString = EntityUtils.toString(response.getEntity()); System.out.println(bodyAsString);
那么我们拿到商户私钥公钥和 微信平台的公钥,有什么用呢? 可以用于请求和发送的加密和解密。如下图。 至于下图具体的代码实现及作用,我在第二篇文章有详细的介绍微信支付V3——2。请看完这一篇在去看下一篇比较好。
设置API,APIV3密钥 (都是对称加密)
APIV3的作用:就像上面的图片第3步和第5步一样,对于比较重要的东西,我们可以用私钥来加密,公钥来解密。但是对于大量信息的传输,如果我们还用非对称加密的方式,就会大大的降低传输速率。所以对于大量信息的传输,我们使用对称加密的方法,也就是加密和解密都用一样的公钥。 微信回调中 “回调报文解密“” 会用到这个APIV3密钥。后面会讲。
商户API证书序列号,申请证书后就有对应的。
作用:微信会根据序列号找到我们对应的证书,从证书中解密出我们的公钥,对我们的请求进行验签。
对称加密 (常用AES算法)
只使用一个密钥,密钥必须保密,去加密解密。
优点:速度快。 缺点:容易被破解
非对称加密(常用RSA算法)
就是有公钥加密,私钥解密。或者私钥解密,公钥解密。
优点:安全性高 。缺点:速度慢
一般把他们混合使用。
身份认证
公钥加密,私钥解密
A把自己的公钥给B、C、D等等 ,这样B、C、D就可以各自写内容给A,然后用A给的公钥进行加密再发送给A。 然后只有A自己的私钥才能够解密获取其中的内容。 反之 ,B、C、D等等也可以这样干。
私钥加密,公钥解密
A用自己的私钥把内容进行加密。 那样B、C、D 用A的公钥进行解密,如果能成功,说明内容来自A。 这样也可以证明这内容来自A了。
数字签名
检测数据有没有被篡改,需要进行 摘要运算+私钥 =数字签名
加签
A 的"内容" 通过" 摘要算法" 获得 “ 摘要 ” 。然后 A再用 "私钥" 将这个 “摘要” 进行加密 ,得到一个数字签名后的内容,给B。
验签
B拿到那个加密后的内容(原文内容和加密后的摘要)后,先用A的"公钥" 把 加密后的摘要给解密 ,获得(摘要1)。 然后B在用与A相同的摘要算法,对原文内容进行摘要运算,得到(摘要2)。 对比摘要1和摘要2 ,如果一样,就说明内容没有被篡改.
摘要算法主要有: MD5, SHA1,SHA2等。
数字证书
理由:因为公钥可能会被黑客伪造。不能直接分发公钥,公钥的分发必须使用数字证书,数字证书由CA颁发 。
说明:所谓数字证书也就是把我们的公钥交给第三方信得过的机构CA,然后CA来验证分发。
http+数字证书 =https
微信平台证书
GET 获取平台证书列表
https://api.mch.weixin.qq.com/v3/certificates
作用:微信平台证书中含有微信平台的公钥等信息,用于加密解密等