SpringBoot:实现PC端微信扫码支付-超详细实战!

开篇前絮叨两句,也算是我个人的一个记录吧,整体实现了微信扫码支付,但还有很多细节和提升的点,为了简介明了,只将整体过程给大家串一下,如果有大佬看到也要多多指点,不懂的也可以私信我。如果想了解微信登陆的,在分栏微信相关也有文章,大家可以看一下

实现应用微信支付,你需要有微信商户平台:https://pay.weixin.qq.com。申请公众号(服务号)认证费300,才能开通微信支付。在微信支付中需要有公众号id和密钥还有商户id和密钥,如果你没有上线应用把整体流程明白就可以,当然,朋友公司之类有的话更好。

先将一些用到的链接地址放在这里,方便大家查看

微信支付申请流程:https://pay.weixin.qq.com/guide/qrcode_payment.shtml

常用支付方式文档:https://pay.weixin.qq.com/wiki/doc/api/index.html

案例演示:https://pay.weixin.qq.com/guide/webbased_payment.shtml

扫码支付文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=2_2

微信支付时序图:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5

统一下单文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1

签名算法规范:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=4_3

签名校验工具:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=20_1

NatAPP内网穿透:https://natapp.cn/

上代码之前需要给大家讲解一些必要知识,不然直接来代码你还是一头雾水,完成了功能但不明白这个过程也是白费

Step1:微信网站扫码支付介绍

Stpe1.1:名词理解

appid:公众号唯一表示

appsecret:公众号密钥

mch_id:商户号,申请微信支付的时候分配的

key:支付交易过程中生成签名的密钥, 设置路径: 微信商户平台(pay.wexin.qq.com)–>账户中心–>账户设置–>API安全–>密钥设置

Step1.2:微信支付交互方式
  • POST方式提交

  • XML格式的协议

  • 签名算法MD5

  • 交互业务规则 先判断协议字段返回,再判断业务返回,最后判断交易状态
    ​ 接口交易单位 分
    ​ 交易类型:JSAPI-- 公众号支付、NATIVE–原生扫码支付、APP-app支付

  • 商户订单号规则:商户支付的订单号由商户自定义生成,仅支持使用字母、数字、中划线-、下划线_、竖线|、星号*这些英文半角字符的组合,请勿使用汉字或全角等特殊字符,微信支付要求商户订单号保持唯一性

Step1.3:时序图讲解(重点!)

顶部有微信官方的时序图链接。这个图一定要明白,因为下面我上代码会告诉这是时序中的第几步,看的图就容易明白代码了

时序图说白了就是你一个操作的流程,这个过程中会经过哪个对象的方法,返回什么操作等的过程

顺序的时序图:就是交互流程图(把大象装进冰箱分几步)

对象(Object)、生命线(Lifeline)、激活(Activation)、消息(Message)

对象:时序图中的对象在交互中扮演的角色就是对象,使用矩形将对象名称包含起来, 名称下有下划线

生命线:生命线是一条垂直的虚线, 这条虚线表示对象的存在, 在时序图中, 每个对象都有生命线

激活:代表时序图中对象执行一项操作的时期, 表示该对象被占用以完成某个任务,当对象处于激活时期, 生命线可以拓宽为矩形

消息:对象之间的交互是通过相互发消息来实现的,箭头上面标出消息名,一个对象可以请求(要求)另一个对象做某件事件。消息从源对象指向目标对象,消息一旦发送便将控制从源对象转移到目标对象,息的阅读顺序是严格自上而下的

消息交互中的实线:请求消息

消息交互中的虚线:响应返回消息

自己调用自己的方法:反身消息

用我的白话给大家讲一下:

1.用户下单,进入购买页面,点击购买进入后台

2.后台收到请求,生成订单。大家肯定都用淘宝买过东西对吧,你购买东西但发现钱不够,这个订单在一段时间内都存在等待你支付,但这个订单在数据库中已经申城了,之后你支付后订单才会修改状态

3.后台调微信统一下单,不光你后台生成订单,微信也生成预订单号

4.微信返回code_url支付交易链接,通过这个值生成二维码图片

5.将这个二维码返回给前台用户,用户进行扫一扫支付。这里是直接和微信交互的

6.微信支付系统验证有效性,验证后返回用户是否确认支付

