微信&支付宝付款实现,包括API接入指引和相关方法实现。


一、微信支付介绍和接入指引


1、微信支付产品介绍


微信支付产品介绍

1.1、付款码支付

用户展示微信钱包内的“付款码”给商家,商家扫描后直接完成支付,适用于线下面对面收银的场景。

1.2、JSAPI支付

线下场所:商户展示一个支付二维码,用户使用微信扫描二维码后,输入需要支付的金额,完成支付。

公众号场景:用户在微信内进入商家公众号,打开某个页面,选择某个产品,完成支付。

PC网站场景:在网站中展示二维码,用户使用微信扫描二维码,输入需要支付的金额,完成支付。

特点:用户在客户端输入支付金额

1.3、小程序支付

在微信小程序平台内实现支付的功能。

1.4、Native支付

Native支付是指商户展示支付二维码,用户再用微信“扫一扫”完成支付的模式。这种方式适用于PC网 站。 特点:商家预先指定支付金额

1.5、APP支付

商户通过在移动端独立的APP应用程序中集成微信支付模块,完成支付。

1.6、刷脸支付

用户在刷脸设备前通过摄像头刷脸、识别身份后进行的一种支付方式。

2、接入指引

2.1、获取商户号

微信商户平台:https://pay.weixin.qq.com/

场景:Native支付

步骤:提交资料 => 签署协议 => 获取商户号

2.2、获取APPID

微信公众平台:https://mp.weixin.qq.com/

步骤:注册服务号 => 服务号认证 => 获取APPID => 绑定商户号

2.3、获取API秘钥

APIv2版本的接口需要此秘钥

步骤:登录商户平台 => 选择 账户中心 => 安全中心 => API安全 => 设置API密钥

2.4、获取APIv3秘钥

APIv3版本的接口需要此秘钥 步骤:登录商户平台 => 选择 账户中心 => 安全中心 => API安全 => 设置APIv3

密钥 随机密码生成工具:https://suijimimashengcheng.bmcx.com/

2.5、申请商户API证书

APIv3版本的所有接口都需要;

APIv2版本的高级接口需要(如:退款、企业红包、企业付款等)

步骤:登录商户平台 => 选择 账户中心 => 安全中心 => API安全 => 申请API证书

2.6、获取微信平台证书

可以预先下载,也可以通过编程的方式获取。后面的课程中,我们会通过编程的方式来获取。

注意:以上所有API秘钥和证书需妥善保管防止泄露

二、支付安全(证书/秘钥/签名)


1、信息安全的基础 - 机密性


  • 明文:加密前的消息叫“明文”(plain text)

  • 密文:加密后的文本叫“密文”(cipher text)

  • 密钥:只有掌握特殊“钥匙”的人,才能对加密的文本进行解密,这里的“钥匙”就叫做“密钥”(key)

    “密钥”就是一个字符串,度量单位是“位”(bit),比如,密钥长度是 128,就是 16 字节的二进制串

  • 加密:实现机密性最常用的手段是“加密”(encrypt)

    按照密钥的使用方式,加密可以分为两大类:对称加密和非对称加密。

  • 解密:使用密钥还原明文的过程叫“解密”(decrypt)

  • 加密算法:加密解密的操作过程就是“加密算法”

    所有的加密算法都是公开的,而算法使用的“密钥”则必须保密

2、对称加密和非对称加密


对称加密

  • 特点:只使用一个密钥,密钥必须保密,常用的有 AES算法
  • 优点:运算速度快
  • 缺点:秘钥需要信息交换的双方共享,一旦被窃取,消息会被破解,无法做到安全的密钥交换

非对称加密

  • 特点:使用两个密钥:公钥和私钥,公钥可以任意分发而私钥保密,常用的有 RSA
  • 优点:黑客获取公钥无法破解密文,解决了密钥交换的问题
  • 缺点:运算速度非常慢,混合加密,实际场景中把对称加密和非对称加密结合起来使用。

3、身份认证


  • 公钥加密,私钥解密的作用是加密信息
  • 私钥加密,公钥解密的作用是身份认证

示例:bob给susan写了一封信,为了加密,bob用它的公钥进行加密,susan拥有bob的私钥,因此可以进行解密。而如果bob用私钥进行加密,bob的其他好友都有公钥,并且能够解密,说明这封信是bob写的,相当于身份认证。

4、摘要算法(Digest Algorithm)

摘要算法就是我们常说的散列函数、哈希函数(Hash Function),它能够把任意长度的数据“压缩”成 固定长度、而且独一无二的“摘要”字符串,就好像是给这段数据生成了一个数字“指纹”。

作用:

  • 保证信息的完整性和唯一性 ,确保信息没有被篡改。

