springboot 支付宝支付(手机网站)
应用:在移动端网页中进行支付宝支付
沙箱环境:https://opendocs.alipay.com/open/200/105311
官方文档:https://opendocs.alipay.com/open/203/105288
***************************
导入 jar 包
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.9.100.ALL</version>
</dependency>
***************************
示例
******************
配置文件
application.yml
alipay:
appid: 2016092500591327
gatewayUrl: https://openapi.alipaydev.com/gateway.do
format: JSON
charset: utf-8
signType: RSA2
notifyUrl: http://nd7b6i.natappfree.cc/notify
returnUrl: http://nd7b6i.natappfree.cc/return
app-private-key: MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCcF+Oc3uJEFt59LXB30LkP/Ocn6cMtxTeeqiM99tzGi3nyMao33jPYjwKvQk+djDb7i4bgJNVjx5QtEuJruMsiOMUO34QzYqnSZLLdA8Oltbf5LG/+qJMnF+K1dw9DWvw5dF6rbXvvqMpzruBJ99ntbWBK5hE/ayYODPhmcQ8rLV0nedYCb4nIhQueF3l6pFDG5e/eRyTj3Vb6faSf30DTKhMk4Yvj3Mx3f8h4eGGjFvvbSKdO8oI8HQYkEQh8k8pqkkQs3FSawp5KNAH13CNzGEnLewsOaHiEEwT1qSTc7ppewp7oyP2KtXw9TQySlkNFyLorqUHjF71hgCFmDEIxAgMBAAECggEACT5c60hDq/aSvGT5eQ7yNqEqazGrrkU0kv/OUHgTAOr3kMEiLGbLOTLW3NwXbOQFyYWsug9UV7FU9ApfQDPUS7WC7euMn6JjHiN6eB4l8uU8/NOF2lXPSQxgD5D6ZWm48AoVJR+5rCqZupoLjDXSQP4uKqFPOis1OLXJ6/8b/9l7L0jf2eW70Ht6HrNxfXTAn07FoJAEHnjePCgyYHuor9oD/0bi/0KRJkeQtqMZHX3oYhhYmQzIMTXIi9hMd+U6lmaknDFV8AMOfemX0Dq6KNYPwWP86YWelZ230xHXgE3Jk493unFZetliGG6vVyq4Whd5OTcXmE64+8GRKxO5QQKBgQDOwRR4KhyqbA7LXjyNhYXr86pOEt4wpeZGFsbcryRsxf0HSZpVWwUMVsOFkHRBZ3InbkfRCdHMBcqiA5dDwYOyo4l0R7sWdc9rteXvLdw57tBDbkiLK2HW+iUP0mXXghiD7ynyaAyLdvu5upUdDj1G1OI40Ye1ThOK60WseXyC6QKBgQDBRb2dg4YDKh0HtTsl8e/A1rPzob7KyRSi7bY31WtEOETeY6FMsC9jMm6fxJtT+Xtp5XfrWhQptn0E1fLJ7c7TAM1hFs2YBzOLKzinVxo0nFfRGkMrBotoAQmh+SKME1BjyW8qGeVIC8DSSazvVDDpp3Z6+WjNESL7e8yAn3VoCQKBgDVxGwVkfTxf6gMPPL+n/9HZje/YWK5ic38ya/ynGNc05g54K/hcKpXh53AiwqoVPyCKFO4nh58g8BuoqfTNlGkcdG8mC2nm0dKZlfGY/Q/MdvC3FPFEKWoUBnhsff6SlhukOkd6NaPnAXIklF6KS7R/WmotXtKyd8K0xbGrRU/hAoGAX4diHp3oul2xdaLddnbsA0vcLFrRHBhhq9qFC3ngiBqr56QlEOuwsH438Z5TDCGvH3t9V4Xxm2CI0MATPj3d0at+2DNWMYO1tV8KpKPH3yM7wK4TbwvQEfsZUMb8jXHqdTgWSx/7lS3CA+7InI7nkkXkqQnoBBwpR1Y8kYK/nEkCgYBmVBBabnYfaUkooDBPOZu7xCQH1xf+yPV0jH8T8FMYFn6biCXVnHhjZ5Mm8h8Y7gctRpZtqnG30TD71HLsRohxfQkxRyp9NvhiJpingBL860lM89JA3C/pNDf8FV3hq4RFIPDkBA3v7QbytDTNl4bQ7oYiFegWndLVBboNIntNFg==
alipay-public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1ynoaKrpzpipzhsivNwIRBrEPMeFYLWkWSMU9E3KAdBBpSGHN9x3OVWYe/F3yxRgLtbOdqN1DBYiKLUBvUu2NAqH1KV6nkt3Rx/gc7MKMwL+TWBmXKX5L1eK17TOPKMXoqVN5grFrCH0hx/U6lZnr2M/7A93yPlSKLgJwVYj560wzElBL+fvjR0V0OA+FWJryKluBtJYUKXBadFKuyVwNnyGqmHFxvtSHuErhOrg0YiYIfhV3f7zE5q1mIz7ecwH0W7nB7gtFjLt1k4WSpwyeEI8Xpl7SLMvHdwEXUwTU0h/V7TumYWgUe0ft70NTps+zPwJlmcEluHg0VSs7UrDVQIDAQAB
说明:app-private-key为应用私钥,alipay-public-key为支付宝公钥
******************
config 层
AlipayProperties
@Data
@Component
@ConfigurationProperties("alipay")
public class AlipayProperties {
private String appId;
private String gatewayUrl;
private String format;
private String charset;
private String signType;
private String appPrivateKey;
private String alipayPublicKey;
private String returnUrl;
private String notifyUrl;
}
AlipayConfig:创建AlipayClient客户端
@Configuration
public class AlipayConfig {
@Resource
private AlipayProperties alipayProperties;
@Bean
public AlipayClient initAlipayClient(){
return new DefaultAlipayClient(alipayProperties.getGatewayUrl(),
alipayProperties.getAppId(),alipayProperties.getAppPrivateKey(),
alipayProperties.getFormat(),alipayProperties.getCharset(),
alipayProperties.getAlipayPublicKey(),alipayProperties.getSignType());
}
}
******************
controller 层
AlipayContorller
@RestController
public class AlipayController {
@Resource
private AlipayClient alipayClient;
@Resource
private AlipayProperties alipayProperties;
@RequestMapping("/wapPay") //手机网站支付
public String wapPay(){
AlipayTradeWapPayModel model=new AlipayTradeWapPayModel();
model.setOutTradeNo("101"); //商户订单号
model.setProductCode("QUICK_WAP_WAY"); //手机网站支付销售码
model.setSubject("海贼王"); //订单标题
model.setTotalAmount("1000"); //支付金额
model.setTimeoutExpress("2h"); //订单支付超时时间
AlipayTradeWapPayRequest request=new AlipayTradeWapPayRequest();
request.setBizModel(model);
request.setReturnUrl(alipayProperties.getReturnUrl());
request.setNotifyUrl(alipayProperties.getNotifyUrl());
AlipayTradeWapPayResponse response=null;
try{
response= alipayClient.pageExecute(request);
}catch (Exception e){
e.printStackTrace();
}
assert response != null;
return response.getBody();
}
@RequestMapping("/query")
public String query() throws Exception{ //支付结果查询
AlipayTradeQueryModel model=new AlipayTradeQueryModel();
model.setOutTradeNo("101");
AlipayTradeQueryRequest request=new AlipayTradeQueryRequest();
request.setBizModel(model);
return alipayClient.execute(request).getTradeStatus();
}
@RequestMapping("/close")
public String close() throws Exception{ //订单关闭
AlipayTradeCloseModel model=new AlipayTradeCloseModel();
model.setOutTradeNo("101");
AlipayTradeCloseRequest request=new AlipayTradeCloseRequest();
request.setBizModel(model);
return alipayClient.execute(request).getBody();
}
@RequestMapping("/refund")
public String refund() throws Exception{ //订单退款
AlipayTradeRefundModel model=new AlipayTradeRefundModel();
model.setOutTradeNo("101");
model.setRefundAmount("20");
model.setOutRequestNo("5");
AlipayTradeRefundRequest refundRequest=new AlipayTradeRefundRequest();
refundRequest.setBizModel(model);
AlipayTradeRefundResponse refundResponse=alipayClient.execute(refundRequest);
return "退款总金额:"+refundResponse.getRefundFee();
}
@RequestMapping("/refundQuery")
public String refundQuery() throws Exception{ //订单退款查询
AlipayTradeFastpayRefundQueryModel model=new AlipayTradeFastpayRefundQueryModel();
model.setOutTradeNo("101");
model.setOutRequestNo("5");
AlipayTradeFastpayRefundQueryRequest refundQueryRequest=new AlipayTradeFastpayRefundQueryRequest();
refundQueryRequest.setBizModel(model);
AlipayTradeFastpayRefundQueryResponse refundQueryResponse=alipayClient.execute(refundQueryRequest);
return "本次退款金额为:"+refundQueryResponse.getRefundAmount()+
"\n订单总金额为:"+refundQueryResponse.getTotalAmount();
}
@RequestMapping("/queryDownload")
public String downloadUrl() throws Exception{ //对账单下载地址
AlipayDataDataserviceBillDownloadurlQueryModel model=new AlipayDataDataserviceBillDownloadurlQueryModel();
model.setBillType("trade");
model.setBillDate("2020-04-06");
AlipayDataDataserviceBillDownloadurlQueryRequest request=new AlipayDataDataserviceBillDownloadurlQueryRequest();
request.setBizModel(model);
AlipayDataDataserviceBillDownloadurlQueryResponse response=alipayClient.execute(request);
return response.getBillDownloadUrl();
}
@RequestMapping("/return")
public String returnUrl(HttpServletRequest request) throws Exception{ //支付成功后跳转接口
if (check(request.getParameterMap())){
return "success";
}else {
return "false";
}
}
@RequestMapping("/notify")
public void notify(HttpServletRequest request) throws Exception{ //交易结果异步通知,trade_succcess状态下会触发
if (check(request.getParameterMap())){
System.out.println(request.getParameter("trade_status"));
System.out.println("异步通知 "+ Instant.now());
}else {
System.out.println("验签失败");
}
}
private boolean check(Map<String,String[]> requestParams) throws Exception{
Map<String,String> params = new HashMap<>();
for (String name : requestParams.keySet()) {
String[] values = requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
params.put(name, valueStr);
System.out.println(name+" ==> "+valueStr);
}
return AlipaySignature.rsaCheckV1(params, alipayProperties.getAlipayPublicKey(),
alipayProperties.getCharset(), alipayProperties.getSignType()); //调用SDK验证签名
}
}