### 目录
- 1、支付宝沙箱环境测试demo
- 2、支付宝整合到ssm环境
- 3、微信支付整合到ssm环境
### 一、支付宝测试环境代码测试
#### 1.下载电脑网站的官方demo:
下载地址:https://docs.open.alipay.com/270/106291/
![image](http://images2017.cnblogs.com/blog/913181/201711/913181-20171104154517076-1543882391.png)
#### 2.下载解压导入eclipse
![image](http://images2017.cnblogs.com/blog/913181/201711/913181-20171104154518748-1355167243.png)
readme.txt请好好看一下。
只有一个Java配置类,其余都是JSP。
#### 3.配置AlipayConfig
(1).注册蚂蚁金服开发者账号(免费,不像苹果会收取费用)
注册地址:https://open.alipay.com ,用你的支付宝账号扫码登录,完善个人信息,选择服务类型(我选的是自研)。
![image](http://images2017.cnblogs.com/blog/913181/201711/913181-20171104154521091-559671439.png)
(2).设置app_id和gatewayUrl
![image](http://images2017.cnblogs.com/blog/913181/201711/913181-20171104154523420-1165043884.png)
![image](http://images2017.cnblogs.com/blog/913181/201711/913181-20171104154525998-1945276837.png)
其中密钥需要自己生成,appID和支付宝网关是已经给好的,网关有dev字样,表明是用于开发测试。
(3).设置密钥
![image](http://images2017.cnblogs.com/blog/913181/201711/913181-20171104154527795-74942620.png)
点击“生成方法”,打开界面如下:
![image](http://images2017.cnblogs.com/blog/913181/201711/913181-20171104154529482-463775295.png)
下周密钥生成工具,解压打开后,选择2048位生成密钥:
![image](http://images2017.cnblogs.com/blog/913181/201711/913181-20171104155721716-114991997.png)
如果没有设置过,此时显示文本是“设置应用公钥”,我这里是已经设置过得。
![image](http://images2017.cnblogs.com/blog/913181/201711/913181-20171104154532888-1699829873.png)
设置方法,“打开密钥文件路径”:
![image](http://images2017.cnblogs.com/blog/913181/201711/913181-20171104155723091-1059236432.png)
![image](https://images2017.cnblogs.com/blog/913181/201711/913181-20171104154536326-1505768047.png)
复制应用公钥2048.txt中的内容到点击“设置应用公钥”的弹出框中,保存:
![image](http://images2017.cnblogs.com/blog/913181/201711/913181-20171104155724529-560291030.png)
- 商户私钥(merchant_private_key)
复制 应用私钥2048.txt 中的内容到merchant_private_key中。
- 支付宝公钥(alipay_public_key)
![image](http://images2017.cnblogs.com/blog/913181/201711/913181-20171104154537920-690623311.png)
点击如上图链接,复制弹出框里面的内容到alipay_public_key。
如果这个设置不对,结果是:支付成功,但是验签失败。
如果是正式环境,需要上传到对应的应用中:
![image](http://images2017.cnblogs.com/blog/913181/201711/913181-20171104154539248-1117011503.png)
(4).服务器异步通知页面路径(notify_url)
如果没有改名,修改IP和端口号就可以了,我自己的如下:
```
http://localhost:8080/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp
```
(5).页面跳转同步通知页面路径(return_url)
```
http://localhost:8080/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp
```
#### 4.测试运行
![image](https://img-blog.csdn.net/20180620154857896?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpaGFpMTIzNDU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
![image](https://img-blog.csdn.net/20180620154907328?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpaGFpMTIzNDU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
测试用的支付宝买家账户可以在“沙箱账号”这个页面可以找到:
![image](http://images2017.cnblogs.com/blog/913181/201711/913181-20171104154546045-990881709.png)
支付成功后,验签结果:
![image](http://images2017.cnblogs.com/blog/913181/201711/913181-20171104154547279-197713081.png)
#### 问题解决
由于我们使用的是沙箱测试环境,测试环境和正式上线的环境的**网关**是不一样的,如果配置错误,会出现,appid错误的问题。配置如下:
![这里写图片描述](https://img-blog.csdn.net/20180620170947435?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpaGFpMTIzNDU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
### 二、将支付宝支付整合到ssm框架
#### 1、项目架构
![这里写图片描述](https://img-blog.csdn.net/20180620155335825?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpaGFpMTIzNDU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
- 项目架构:spring+springmvc+mybatis
- 数据库:mysql
- 部署环境:tomcat9.0
- 开发环境:jdk9、idea
- 支付:支付宝、微信
整合到ssm一样,我们需要像沙箱测试环境一样,需要修改**支付的配置信息**
![这里写图片描述](https://img-blog.csdn.net/20180620170214281?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpaGFpMTIzNDU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
#### 2、数据库代码
主要包括以下的数据库表:
- user:用户表
- order:支付产生的订单
- flow:流水账
- product:商品表:用于模拟购买商品。
```
drop table if exists user;
/*==============================================================*/
/* Table: user */
/*==============================================================*/
create table user
(
id varchar(20) not null,
username varchar(128),
sex varchar(20),
primary key (id)
);
alter table user comment '用户表';
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='流水表';
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='订单表';
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='产品表 ';
```
#### 3、dao数据接口层
这里就不介绍了,这个只包括简单的curd,可以使用`通用mapper`,或者`逆向工程`就行。
以订单order为例给出:
```
public interface OrdersMapper {
int countByExample(OrdersExample example);
int deleteByExample(OrdersExample example);
int deleteByPrimaryKey(String id);
int insert(Orders record);
int insertSelective(Orders record);
List<Orders> selectByExample(OrdersExample example);
Orders selectByPrimaryKey(String id);
int updateByExampleSelective(@Param("record") Orders record, @Param("example") OrdersExample example);
int updateByExample(@