java支付宝支付【沙箱】

1 申请沙箱账号并配置

https://open.alipay.com/develop/manage

最下方【开发工具推荐】–>【沙箱】
java支付宝支付【沙箱】_第1张图片
开发信息–>接口加签方式–>系统默认密钥–>公钥模式(启用)+配置授权回调地址
java支付宝支付【沙箱】_第2张图片
查看公钥信息
java支付宝支付【沙箱】_第3张图片

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文件所需依赖:



    com.alipay.sdk
    alipay-sdk-java
    4.16.2.ALL

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 params = new HashMap<>();
            Map 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

你可能感兴趣的:(Java,java,spring,开发语言)