後端---史上最全最小白最簡單最細緻的Java接入微信支付介面(Native接入)
距離上一篇部落格
史上最全最小白最簡單最細緻的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 @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @[email protected]@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @[email protected]@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 [email protected]_SQL_MODE */;
/*!40014 SET [email protected]_FOREIGN_KEY_CHECKS */;
/*!40014 SET [email protected]_UNIQUE_CHECKS */;
/*!40111 SET [email protected]_SQL_NOTES */;