距离上一篇博客
史上最全最小白最简单最细致的Java接入支付宝支付接口方法 https://blog.csdn.net/weixin_42504145/article/details/85077635
已经过去快三天了,终于在今天将微信整个电脑网页支付整合在SSM框架上.
大家可以在Github https://github.com/nigel-zhou/reimagined-waddle 上面下载我的项目,Eclipse直接导入maven项目即可。
首先,我简单总结一下这几天搞微信支付和支付宝支付接口的体会,通过这几天的动手实操,加强了自己对SSM框架的认识,以及对业务逻辑的思路,明白了许多以前不懂的许多空白。
做支付宝接口的接入完全可以按照支付宝官方所给的Demo和文档,稍加整合即可获得自己想要的代码实现。
做微信支付接口接入,官方文档负责参考所需传递的参数,Demo完全没必要去下(鸡肋),觉得最靠谱的还是在Github找一个有注释的完整Demo自己细细品味,而且微信的沙箱环境想要用的话还要注册一堆东西,真的特别零散。
不废话了。。。。直接放图来看:
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_3(图来自微信支付Native方法文档)
上面微信支付的业务逻辑和上一篇博客所提到的支付宝支付逻辑大同小异,无非不用的是支付宝支付,跳转的是支付宝统一的支付页面,而微信支付发起支付是生成一个二维码传给你的服务器,再由你展示给客户,当客户完成支付时再由微信分别异步通知给服务器和客服。
我们来看一下这个项目的整个目录结构:
1.是Controller层,前端的所有逻辑都要通过该层,
2.是微信支付的整个逻辑,里面有config(参数配置),util(工具类),service和seviceimpl(业务逻辑实现层),entitys(实体类),当发起一个微信支付请求的时候,Controller层的方法直接调用serviceimpl业务实现层的方法生成一个url由前端拼接到二维码上。
3.是一个开源的Sid包,用来生成独一无二的订单号id
4.是springmvc的配置文件
5.是一个前端的管理工具叫做bower,有兴趣的可以自己去百度
6.是前端所有的页面
OK,我们通过一次支付实现来完成整个项目的演示:
在上面的框输入这个地址访问后端Controller的AlipayController的alipy/products方法通过该方法返回一个前端页面products.jsp页面,在该页面显示我们的产品列表,点击购买后跳转到后端Controller的AlipayController的alipay/goConfirm方法,然后通过该方法在返回一个ModelAndView,返回至goConfirm.jsp页面
我们在这里填写想要购买的个数后,点击ajax提交订单还是回跳转到刚才的Controller的alipay/goPay方法里面,再返回至goPay页面:
在这里有两种支付方式我们点击 微信扫码支付,这时前端通过form表单提交订单的相关信息到这个:
在这个Controller层会调用
在这个方法里面会生成向微信支付接口递交的相关信息,生成Xml格式的信息通过下面这个工具类提交到微信支付后台的服务器上,微信也会给我们返回一个Xml格式的数据,里面包括了用户要扫码的Url地址:
然后再由刚才的Controller层将这个Url传给前端:
通过前端JQuery提供的一个二维码的生成方法,来显示它:
最后显示的页面如下:
到此!整个支付接口已经全部开发基本算完毕,再需要的是我们要考虑网络传输的安全性,代码能否经受住实际环境的考验,因为我并没有申请微信商家号,所有这一份功能还需要大家自己完善。
在这里给出sql语句,在自己的Mysql上运行即可:
/*
SQLyog Ultimate v12.5.1 (64 bit)
MySQL - 5.7.22 : Database - alipay
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
/*!40101 SET SQL_MODE=''*/;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`alipay` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
USE `alipay`;
/*Table structure for table `flow` */
DROP TABLE IF EXISTS `flow`;
CREATE TABLE `flow` (
`id` varchar(20) NOT NULL,
`flow_num` varchar(20) DEFAULT NULL COMMENT '流水号',
`order_num` varchar(20) DEFAULT NULL COMMENT '订单号',
`product_id` varchar(20) DEFAULT NULL COMMENT '产品主键ID',
`paid_amount` varchar(11) DEFAULT NULL COMMENT '支付金额',
`paid_method` int(11) DEFAULT NULL COMMENT '支付方式\r\n 1:支付宝\r\n 2:微信',
`buy_counts` int(11) DEFAULT NULL COMMENT '购买个数',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流水表';
/*Data for the table `flow` */
/*Table structure for table `orders` */
DROP TABLE IF EXISTS `orders`;
CREATE TABLE `orders` (
`id` varchar(20) NOT NULL,
`order_num` varchar(20) DEFAULT NULL COMMENT '订单号',
`order_status` varchar(20) DEFAULT NULL COMMENT '订单状态\r\n 10:待付款\r\n 20:已付款',
`order_amount` varchar(11) DEFAULT NULL COMMENT '订单金额',
`paid_amount` varchar(11) DEFAULT NULL COMMENT '实际支付金额',
`product_id` varchar(20) DEFAULT NULL COMMENT '产品表外键ID',
`buy_counts` int(11) DEFAULT NULL COMMENT '产品购买的个数',
`create_time` datetime DEFAULT NULL COMMENT '订单创建时间',
`paid_time` datetime DEFAULT NULL COMMENT '支付时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';
/*Data for the table `orders` */
insert into `orders`(`id`,`order_num`,`order_status`,`order_amount`,`paid_amount`,`product_id`,`buy_counts`,`create_time`,`paid_time`) values
('1812207R22F6DM14','1812207R22F6DM14','10','2.0',NULL,'1',2,'2018-12-20 10:51:46',NULL),
('1812207S7CN814M8','1812207S7CN814M8','10','2.0',NULL,'1',2,'2018-12-20 10:55:21',NULL),
('1812207S87PPY79P','1812207S87PPY79P','10','2.0',NULL,'1',2,'2018-12-20 10:55:26',NULL),
('1812208CY53HRRYW','1812208CY53HRRYW','10','34.0',NULL,'1',34,'2018-12-20 11:51:24',NULL),
('1812208HW44KTDYW','1812208HW44KTDYW','10','34.0',NULL,'1',34,'2018-12-20 12:03:11',NULL),
('1812208KD75YTKGC','1812208KD75YTKGC','10','34.0',NULL,'1',34,'2018-12-20 12:05:01',NULL),
('181220ASYCGYY428','181220ASYCGYY428','10','2.0',NULL,'1',2,'2018-12-20 15:09:35',NULL),
('181220ASZY889K1P','181220ASZY889K1P','10','2.0',NULL,'1',2,'2018-12-20 15:09:45',NULL),
('181220GM4PMR5CDP','181220GM4PMR5CDP','10','20.0',NULL,'1',20,'2018-12-20 21:55:36',NULL),
('1812219SF42HKSY8','1812219SF42HKSY8','10','2.0',NULL,'1',2,'2018-12-21 13:44:12',NULL),
('1812219SFG49P18H','1812219SFG49P18H','10','2.0',NULL,'1',2,'2018-12-21 13:44:15',NULL),
('181221DCZZMB5PZC','181221DCZZMB5PZC','10','2.0',NULL,'1',2,'2018-12-21 18:51:56',NULL),
('181221DGKAR7CD1P','181221DGKAR7CD1P','10','2000.0',NULL,'1',2000,'2018-12-21 18:59:49',NULL),
('181221FGG6X50PH0','181221FGG6X50PH0','10','253.0',NULL,'1',253,'2018-12-21 20:23:39',NULL);
/*Table structure for table `product` */
DROP TABLE IF EXISTS `product`;
CREATE TABLE `product` (
`id` varchar(20) NOT NULL,
`name` varchar(20) DEFAULT NULL COMMENT '产品名称',
`price` varchar(11) DEFAULT NULL COMMENT '价格',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='产品表 ';
/*Data for the table `product` */
insert into `product`(`id`,`name`,`price`) values
('1','辣条','1.0');
/*Table structure for table `user` */
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` varchar(20) NOT NULL,
`username` varchar(128) DEFAULT NULL,
`sex` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
/*Data for the table `user` */
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;