1、支付宝开发平台
- 扫码登录
https://open.alipay.com/platform/home.htm
- 打开沙盒测试
- 沙箱应用 -- 设置公钥
- 下载公钥私钥生成器
#文档中心 -- 开发文档 -- 下面开发工具 -- 签名工具 -- 左边菜单工具
https://docs.open.alipay.com/291/106097/
- 将商户应用公钥填写进去,商户应用私钥要好好保存
2、下载沙盒版支付宝
3、下载 sdk 和测试 demo
- 文档中心 -- 开发文档 -- 电脑网站支付 -- 电脑网站支付 SDK & Demo
4、支付需要的配置信息
- APPID
- 支付宝公钥
- 应用私钥,之前秘钥生成工具中保存的
5、基本框架搭建
- 配置依赖
拷贝 alipay-sdk-java20170324180803.jar 到 src/main/resources/lib 目录下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.7.RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.vim</groupId>
<artifactId>pay-zfb</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.alipay</groupId>
<artifactId>alipay-sdk-java20170324180803</artifactId>
<version>20170324180803</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/alipay-sdk-java20170324180803.jar</systemPath>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- log4j -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.3.8.RELEASE</version>
</dependency>
</dependencies>
<build>
<finalName>zfb</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
</plugins>
</build>
</project>
- 支付宝配置文件 zfb.properties
alipay.appid =
alipay.privateKey =
alipay.publicKey =
alipay.signType = RSA2
alipay.charset = UTF-8
alipay.gatewayUrl = https://openapi.alipaydev.com/gateway.do
alipay.returnUrl =
alipay.notifyUrl =
- 支付宝配置文件类 ZfbConfig
package com.vim.common.properties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "alipay")
@PropertySource("classpath:zfb.properties")
public class ZfbConfig {
private String appid;
private String privateKey;
private String publicKey;
private String signType;
private String charset;
private String gatewayUrl;
private String returnUrl;
private String notifyUrl;
public String getAppid() {
return appid;
}
public void setAppid(String appid) {
this.appid = appid;
}
public String getPrivateKey() {
return privateKey;
}
public void setPrivateKey(String privateKey) {
this.privateKey = privateKey;
}
public String getPublicKey() {
return publicKey;
}
public void setPublicKey(String publicKey) {
this.publicKey = publicKey;
}
public String getSignType() {
return signType;
}
public void setSignType(String signType) {
this.signType = signType;
}
public String getCharset() {
return charset;
}
public void setCharset(String charset) {
this.charset = charset;
}
public String getGatewayUrl() {
return gatewayUrl;
}
public void setGatewayUrl(String gatewayUrl) {
this.gatewayUrl = gatewayUrl;
}
public String getReturnUrl() {
return returnUrl;
}
public void setReturnUrl(String returnUrl) {
this.returnUrl = returnUrl;
}
public String getNotifyUrl() {
return notifyUrl;
}
public void setNotifyUrl(String notifyUrl) {
this.notifyUrl = notifyUrl;
}
}
- 配置启动类
package com.vim;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@SpringBootApplication
@EnableConfigurationProperties
public class PayApplication {
public static void main( String[] args ) {
SpringApplication.run(PayApplication.class, args);
}
}
6、电脑网站支付
package com.vim.modules.web.controller;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.domain.AlipayTradeFastpayRefundQueryModel;
import com.alipay.api.domain.AlipayTradeQueryModel;
import com.alipay.api.domain.AlipayTradeRefundModel;
import com.alipay.api.request.AlipayTradeFastpayRefundQueryRequest;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.vim.common.properties.ZfbConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class AlipayTradeWapPayController {
@Autowired
private ZfbConfig config;
/**
* 发起网站支付
*/
@RequestMapping(value = "/trade/wap/pay", produces = MediaType.TEXT_HTML_VALUE)
@ResponseBody
public String alipayTradeWapPay() {
try {
//获得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(config.getGatewayUrl(), config.getAppid(), config.getPrivateKey(), "json", config.getCharset(), config.getPublicKey(), config.getSignType());
//设置请求参数
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(config.getReturnUrl());
alipayRequest.setNotifyUrl(config.getNotifyUrl());
//商户订单号,商户网站订单系统中唯一订单号,必填
String out_trade_no = "201907041136000001";
//付款金额,必填
String total_amount = "1";
//订单名称,必填
String subject = "201907041136000001";
//商品描述,可空
String body = "201907041136000001";
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setOutTradeNo(out_trade_no);
model.setTotalAmount(total_amount);
model.setSubject(subject);
model.setBody(body);
model.setTimeoutExpress("30m");
model.setProductCode("FAST_INSTANT_TRADE_PAY");
alipayRequest.setBizModel(model);
return alipayClient.pageExecute(alipayRequest).getBody();
}catch (Exception e){
e.printStackTrace();
}
return "";
}
/**
* 订单查询
*/
@RequestMapping(value = "/trade/wap/query")
@ResponseBody
public String alipayTradeWapQuery() {
try {
//获得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(config.getGatewayUrl(), config.getAppid(), config.getPrivateKey(), "json", config.getCharset(), config.getPublicKey(), config.getSignType());
//设置请求参数
AlipayTradeQueryRequest alipayRequest = new AlipayTradeQueryRequest();
//商户订单号,商户网站订单系统中唯一订单号
String out_trade_no = "201907041136000001";
AlipayTradeQueryModel model = new AlipayTradeQueryModel();
model.setOutTradeNo(out_trade_no);
alipayRequest.setBizModel(model);
return alipayClient.execute(alipayRequest).getBody();
}catch (Exception e){
e.printStackTrace();
}
return "";
}
/**
* 订单退款
*/
@RequestMapping(value = "/trade/wap/refund")
@ResponseBody
public String alipayTradeWapRefund() {
try {
//获得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(config.getGatewayUrl(), config.getAppid(), config.getPrivateKey(), "json", config.getCharset(), config.getPublicKey(), config.getSignType());
//设置请求参数
AlipayTradeRefundRequest alipayRequest = new AlipayTradeRefundRequest();
//商户订单号,商户网站订单系统中唯一订单号
String out_trade_no = "201907041136000001";
//支付宝交易号
String trade_no = "2019070422001478251000019038";
//请二选一设置
//需要退款的金额,该金额不能大于订单金额,必填
String refund_amount = "0.5";
//退款的原因说明
String refund_reason = "测试退款";
//标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传
String out_request_no = "201907041136100001";
AlipayTradeRefundModel model = new AlipayTradeRefundModel();
model.setOutTradeNo(out_trade_no);
model.setTradeNo(trade_no);
model.setRefundAmount(refund_amount);
model.setRefundReason(refund_reason);
model.setOutRequestNo(out_request_no);
alipayRequest.setBizModel(model);
return alipayClient.execute(alipayRequest).getBody();
}catch (Exception e){
e.printStackTrace();
}
return "";
}
/**
* 订单退款查询
*/
@RequestMapping(value = "/trade/wap/refund/query")
@ResponseBody
public String alipayTradeWapRefundQuery() {
try {
//获得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(config.getGatewayUrl(), config.getAppid(), config.getPrivateKey(), "json", config.getCharset(), config.getPublicKey(), config.getSignType());
//设置请求参数
AlipayTradeFastpayRefundQueryRequest alipayRequest = new AlipayTradeFastpayRefundQueryRequest();
//商户订单号,商户网站订单系统中唯一订单号
String out_trade_no = "201907041136000001";
String out_request_no = "201907041136100001";
AlipayTradeFastpayRefundQueryModel model = new AlipayTradeFastpayRefundQueryModel();
model.setOutTradeNo(out_trade_no);
model.setOutRequestNo(out_request_no);
alipayRequest.setBizModel(model);
return alipayClient.execute(alipayRequest).getBody();
}catch (Exception e){
e.printStackTrace();
}
return "";
}
}
7、支付回调处理
package com.vim.modules.web.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
@Controller
public class AlipayTradeWapNotifyController {
/**
* 异步回调
*/
@RequestMapping(value = "/trade/wap/notify")
@ResponseBody
public String alipayTradeWapPay(HttpServletRequest request) {
String notify_time = request.getParameter("notify_time");
String sign = request.getParameter("sign");
String trade_no = request.getParameter("trade_no");
String out_trade_no = request.getParameter("out_trade_no");
String buyer_id = request.getParameter("buyer_id");
String total_amount = request.getParameter("total_amount");
System.out.println("notify_time="+notify_time);
System.out.println("sign="+sign);
System.out.println("trade_no="+trade_no);
System.out.println("out_trade_no="+out_trade_no);
System.out.println("buyer_id="+buyer_id);
System.out.println("total_amount="+total_amount);
return "success";
}
}