java支付宝支付【沙箱】

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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中对接支付宝(Alipay)的沙箱环境,通常涉及以下几个步骤: 1. **创建账号和申请API密钥**:首先,在支付宝开放平台(https://open.alipay.com)注册并成为开发者,然后申请沙箱测试账号,获取应用公钥(App Key)和私钥(App Secret)。 2. **集成SDK**:下载官方提供的支付宝SDK,例如Alipay Mobile SDK或Alipay Open Platform SDK,将其添加到项目中。对于Java项目,可以选择maven依赖或者直接将jar包导入。 3. **配置环境变量**:设置`ALIPAY_DEBUG=true`启用调试模式,并配置好沙箱环境的相关参数,如Endpoint(沙箱环境为`https://openapi.alipay.com/gateway.do`),以及支付相关的公共参数,如支付宝账户的回传地址(通知URL)。 4. **编写接口代码**:根据SDK文档实现接口调用,包括创建订单(Order creation)、付款请求(Payment request)、查询订单状态(Order status query)等。常用的方法如`alipay.trade.page.pay`。 5. **发起交易**:在用户触发支付操作后,使用SDK中的相应方法发送请求到支付宝服务器,获取预支付链接或者直接跳转到支付宝页面完成支付。 6. **处理回调**:为接收来自支付宝的异步通知或同步结果,设置相应的回调路由,处理成功、失败等各种场景。 7. **测试和优化**:在本地环境中反复测试各项功能,确保接口调用正常,并对可能出现的问题进行调试和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值