开源项目链接
Kitty 开源权限管理系统
项目地址:
演示地址:
用户名:admin 密码:admin
注册沙箱账号
到蚂蚁金服注册开发者账号,注册地址:用你的 支付宝 账号扫码登录,完善个人信息,选择服务类型。
根据情况选择接入方式,我们这里选择自研开发者,如果已经注册过的省略。
选择 开发者中心 --> 研发服务 --> 沙箱,进入沙箱管理界面。
进入沙箱,第一次需要填写信息,记下appId,公钥设置处需要把下面步骤生成的公钥设置到这里。
生成公私秘钥
登录官方地址: 进入秘钥生成页面。
打开下载的工具,运行程序,选择 JAVA 2048 方式,点击生成秘钥。
把此处生成的公钥复制设置到沙箱环境,就是上面的设置公钥配置,然后把公私秘钥保存起来,以备后用。
创建项目
登录 输入项目信息,生成 Spring Boot 项目并下载到本地。
使用开发工具导入项目,我们这里使用的是 Eclipse ,导入和清理后项目结构如下图。
添加依赖
添加项目依赖,主要是引入 alipay-sdk-java,提供支付宝支付支持。
pom.xml
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.1.1.RELEASE
com.louis
epay-service
0.0.1-SNAPSHOT
jar
epay-service
Demo project for Spring Boot
1.8
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
com.alipay.sdk
alipay-sdk-java
3.1.0
com.alibaba
fastjson
1.2.48
org.springframework.boot
spring-boot-maven-plugin
配置文件
在 resources 目录下添加一个 alipay.properties 文件,用于写入支付宝配置信息。
alipay.properties
# 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
appId: 2016092300579321
# 商户私钥,您的PKCS8格式RSA2私钥
# 支付宝公钥,查看地址: 对应APPID下的支付宝公钥。
# 服务器异步通知页面路径需格式的完整路径,不能加?id=123这类自定义参数
notifyUrl: 外网ip:端口/error.html
# 页面跳转同步通知页面路径 需格式的完整路径,不能加?id=123这类自定义参数
returnUrl: 外网ip:端口/sccess.html
# 签名方式
signType: RSA2
# 字符编码格式
charset: utf-8
# 支付宝网关
gatewayUrl:
# 支付宝网关
logPath: "C:\"
增加一个 PropertiesListener 监听器用//代码效果参考:http://www.zidongmutanji.com/bxxx/576684.html
于在应用启动时加载配置文件属性。PropertiesListener.java
package com.louis.epay.config;
import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
import com.louis.epay.alipay.AlipayProperties;
/
配置文件监听器,用来加载自定义配置文件
@author Louis
@date Dec 12, 2018
/
@Component
public class PropertiesListener implements ApplicationListener {
@Override
public void onApplicationEvent(ApplicationStartedEvent event) {
AlipayProperties.loadProperties();
}
}
上面的监听器加载属性,是通过具体的属性加载器加载的,比如支付宝支付属性加载类如下。
AlipayProperties.java
package com.louis.epay.alipay;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import org.springframework.beans.factory.config.PropertiesFactoryBean;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import //代码效果参考:http://www.zidongmutanji.com/bxxx/562104.html
org.springframework.stereotype.Component;/
应用启动加载文件
@author Louis
@date Dec 12, 2018
/
@Component
public class AlipayProperties {
public static final String APP_ID = "appId";
public static final String PRIVARY_KEY = "privateKey";
public static final String PUBLIC_KEY = "publicKey";
public static final String NOTIFY_URL = "notifyUrl";
public static final String RETURN_URL = "returnUrl";
public static final String SIGN_TYPE = "signType";
public static final String CHARSET = "charset";
public static final String GATEWAY_URL = "gatewayUrl";
public static final String LOG_PATH = "logPath";
/
保存加载配置参数
/
private static Map propertiesMap = new HashMap();
/
加载属性
/
public static void loadProperties() {
// 获得PathMatchingResourcePatternResolver对象
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
try {
// 加载resource文件(也可以加载resources)
Resource resources = resolver.getResource("classpath:alipay.properties");
PropertiesFactoryBean config = new PropertiesFactoryBean();
config.setLocation(resources);
config.afterPropertiesSet();
Properties prop = config.getObject();
// 循环遍历所有得键值对并且存入集合
for (String key : prop.stringPropertyNames()) {
propertiesMap.put(key, (String) prop.get(key));
}
} catch (Exception e) {
new Exception("配置文件加载失败");
}
}
/
获取配置参数值
@param key
@return
/
public static String getKey(String key) {
return propertiesMap.get(key);
}
public static String getAppId() {
return propertiesMap.get(APP_ID);
}
public static String getPrivateKey() {
return propertiesMap.get(PRIVARY_KEY);
}
public static String getPublicKey() {
return propertiesMap.get(PUBLIC_KEY);
}
public static String getNotifyUrl() {
return propertiesMap.get(NOTIFY_URL);
}
public static String getReturnUrl() {
return propertiesMap.get(RETURN_URL);
}
public static String getSignType() {
return propertiesMap.get(SIGN_TYPE);
}
public static String getCharset() {
return propertiesMap.get(CHARSET);
}
public static String getGatewayUrl() {
return propertiesMap.get(GATEWAY_URL);
}
public static String getLogPath() {
return propertiesMap.get(LOG_PATH);
}
}
支付宝支付接口封装
Alipay 是对支付宝支付功能的封装,它接收一个 AlipayBean 为参数,最终通过调用 AlipayClient 的 pageExecute 方法返回支付页面。
Alipay.java
package com.louis.epay.alipay;
import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSON;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
/
支付宝支付接口
@author Louis
@date Dec 12, 2018
/
@Component
public class Alipay {
/
支付接口
@param alipayBean
@return
@throws AlipayApiException
*/
public String pay(AlipayBean alipayBean) throws AlipayApiException {
// 1、获得初始化的AlipayClient
String serverUrl = AlipayProperties.getGatewayUrl();
String appId = AlipayProperties.getAppId();
String privateKey = AlipayProperties.getPrivateKey();
String format = "json";
String charset = AlipayProperties.getCharset();
String alipayPublicKey = AlipayProperties.getPublicKey();
String signType = AlipayProperties.getSignType();
String returnUrl = AlipayProperties.getReturnUrl();
String notifyUrl = AlipayProperties.getNotifyUrl();
AlipayClient alipayClient = new DefaultAlipayClient(serverUrl, appId, privateKey, format, charset, alipayPublicKey, signType);
// 2、设置请求参数
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
// 页面跳转同步通知页面路径
alipayRequest.setReturnUrl(returnUrl);
// 服务器异步通知页面路径
alipayRequest.setNotifyUrl(notifyUrl);
// 封装参数
alipayRequest.setBizContent(JSON.toJSONString(alipayBean));
// 3、请求支付宝进行付款,并获取支付结果
String result = alipayClient.pageExecute(alipayRequest).getBody();
// 返回付款信息
return result;
}
}
接口调用参数封装对象如下。
AlipayBean.java
package com.louis.epay.alipay;
/
支付实体对象
根据支付宝接口协议,其中的属性名,必须使用下划线,不能修改
@author Louis
@date Dec 12, 2018
/
public class AlipayBean {
/**
商户订单号,必填
/
private String out_trade_no;
/
订单名称,必填
/
private String subject;
/
付款金额,必填
根据支付宝接口协议,必须使用下划线
/
private String total_amount;
/**
商品描述,可空
/
private String body;
/**
超时时间参数
/
private String timeout_express= "10m";
/**
产品编号
*/
private String product_code= "FAST_INSTANT_TRADE_PAY";
public String getOut_trade_no() {
return out_trade_no;
}
public void setOut_trade_no(String out_trade_no) {
this.out_trade_no = out_trade_no;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getTotal_amount() {
<span style="color: rgb