1 申请沙箱账号并配置
https://open.alipay.com/develop/manage
最下方【开发工具推荐】–>【沙箱】
开发信息–>接口加签方式–>系统默认密钥–>公钥模式(启用)+配置授权回调地址
查看公钥信息
2 创建SpringBoot项目配置环境
创建springboot项目,初始化加载web
2.1 application.properties
# 应用名称
spring.application.name=demo
# 应用服务 WEB 访问端口
server.port=8080
# 支付宝沙箱配置
#沙箱应用-->应用信息-->基本信息-->APPID
alipay.appId=2021000121681756
#沙箱应用-->应用信息-->开发信息-->接口加签方式-->系统默认密钥-->公钥模式-->查看-->应用私钥
alipay.appPrivateKey=MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCXUQi/JIYwYTfMAZTzirtUOjcUFh2yZ0MrueG3fUnun+LO1tnUvSZk+nKjpYpE5k0RRs+M3t2YgfZLGHed/34iVACgIP2hKzb3DLLO0qUgCOj6kUdbpReWA1k97Ga2l7DvknePYkg+XCtvE8s4jflAxYaKEpmIwrKgl9TlAO9+6yObEVbyLkQOwDamsTA2vqwVYXu9NIB5cnNV0qWPy4/NXaQ9+1IgJcvT71fnVku6vGr4rxUoWGg9FjDFzADLN4KzUbF5+qp+3CHrtF5I8GJ4fCLIw9H8N/uZW+3T5+6ovg+4IDl9eVzMAp8dpy1LKy4+dlX7kggmDAwyaJgYvFSLAgMBAAECggEALTnnJ1o/UU59YthGMNSSUQZlV/eUQLJkfTk9oZ4s7smS/MdyrAcs5pmEkiz0Osuq1TMY7b3e9apCdweFGRA4HwKEfVfe9sD32LdO6kpDWGPRXrL1ZQrfFdNCZSO3P3PvSmu4mH6DoT/jK3v7DZhBm35uS+5rPVkUErPOyfORoZknx6+LS2Ih1EbykxJLj5Pmnc1MU0W4gGpckCVP43y5bKWLMXDMzQT72CqKJxgrnEzlhZH1IlFObMFvYhv0WCKu58Aq/filcWVeY3T6i44ZNU1/8iACex5ohteCoI+oC/E/FufE0k6MO7Iai1pD368zkAzHsKBuFWqtettAmzgzIQKBgQDc3cXvCjn9J5WqmzGgtFih+61UzG3F7ICaqy6xFLiSaqTlARS3w8eNrNgZEysXUXQz2ucBkzILHeKtTdVcj4W+cBngIa14cvINTn6R4/Yi9HZFmvdOpAfJXBajNvIEPbVAL4fbTSYfNEXR5hQ9S6RJ2uKvDhm4Ihy/36tTmXr9LQKBgQCvYwVrobpJOVXY6vh+tDm7dCTVVC4iqIJudZtu9IFi/nfSOkl7SNh0dBBDJXs0j9sW7w2EZIAdDkPtOxHLIEMBIiOM/bXcjA+De41WCFWeP9GEuzVfY6100uL93qSQnJN2MLuNyTDp65yEexrrehN5fhOhG0NSFRJWjKcOkTpblwKBgGKV51Tkpq+2LJsjfMpz1aAwG9VfDpyrDVh8knHeguhwC7xgeCPykq9NeIPwx2o4JHtE+Zn9XvgRVe3vcQ5IzfUMSrB9t9Ws0RhZciuiqmo93lEBc+Q5WXRq03v0+aAk/zNwQ98Cl8KT7ZpcbapSijmhJ0/mJlrHdze6GdpOBtTdAoGBAKkQ1B3P9eo2GdoTj11cUDayG/uEvUBtneXq+t13Vu5djJWb2E++heGkLDT+AYlGjxTJdgdEdfcMVFBv25QqUkzaYti7jT6/yQie5jyjphz5OfgwGqAMTx3JWEUPBSXduYx6J6Hi6oLju6o9nVKXCATakwN/a2LJqzbBORyixFWbAoGBAMI6KuvLND1C00rWWzxF2PzES9jUB1GA+vZ9qyOtQT33cYL43LNZylGaynpyg3W9onRLjan8HKeK7XpfuET+6SK2RoZQF9cJ1OheZixBQm7B2+ONPNhY0LbiWsIHQjFSeCS7Kw03J8eJd9M73X8eE8ha4OlQPpbYSMhBWb4jGzZ+
#沙箱应用-->应用信息-->开发信息-->接口加签方式-->系统默认密钥-->公钥模式-->查看-->支付宝公钥
alipay.alipayPublicKey=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAn8X7CR4VKB7r7bcdfyc+23RJcmQdLPybnDBVlHMnZPM2aeQwQLgNymKUqxjMdQoPUtGWMV7x63xjTstaPLCnTJffQL4S9bLB8RskAniz+24uzGdqXOzWhpRk09LdjMOtbC8ceNrBtBLyQJoB2NtsB0pGh8fgHQHfX0b8lhyvpgmtg2BEXkXWpi9KBb5bSC79Evve30O7Vg4nWC5Rz/vv8Op/GGtLy03PvxovvEGMZgX3m8t+vYQIB5PpQaS0f3M4HguXL0cwol48iKDknDSzAhISwZHKzvu9AosXBi2kV9vQPBglJkHdYxxMlpiUy1BvrDyAhz9xFQiz+qCdv4L3GwIDAQAB
#回调地址
alipay.notifyUrl="natapp映射的网址"/alipay/notify
pom文件所需依赖:
<!-- alipay-sdk-java -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.16.2.ALL</version>
</dependency>
2.2 配置类【封装公私钥】
AlipayConfig.java
@Data
@Component
@ConfigurationProperties(prefix = "alipay")
public class AlipayConfig {
private String appId;
//应用私钥
private String appPrivateKey;
//阿里公钥
private String alipayPublicKey;
//阿里调用我们的地址【内网穿透】
private String notifyUrl;
}
2.3 创建实体类【与阿里交互的对象】
AliPay
//与阿里交互的对象
@Data
public class AliPay {
private String traceNo;//我们的订单号
private Double totalAmount;//总金额
private String subject;//主题
private String alipayTraceNo;//阿里的流水号
}
2.4 controller类
@RestController
@RequestMapping("/alipay")
public class AliPayController {
//阿里网关地址
private static final String GATEWAY_URL = "https://openapi.alipaydev.com/gateway.do";
//数据格式
private static final String FORMAT = "JSON";
//编码格式
private static final String CHARSET = "UTF-8";
//签名方式
private static final String SIGN_TYPE = "RSA2";
@Resource
private AlipayConfig alipayConfig;
/**
* 请求支付宝
* /
@GetMapping("/pay") // ?subject=xxx&traceNo=xxx&totalAmount=xxx
public void pay(AliPay aliPay, HttpServletResponse response) throws IOException {
//1.创建client,通过阿里SDK提供的client,负责调用支付宝的API
AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY_URL,
alipayConfig.getAppId(),
alipayConfig.getAppPrivateKey(),
FORMAT,
CHARSET,
alipayConfig.getAlipayPublicKey(),
SIGN_TYPE);
//2.创建request,并设置request参数
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setNotifyUrl(alipayConfig.getNotifyUrl());
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", aliPay.getTraceNo());//我们自己生成的订单编号
bizContent.put("total_amount", aliPay.getTotalAmount());//订单总金额
bizContent.put("subject", aliPay.getSubject());//支付名称
bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");//固定配置
request.setBizContent(bizContent.toString());
//执行请求,拿到响应的结果,返回给浏览器
String form = "";
try{
form = alipayClient.pageExecute(request).getBody();//调用SDK生成表单
} catch (AlipayApiException e) {
e.printStackTrace();
}
//设置响应结果,将返回的内容写出到浏览器
response.setContentType("text/html;charset=" + CHARSET);
response.getWriter().write(form);//直接将完整的表单html输出到页面
response.getWriter().flush();
response.getWriter().close();
}
/**
* 支付宝回调【post】
* 支付宝异步回调【必须是POST】
* @return
*/
@PostMapping("/notify")
public String payNotify(HttpServletRequest request) throws AlipayApiException {
if(request.getParameter("trade_status").equals("TRADE_SUCCESS")){
System.out.println("-------------支付宝异步回调----");
Map<String, String> params = new HashMap<>();
Map<String, String[]> requestParams = request.getParameterMap();
System.out.println("-----params-----------");
for(String name : requestParams.keySet()){
params.put(name, request.getParameter(name));
System.out.println(name +" " + request.getParameter(name));
}
String outTradeNo = params.get("out_trade_no");
String gmtPayment = params.get("gmt_payment");//支付时间
String alipayTradeNo = params.get("trade_no");
String sign = params.get("sign");//拿到签名
String content = AlipaySignature.getSignCheckContentV1(params);
boolean checkSignature = AlipaySignature.rsa256CheckContent(content,
sign,
alipayConfig.getAlipayPublicKey(),
"UTF-8");//验证签名
//支付宝验签
if(checkSignature){
//验签通过
System.out.println("交易名称: " + params.get("subject"));
System.out.println("交易状态: " + params.get("trade_status"));
System.out.println("支付宝交易凭证号: " + params.get("trade_no"));
System.out.println("商户订单号: " + params.get("out_trade_no"));
System.out.println("交易金额: " + params.get("total_amount"));
System.out.println("买家在支付宝唯一id: " + params.get("buyer_id"));
System.out.println("买家付款时间: " + params.get("gmt_payment"));
System.out.println("买家付款金额: " + params.get("buyer_pay_amount"));
// 查询订单
//TODO 支付成功,操作数据库,创建对应订单,修改对应商品数据
}
}
return "success";
}
}
3 测试
在浏览器中输入:
#traceNo--单据编号 totalAmount--订单总金额
localhost:8080/alipay/pay?subject=收购阿里&traceNo=412341243&totalAmount=9999