SpringBoot使用支付宝沙箱环境进行仿真支付

发布时间:2024年01月04日

目录

一、进入支付宝开发平台—沙箱环境

二、点击沙箱进入沙箱环境

三、Java二维码生成技术

1、导入依赖

2、生成指定url对应的二维码图片

四、支付接口

1、保存好沙箱应用里面的公钥私钥

2、 测试接口

3、扫码

4、买家结果

5、卖家结果

五、回调接口

1、使用内网穿透功能开放本地服务器端口

2、回调接口代码

?3、测试

六、主动查询支付结果

1、测试

2、控制台打印


一、进入支付宝开发平台—沙箱环境

支付宝开放平台 (alipay.com)

最下方:

二、点击沙箱进入沙箱环境

安装支付宝沙箱APP

里面有商家和买家的指定账号

支付宝接口相关的id和密钥

三、Java二维码生成技术

1、导入依赖

        <!-- hutool-all -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.23</version>
        </dependency>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.3.3</version>
        </dependency>

2、生成指定url对应的二维码图片

void rememberMy(){
        QrCodeUtil.generate("https://4fb0-124-89-23-255.ngrok-free.app/user/test", 300, 300, FileUtil.file("D:/桌面/二维码.jpg"));
    }

生成成功

四、支付接口

1、保存好沙箱应用里面的公钥私钥

APP_ID,APP_PRIVATE_KEY,ALIPAY_PUBLIC_KEY,SEVER_URL?

public class AliyunPay {
    public static String APP_ID="20210001220478";
    public static String APP_PRIVATE_KEY="MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCco/ygHVMgSu0vateztwuGE1udMHS6OX8DF95V5rKQWLQ5W8sCqgDcBulOGlydBZDnu9eximq31mwzTMMJjwl/O+x3GiwfYuQIADLUsPXNPMO9u978OIwEdfNZq5mg+PFU21ZTN3ZYTKYwVM4lRQJEa2dMVsfuhMaMm22yHdz9m8K77AvITl1mIqnr4TZEbtsBzF7BE8ryncRe3pudtWKgEpZ6iuOBe3cDa9O/ZrNY1ywDtD6BxGaszDWZksLbWM86oFTHdAnqzpQ7XEfDIryiSmk0O+kl/4JPyJPNS3mIl7raK4reovWELZsNs/DSyTqYE8hI80pipwBlS/dvULPTAgMBAAECggEAApHCDBJPEcGI4HU9Mop3GuzoXMy1rXRR/AgBMqGFHk8GLcaurs2BFBrc6tYN3NmBhfuTzyq5E2jl/3Vr4ZVCD585Ar8gKCekG+l86/Y3IfW0NEGHp9V5nn0cz8S70WMj+kNayCSpwUsIktRhSUU3g03LtPnbb7Mn2pirMoNmE9GRecG2HLkAUOyDfI1xePsiEUwIuWn5bbi13PsoJ7wVc1ylSZ9q1LIv9EKi/z8Z845eTtXt4jbbaB7rfS/3q4GZKrTj3kDvDCpc4JhlJgSQ9FkpGOourcbPVOloPllEOJO18hd2P2FCl5ffrIXtydGalT0glFL/y6PKQKBgG+ZOU8mTOBp8cxgS3Hxmg7zf3acN9rOj6HRyVGHQJq7ryf/A13D/lkqlpVGVwZEhPX5M5XjB3Igp8OLDJlXYxoL6y6px05KmSFjxFmgPOWnDS9Ty6EOLevpL+xYY4AVIEDhyT3eoWOasX8ZFoTCbPlUYy40RMt635tPkiOwyxHhawgg6WmwKBgQCprMoNmE9GRecG2HLkAUOyDfI1xePsiEUwIuWn5bbi13PsoJ7wVc1ylSZ9q1LIv9EKi/z8Z845eTtXt4jbbaB7rfS/3q4GZKrTj3kDvDCpc4JhlJgSQ9FkpGOourcbPVOloPllEOJO18hd2P2FCl5ffrIXtydGalT0glFL/y6PKQKBgG+ZOU8mTOBp8cxgS3Hxmg7zf3acN9rOj6HRyVGHQJq7ryf/A13D/lkqlpVGVwZEhPX5M5XjB3Igp8OLDJlXYxoL6y6px05Kmw9/T5Webk2ima77KOibl3Ss0vDNRRtiCB70nmFRFgu9IfqWD68J+H+NoN6wYZCTd7vPbIFu+LqPAoGAR36+ePIH3WWRDopgBwEdZEaKG+xxuPZGqRzbRl7+LCF7AGdB8aVF95Uvbd6l+F8TF22bQUQAWqlhvvlgGo3cBKFtMvgCvkDm1lRrOo6utogslS+G0JNxBQZb0/oxM7Ior+7fh52QroYwMJNBaDDRSU3afzG2w+4ENC9BUFOLa9kCgYEArC9q83LWZdvV9AePohtITH5CKUFv+vgSnhjcr8YKHooEeWAHkZ1fTctfSvxco/Oc4SWECrc5LN3m/lvKHKI/T5rkxOkLzjiRu1PwVzFevXdbE4m6poN7BliGb/GjltDcraXof/Fh2x0bwsn+92n6YcfIaShtLrALARujJW6/L5Y=";
    public static String ALIPAY_PUBLIC_KEY="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8h31z6R1Pv9jcGxVbbNkYz5hU0wh7xWH2OfvZI5pfBt8Tw7aO74ikqdJygRvWbhDtUPAAxNAA/+Hxd8dmrgZsB8P8a9bmBTpt5xbnz5v83NkKpm3Arft69TF3svl8FgM0c485Qbpp1aEmj11n1eoHEWmFnAFmPsceW7Suh69xExRCf5VAW9h31z6R1Pv9jcGxVbbNkYz5hU0wh7xWH2OfvZI5pfBt8Tw7aO74ikqdJygRvWbhDtUPAAxNAA/+Hxd8dmrgZsB8P8a9bmBTeEUXEemvE6xjgguGjhH8UszM0zMTtwlkcAD9sON/ZcOuKf/OsHFwA6gnlH8pArTcyvR6QDJ0nkvQyWLffW/YwIDAQAB";
    public static String NOTIFY_URL="https://4fb0-124-89-23-255.ngrok-free.app/aliyun/notify";
    public static String SEVER_URL="https://openapi-sandbox.dl.alipaydev.com/gateway.do";
}

