注意:
一、支付宝准备工作
1.登陆支付宝开发者中心(没有登入的直接用支付宝登入)
2. 进入研发服务
3. 点击设置RSA2(密钥)注:这个APPID待会项目会用到
4.点击使用支付宝密钥生成器
5.点击开发者助手简介,我们在这里面生成密钥
6.点击web在线加密生成密钥,没必要下载
7.点击生成密钥(注:这个应用私钥项目中会用到)
8.我们把上面的应用公钥复制到沙箱应用中(下面红框中),点击保存设置,这时候就会生成支付宝公钥(注:这个支付宝公钥项目中会用到)
二、开始搭建项目
1.使用idea搭建快速搭建springboot项目,项目结构如下:
2.支付界面
3.添加pom
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- 支付SDK-->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.9.9</version>
</dependency>
4.配置yml
app:
#appId
appId: #上面注 有提到appId
#商户私钥
privateKey: #上面注 有提到就是应用私钥
#支付宝公钥
publicKey: #上面注 有提到就是支付宝公钥
#服务器异步通知页面路径,需要公网能访问到
notifyUrl: http://localhost:8080/app/success
#服务器同步通知页面路径,需要公网能访问到
returnUrl: http://localhost:8080/app/success
#签名方式
signType: RSA2
#字符编码格式
charset: utf-8
#支付宝网关
gatewayUrl: https://openapi.alipaydev.com/gateway.do
5.新建bean包主要放实体类,创建AlipayApp类读取yml配置信息
@Data
@Component
@ConfigurationProperties(prefix = "app")
public class AlipayApp {
/**
* appId
*/
private String appId;
/**
* 商户私钥
*/
private String privateKey;
/**
* 支付宝公钥
*/
private String publicKey;
/**
* 服务器异步通知页面路径,需要公网能访问到
*/
private String notifyUrl;
/**
* 服务器同步通知页面路径,需要公网能访问到
*/
private String returnUrl;
/**
* 签名方式
*/
private String signType;
/**
* 字符编码格式
*/
private String charset;
/**
* 支付宝网关
*/
private String gatewayUrl;
}
6.在bean包下创建订单实体类AliPayBean
@Data
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";
}
7.新建一个component包,创建Alipay,集成支付接口
@Component
public class Alipay {
@Autowired
private AlipayApp app;
public String pay(AliPayBean aliPayBean) throws AlipayApiException {
//1.初始化AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(app.getGatewayUrl(),
app.getAppId(),
app.getPrivateKey(),
"json",
app.getCharset(),
app.getPublicKey(),
app.getSignType());
//2.设置请求参数
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(app.getReturnUrl());
alipayRequest.setNotifyUrl(app.getNotifyUrl());
alipayRequest.setBizContent(JSON.toJSONString(aliPayBean));
//3.请求支付宝进行付款,并获取支付结果
String result = alipayClient.pageExecute(alipayRequest).getBody();
//4.返回付款结果
return result;
}
}
8.创建service包,编写支付接口PayService
public interface PayService {
String aliPay(AliPayBean aliPayBean) throws AlipayApiException;
}
9.在创建service包下创建impl包,实现支付接口PayServiceImpl
@Service
public class PayServiceImpl implements PayService {
@Autowired
private Alipay alipay;
@Override
public String aliPay(AliPayBean aliPayBean) throws AlipayApiException {
return alipay.pay(aliPayBean);
}
}
10.创建controller包,创建OrderController订单控制层接口
@RestController
@RequestMapping(value = "/app/")
public class OrderController {
@Autowired
private PayService payService;
@RequestMapping(value = "aliPay")
public String alipay(String outTradeNo, String subject, String totalAmount, String body) throws AlipayApiException {
AliPayBean alipayBean = new AliPayBean();
alipayBean.setOut_trade_no(outTradeNo);
alipayBean.setSubject(subject);
alipayBean.setTotal_amount(totalAmount);
alipayBean.setBody(body);
return payService.aliPay(alipayBean);
}
@RequestMapping(value = "success")
public void success(){
System.out.println("支付成功!");
}
}
11.在static包下编写支付页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/app/aliPay" method="post">
订单号:<input type="text" name="outTradeNo" required><br/>
订单名称:<input type="text" name="subject" required><br/>
付款金额:<input type="text" name="totalAmount" required><br/>
商品描述:<input type="text" name="body"><br/>
<input type="submit" value="下单"> <input type="reset" value="重置">
</form>
</body>
</html>
12.编写PayCoinController来跳转支付界面
@Controller
@RequestMapping(value = "/paycoin/")
public class PayCoinController {
@RequestMapping(value = "index")
public String payCoin(){
return "index.html";
}
}
13.启动项目,访问http://localhost:8080/,填写数据,提交支付
14.成功进入扫码界面
15.输入沙箱的买家账户密码即可支付成功
16.查看沙箱的商家账户余额
可能存在的问题
1.点击支付提示支付存在钓鱼风险(目前谷歌会有这样子的问题,建议可以尝试IE和360浏览器试一下)
2.二维码失效(建议把实体类的超时时间timeout_express设置长一点)