7.用户确认,输密码。返回给微信支付系统授权

8.验证授权,完成支付交易

9.返回支付结果,发送短信和微信消息提示。这里是并行处理,一个通知用户,一个通知后台

10.异步通知后台支付结果,会携带一些参数,订单号等。收到结果后告知接收情况

11.如果后台宕机,微信会定时发送通知,后台可以做定时任务,用户支付了但订单状态未修改,定时调微信的接口,调API有没有成功做操作

下面的一些流程都是看业务情况
在这里插入图片描述

Step2:统一下单

商户系统先调用该接口在微信支付服务后台生成预支付交易订单,返回正确的预支付交易会标识后再按扫码、JSAPI、APP等不同场景生成交易串调起支付。这里是时序图第二步

顶部链接文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1

这里上个统一下单的流程图

1.告诉微信支付你要下单

2.微信支付系统数据库生成一条订单,但未支付。你的后台也是生成一条未支付订单

3.用户支付后微信支付将订单更新为已支付

4.微信调后台告诉我们已经支付了

5.后台再返回确认信息等

时序图和统一下单的流程基本都在这了,一定要明白,一定要清楚!
在这里插入图片描述

Step2.1:统一下单请求

向微信支付系统发送http请求,我们需要组成一个xml格式的数据消息,里面包括一些必须的参数
在这里插入图片描述

官方例子
在这里插入图片描述

大部分人在做微信支付都是错在这里,签名方式不对,或者传输的一些信息不符合规范等,这里只是先给大家讲解一下,下面实战都会说清楚的。

Stpe2.2:统一下单返回消息

返回一些我们需要的参数,也就是code_url,如果你发送的xml不正确会返回错误提示
在这里插入图片描述

在这里插入图片描述

Step3:战前准备

Step3.1:数据库设计
视频表 也可以认为是商品表 里面的一些字段是按照我项目需求来的,有一些你感觉用不到的可以不加,如果你有自己的数据库设计更好
CREATE TABLE `video` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `title` varchar(255) DEFAULT NULL COMMENT '视频标题',
  `summary` varchar(255) DEFAULT NULL COMMENT '详情',
  `cover_img` varchar(255) DEFAULT NULL COMMENT '封面图',
  `price` int(11) DEFAULT NULL COMMENT '价格-最小单位分',
  `c_id` int(10) DEFAULT NULL COMMENT '分类id',
  `point` double(11,2) DEFAULT NULL COMMENT '评分-最长11保留两位小数',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `view_num` int(10) DEFAULT NULL COMMENT '观看数',
  `online` int(11) DEFAULT '1' COMMENT '0表示未上线,1表示上线',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=utf8;

订单表	用户表就不给大家上了 无非就是跟了个用户主键 自己创一个就可以了
del字段采用逻辑删除 避免订单出现问题 不删除信息
CREATE TABLE `video_order` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `out_trade_no` varchar(64) DEFAULT NULL COMMENT '订单流水号唯一标识',
  `state` int(11) DEFAULT NULL COMMENT '订单状态(1支付-0未支付)',
  `create_time` datetime DEFAULT NULL COMMENT '订单创建时间',
  `total_fee` int(11) DEFAULT NULL COMMENT '订单金额',
  `video_id` int(11) DEFAULT NULL COMMENT '视频主键id',
  `video_title` varchar(128) DEFAULT NULL COMMENT '标题字段冗余',
  `video_img` varchar(255) DEFAULT NULL COMMENT '图片字段冗余',
  `user_id` int(11) DEFAULT NULL COMMENT '用户主键id',
  `ip` varchar(64) DEFAULT NULL COMMENT '用户ip地址',
  `openid` varchar(64) DEFAULT NULL COMMENT '用户标示',
  `notify_time` datetime DEFAULT NULL COMMENT '支付回调时间',
  `nickname` varchar(32) DEFAULT NULL COMMENT '微信昵称',
  `head_img` varchar(128) DEFAULT NULL COMMENT '微信头像',
  `del` int(11) DEFAULT '0' COMMENT '0表示未删除,1表示已经删除',
  PRIMARY KEY (`id`),
  UNIQUE KEY `out_trade_no` (`out_trade_no`)
) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8;
Step3.2:实体类

自行加上get set方法

/**
 * 视频实体
 */
public class Video implements Serializable {

   
  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值