特性:

  • 不可逆:只有算法,没有秘钥,只能加密,不能解密
  • 难题友好性:想要破解,只能暴力枚举
  • 发散性:只要对原文进行一点点改动,摘要就会发生剧烈变化
  • 抗碰撞性:原文不同,计算后的摘要也要不同 常见摘要算法: MD5、SHA1、SHA2(SHA224、SHA256、SHA384)

5、数字签名

数字签名是使用私钥对摘要加密生成签名,需要由公钥将签名解密后进行验证,实现身份认证和不可否认签名和验证签名的流程:

img

https://zhuanlan.zhihu.com/p/403704980

6、数字证书

数字证书解决“公钥的信任”问题,可以防止黑客伪造公钥。 不能直接分发公钥,公钥的分发必须使用数字证书,数字证书由CA颁发 。

https协议中的数字证书:

img

7、微信APIv3证书

商户证书: 商户API证书是指由商户申请的,包含商户的商户号、公司名称、公钥信息的证书。

商户证书在商户后台申请:https://pay.weixin.qq.com/index.php/core/cert/api_cert#/

img

8、API密钥和APIv3密钥

都是对称加密需要使用的加密和解密密钥,一定要保管好,不能泄露。

API密钥对应V2版本的API APIv3密钥对应V3版本的API

三、基础支付API V3

1、引入支付参数

1、定义微信支付相关参数

将资料文件夹中的 wxpay.properties 复制到resources目录中这个文件定义了之前我们准备的微信支付相关的参数,例如商户号、APPID、API秘钥等 。

2、读取支付参数

将资料文件夹中的 config 目录中的 WxPayConfig.java 复制到源码目录中

2、加载商户私钥

1、复制商户私钥

将下载的私钥文件复制到项目根目录下:

2、引入SDK

https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay6_0.shtml

我们可以使用官方提供的 SDK,帮助我们完成开发。实现了请求签名的生成和应答签名的验证。

3、获取商户私钥

https://github.com/wechatpay-apiv3/wechatpay-apache-httpclient (如何加载商户私钥)

3、获取签名验证器和HttpClient

1、证书密钥使用说明

https://pay.weixin.qq.com/wiki/doc/apiv3_partner/wechatpay/wechatpay3_0.shtml

img

2、获取签名验证器

https://github.com/wechatpay-apiv3/wechatpay-apache-httpclient (定时更新平台证书功能)

平台证书:平台证书封装了微信的公钥,商户可以使用平台证书中的公钥进行验签。

签名验证器:帮助我们进行验签工作,我们单独将它定义出来,方便后面的开发。

3、 获取 HttpClient 对象

https://github.com/wechatpay-apiv3/wechatpay-apache-httpclient (定时更新平台证书功能)

HttpClient 对象:是建立远程连接的基础,我们通过SDK创建这个对象。

4、API字典和相关工具

1、API列表

https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_7_3.shtml

我们的项目中要实现以下所有API的功能。

img

2、接口规则

https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay2_0.shtml

微信支付 APIv3 使用 JSON 作为消息体的数据交换格式。

5、Native下单API

5.1、Native支付流程

https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_4.shtml

img

5.2、签名和验签原理

签名生成流程:
https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay4_0.shtml

签名验证流程:
https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay4_1.shtml

6、支付通知API

6.1、内网穿透

ngrok是一款用于实现内网穿透的工具。它可以帮助你将本地部署的服务器暴露给公网,使外部网络可以访问到你的本地服务。

支付通知API:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_5.shtml

流程:

  1. 启用ngrok内网穿透
  2. 设置通知地址
  3. 创建通知接口
  4. 通知验签
  5. 通知数据解密
  6. 处理订单
  7. 处理重复通知,在处理订单时加数据锁。

6.2、商户定时查询本地订单

支付成功后,商户侧查询本地数据库,订单是否支付成功 。

1、后端定义商户查单接口

2、前端定时轮询查单

在二维码展示页面,前端定时轮询查询订单是否已支付,如果支付成功则跳转到订单页面 。

7、用户取消订单API

流程:

  1. 添加取消订单接口
  2. 调用微信支付的关单接口(创建远程请求对象、组装json请求体、完成签名并执行请求)
  3. 处理订单状态

8、微信支付查单API

商户后台未收到异步支付结果通知时,商户应该主动调用《微信支付查单接口》,同步订单状态 。

流程:

  1. 集成Spring Task启动定时任务查找超时未支付的订单
  2. 调用微信查单接口获取订单状态,如已支付,更新订单状态,若未支付,调用关单接口。

9、申请退款API

文档:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_9.shtml

流程:

  1. 创建退款单
  2. 调用退款API
  3. 更新订单、退款单

10、更多

同下单流程,同样有查询退款API、退款结果通知API、申请和下载账单API。



本站总访问量