??扫码支付快速接入

找到预下单的代码实例,这里已经写好了,如下:

public void pay() {
        //设置商品属性
        Model tmpModel = new Model();
        tmpModel.setOutTradeNo(String.valueOf(UUID.randomUUID()));
        tmpModel.setTotalAmount("32");
        tmpModel.setSubject("2024.1.4-2024.2.4电费32元");
        
        //填写公钥密钥
        AlipayClient alipayClient = new DefaultAlipayClient(AliyunPay.SEVER_URL,AliyunPay.APP_ID,AliyunPay.APP_PRIVATE_KEY,"json","GBK",AliyunPay.ALIPAY_PUBLIC_KEY,"RSA2");
        AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
        //填写回调接口地址,必须为公网可以访问的地址
        request.setNotifyUrl(AliyunPay.NOTIFY_URL);
        JSONObject bizContent = new JSONObject();
        //将商品的属性填写进去
        bizContent.put("out_trade_no", tmpModel.getOutTradeNo());
        bizContent.put("total_amount", tmpModel.getTotalAmount());
        bizContent.put("subject", tmpModel.getSubject());

         商品明细信息,按需传入
        //JSONArray goodsDetail = new JSONArray();
        //JSONObject goods1 = new JSONObject();
        //goods1.put("goods_id", "goodsNo1");
        //goods1.put("goods_name", "子商品1");
        //goods1.put("quantity", 1);
        //goods1.put("price", 0.01);
        //goodsDetail.add(goods1);
        //bizContent.put("goods_detail", goodsDetail);

         扩展信息,按需传入
        //JSONObject extendParams = new JSONObject();
        //extendParams.put("sys_service_provider_id", "2088511833207846");
        //bizContent.put("extend_params", extendParams);

         结算信息,按需传入
        //JSONObject settleInfo = new JSONObject();
        //JSONArray settleDetailInfos = new JSONArray();
        //JSONObject settleDetail = new JSONObject();
        //settleDetail.put("trans_in_type", "defaultSettle");
        //settleDetail.put("amount", 0.01);
        //settleDetailInfos.add(settleDetail);
        //settleInfo.put("settle_detail_infos", settleDetailInfos);
        //bizContent.put("settle_info", settleInfo);

         二级商户信息,按需传入
        //JSONObject subMerchant = new JSONObject();
        //subMerchant.put("merchant_id", "2088000603999128");
        //bizContent.put("sub_merchant", subMerchant);

         业务参数信息,按需传入
        //JSONObject businessParams = new JSONObject();
        //businessParams.put("busi_params_key", "busiParamsValue");
        //bizContent.put("business_params", businessParams);

         营销信息,按需传入
        //JSONObject promoParams = new JSONObject();
        //promoParams.put("promo_params_key", "promoParamsValue");
        //bizContent.put("promo_params", promoParams);
    
        
        request.setBizContent(bizContent.toString());
        AlipayTradePrecreateResponse response = null;
        try {
            response = alipayClient.execute(request);
        } catch (AlipayApiException e) {
            throw new RuntimeException(e);
        }
        if(response.isSuccess()){
            System.out.println("调用成功");
        } else {
            System.out.println("调用失败");
        }
        log.info("支付订单号:"+response.getOutTradeNo());
        
        //根据返回的response.getQrCode()二维码链接生成二维码
        QrCodeUtil.generate(response.getQrCode(), 300, 300, FileUtil.file("D:/桌面/"+tmpModel.getSubject()+".jpg"));
    }

