springboot Alipay payment (computer website)


springboot Alipay payment (computer payment)

 

Application: Pay with Alipay on the computer webpage

Official documentation: https://opendocs.alipay.com/open/270

 

 

***************************

Introduce jar package

 

<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>4.9.100.ALL</version>
</dependency>

 

 

***************************

Examples

 

******************

Configuration file

 

application.yml

alipay:
  appid: 2016092500591327
  gatewayUrl: https://openapi.alipaydev.com/gateway.do
  format: JSON
  charset: utf-8
  signType: RSA2
  notifyUrl: http://localhost:8080/notify
  returnUrl: http://localhost:8080/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

Note: app-private-key is the application private key, and alipay-public-key is the Alipay public key

 

******************

config layer

 

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: create alipayClient client

@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 layer

 

AlipayController

@RestController
public class AlipayController {

    @Resource
    private AlipayClient alipayClient;

    @Resource
    private AlipayProperties alipayProperties;

    @RequestMapping("/pay")
    public String pagePay(){
        AlipayTradePagePayModel model=new AlipayTradePagePayModel();
        model.setOutTradeNo("3000");       //商户订单号
        model.setProductCode("FAST_INSTANT_TRADE_PAY");  //电脑网站支付销售产品码,不同的支付方式productCode不同
        model.setSubject("海贼王");         //订单标题
        model.setTotalAmount("100");        //订单总金额
        model.setTimeoutExpress("1h");     //支付超市时间,1h后关闭

        AlipayTradePagePayRequest request=new AlipayTradePagePayRequest();
        request.setBizModel(model);
        request.setReturnUrl(alipayProperties.getReturnUrl());   //支付成功后同步返回的url地址
        request.setNotifyUrl(alipayProperties.getNotifyUrl());   //trade_success、trade_closed触发

        AlipayTradePagePayResponse response= alipayClient.pageExecute(request);
        
        return response.getBody();
    }

    @RequestMapping("/query")
    public String query() throws Exception{
        AlipayTradeQueryModel model=new AlipayTradeQueryModel();
        model.setOutTradeNo("3000");

        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("3000");

        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("3000");
        model.setRefundAmount("20");
        model.setOutRequestNo("100");  //分批次退款时,对应的每一次退款请求号,同一订单该值不能相同

        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("3000");     //商户订单号
        model.setOutRequestNo("100");    //退款请求号

        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("/notify")
    public void notify(HttpServletRequest request) throws Exception{  //异步通知接口
        if (check(request.getParameterMap())){
            System.out.println("异步通知");
        }else {
            System.out.println("验签失败");
        }
    }

    @RequestMapping("/return")
    public String returnUrl(HttpServletRequest request) throws Exception{ //同步跳转接口
        if (check(request.getParameterMap())){
            return "success";
        }else {
            return "false";
        }
    }

    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);
        }

        return AlipaySignature.rsaCheckV1(params, alipayProperties.getAlipayPublicKey(),
                alipayProperties.getCharset(), alipayProperties.getSignType()); //调用SDK验证签名
    }
}

Note: The notify interface is only called in the trade_success state,

notify call: after successful payment and partial refund, the payment status is trade_success

notify does not call: full refund, multiple partial refunds will fully refund the balance, the payment status becomes trade_closed

 

 

Published 387 original articles · Like 98 · Visits 30,000+

Guess you like

Origin blog.csdn.net/weixin_43931625/article/details/105356707