2、 测试接口

访问成功

控制台打印如下信息表示成功?

3、扫码

代码成功会生成指定位置二维码

使用沙箱支付宝买家账号去扫码

4、买家结果

如图可以看出名称、价格与输入的商品名称价格一致

5、卖家结果

卖家这里也收款成功:

测试成功?

五、回调接口

回调接口用来接受支付宝成功支付的异步通知结果

1、使用内网穿透功能开放本地服务器端口

以下均免费

ngrok内网穿透,国内无法访问

cpolar内网穿透,国内可以访问

2、回调接口代码

官网文档

    /**
     * 支付宝异步调用通知
     * @param request
     * @return
     */
    @PostMapping("/notify")
    public  Result<String> notify(HttpServletRequest request) {
        log.info("支付宝异步通知");
        log.info("异步通知参数:{}",request.getParameter("out_trade_no"));
        
        //TODO 业务代码
        
        return  Result.success(request.getParameter("out_trade_no"));
    }

?3、测试

根据刚才的测试,回调接口收到了支付宝的通知,以及商家订单号表示支付成功

六、主动查询支付结果

官方文档找到查询交易

代码如下:

public Boolean query(String outTradeNo) {
        //填写公钥私钥
        AlipayClient alipayClient = new DefaultAlipayClient(AliyunPay.SEVER_URL,AliyunPay.APP_ID,AliyunPay.APP_PRIVATE_KEY,"json","GBK",AliyunPay.ALIPAY_PUBLIC_KEY,"RSA2");
        AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
        
        //将要查询的订单号填进去
        request.setBizContent("{" +
                "  \"out_trade_no\":\""+outTradeNo+"\"," +
                "  \"query_options\":[" +
                "    \"trade_settle_info\"" +
                "  ]" +
                "}");
        AlipayTradeQueryResponse response = null;
        try {
            response = alipayClient.execute(request);
        } catch (AlipayApiException e) {
            throw new RuntimeException(e);
        }
        //根据交易成功与否返回true或false
        if(response.isSuccess()){
            return true;
        } else {
            return false;
        }

1、测试

查询上文支付例子中已经支付的订单号

?返回为true,测试成功

2、控制台打印

表示已经支付?

文章来源:https://blog.csdn.net/weixin_55127182/article/details/135372545
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。