支付宝接入技术

支付宝,接入,技术 · 浏览次数 : 158

小编点评

The provided Java code is a controller method for handling an HTTP GET request to retrieve payment result details for a specific outTradeNo. **Here's a breakdown of the code:** * **Method Name**: `queryAlipayInfo` * **RequestMapping**: `value="/queryInfobyOutTradeNo"` * **Method Type**: `@RequestMapping` with `RequestMethod.GET` * **return type**: `ModelAndView` **Code Functionality:** 1. The method initializes an `AlipayTradeQueryRequest` object with a `outTradeNo` parameter. 2. It creates a JSON object with the `outTradeNo` parameter and sets it as the request's body content. 3. It makes an API call to the `alipayClient` with the request object. 4. The method checks the response status and prints a success message if successful, otherwise, it prints an error message. 5. The method returns an `ModelAndView` with a single `Model` object containing the following attributes: * `tradeNo` * `tradeStatus` * `totalAmount` * `outTradeNo` **Purpose of the Controller Method:** The purpose of this controller method is to retrieve payment result details for a given outTradeNo from the Alipay payment gateway and display them on the frontend (HTML page). **Additional Notes:** * The `AlipayTradeQueryRequest` class and the response handling are not provided in the code snippet. * The code assumes the existence of an `alipayClient` object that handles communication with the Alipay gateway. * The `bootstrap-3.4.1-dist` and `css` paths in the `href` attribute refer to a third-party CSS file. * The code focuses on generating a basic HTML response, which may require additional HTML templates and CSS styles to be implemented on the frontend.

正文

准备工作:去支付宝开放平台准备好以下东西


 // 沙箱应用私钥(private key)
    private String shaxiang_app_private_Key = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDX0zMqoLHjndDPohURqt/xbQasYcFgJaSyb/kE54eUK0CeDnf3UyYKzESrgCsw2lg6UKnOVMCgjRQvmu+wUJVvtxy9Sne9fro9K2fHH8tqSevGHTDeSOdZRDrk4JBQIAJ01qoTMVJtivyWXngFMrAGz+eTegWeCKzIIKUea55ebzR6ltYL1OCAxBOxowvVKUkczljFt9wNQ3D3usG5HdKIlrDCyUIjfAf/LhNAnicOlu0XrhJST6phOZI4zzlty8NSsBC9/x8eSMevLkOCJFc78eSGJLCLX7BGT6nCXvkOSoe/70jaha5v05TJa0nRRc9/j3v/DHi06690CUTrwSPZAgMBAAECggEBAMwXZm1LJK1QEaQna7EXW0ochZEBqDHZpxMuG9ftciJFfId6uytgr7rKS626OB2sfH44xTrenoG0p4AVDdA3g/juufiusOi7LDaoEy0T/fH3EUR5Wjr5yfx6Lw885HtAqdH/JTmdDIuWQSGZF//BU5Pe7pvxnBh1a3s31iRovZvjIaCo5B1p9gIhU0lVXwHOI0QSBuiNqqZQ8ny2MXRldgOCAs9JWSFoPVEH7J4rhqqukOC4FMXg4jMkncSKFoZ71C2+Gqop7ipRxqcocdBXnlR34LX1G55OcUJTuuIBCJ/fCPgECgYEA7bPigHafk/hI11XFO1R682AE/oFV2138Kn6vT90XmJ4FrCY5LbHy5bCrn7sXVDcFIXim9cNLnbQ8HIqSE8YTMDjm5PVZnp7Fsj7bX4yOUpPuXPftXKaMJ/RYcRc4xz/4kAWurfonEgBqGFH95o3J/yDnTNe5luqP0jtsb/JB6HkCgYEA6HAy1TgXIVJ1mQ9A/R7exO/5lM6HLcwmq8CHlgLbJ6wWfjcKpuV0s1QxcqP7TxLPUxjoJKryfOhs57Da8xYYxUCOhyFNYhca8vrSxcQrjXdbIOzLRWErbPuhKy7tFLsz3MYQ5gX7ulWo7Ph1DNuuMep3FzWmUpizoPMBq9Ug/mECgYEAoVq1iyx64I/uqjWvv7l2CJUKbtTOui1PSm1aheT36oKCKTx9HdaoomBN8AypJmJ+2hyzgSqDvtak417xD/kp91b47TzbDACNBJUEhxS7W7TNXlBx0K3BgDGug34W7bIwAVvKGpEvSln7quylZIalMslcGV5qvdYVsMjjsA4LzUkCgYEA35fGnmsVfP14mGMfDh7bBrEd8jJ1wO1oqcFL7FcVAGW/QWyrN370sukjo/bwcdFTVMlZzqQPHW7sDDiJdltkOqNuN7kmWlyFlQUJKisaBjyxkcuXgkcF4hFwqTy73TxzmEWDzfIlg8qQ9FvRJSxRtjyokNAQDdZMvV/l1Kjx0yECgYARUHHCBysvQLmPQQ3vNOxDtWbieWozaA6j1CWDn/JTU1Hj3hsR+ySFjwvBNh7xUJ2fGoYuEh0GVq0lVIAGFRSkVRG2vGF00ZjLRkwHpkCfJhaVlaRMxC3R1lksFSnY6I0x7fEj5ccztXbA8uL+f2ajwDkPskAk2pz1HgG7bwBm6w==";

    // 沙箱应用公钥(public key)
    private String shaxiang_app_public_Key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA19MzKqCx453Qz6IVEarf8W0GrGHBYCWksm//Laknrxh0w3kjnWUQ65OCQUCACdNaqEzFSbYr8ll54BTKwBs/nk3oFngisyCClHmueXm80epbWC9TggMQTsaML1SlJHM5YxbfcDUNw97rBuR3SiJawwslCI3wH/y4TQJ4nDpbtF64SUk+qYTmSOM85bcvDUrAQvf8fHkjHry5DgiRXO/HkhiSwi1+wRk+pwl75DkqHv+9I2oWub9OUyWtJ0UXPf497/wx4tOuvdAlE68Ej2QIDAQAB";

    // 沙箱支付宝公钥
    private String shaxiang_alipay_public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNGvU4bQrIGPHWNQBXZgxWDiPcrbA66Lm3jhBvKR9tdICrDVYO1Me04cQkwmiQBLfohGTzQ3b9Vb220vhDSPvyXpWz+e/jowwWXXpx0TYmJkjzgLYNpXME8x6wtIj42pMMBhOa3TtmU9bCtaWeRtkUCmJtMbMhtbVWyAGEEAe52rUx0lb73opQyJWkf1K03mRAPAsThnR9vsR3yMs8xOgSsdv/yxOsa3XywuGQ3tydqsDDXA3KgBE7/8AknzeFHRTkJChe9kLyqHpiY2LdYCC9H9YYQ8wnmBwHTRuuoqk7porX7KtIB8M6byVoKc/jGVklTKyYLISnXl4slo052lDQIDAQAB";

    // 沙箱APPID
    private String shaxiang_app_id = "2021000118636593";

    // 沙箱应用名称
    private String shaxiang_app_name = "sandbox应用:2088621956695242";

    // 沙箱绑定的商家账号(PID)
    private String shaxiang_app_pid = "2088621956695242";

    // 沙箱URL
    private String shaxiang_url = "https://openapi.alipaydev.com/gateway.do";

    // 沙箱回调URL{同步}
    private String shaxiang_return_url = "http://localhost:10086/api/Alipay/alipayCallBackURl";

    // 沙箱字符集
    private String shaxiang_char_set = "UTF-8";

    // 沙箱验签方式
    private String shaxiang_sign_type = "RSA2";

注册AlipayClient到Spring容器

 /**
     * Description:  沙箱测试支付宝接口
     *
     * @author: GuoTong
     * @date: 2022-12-22 21:21:04
     * @return:com.alipay.api.AlipayClient
     */
    @Bean
    public AlipayClient getAlipayClientShaXiang() {

        AlipayConfig alipayConfig = new AlipayConfig();
        // 支付宝网关(固定)https://openapi.alipay.com/gateway.do
        alipayConfig.setServerUrl(shaxiang_url);
        // APPID 即创建应用后生成
        alipayConfig.setAppId(shaxiang_app_id);
        // 开发者私钥,由开发者自己生成。
        alipayConfig.setPrivateKey(shaxiang_app_private_Key);
        // 参数返回格式,只支持 JSON(固定)。
        alipayConfig.setFormat("json");
        // 编码集,支持 GBK/UTF-8
        alipayConfig.setCharset(shaxiang_char_set);
        // 支付宝公钥,由支付宝生成。
        alipayConfig.setAlipayPublicKey(shaxiang_alipay_public_key);
        // 生成签名字符串所使用的签名算法类型,目前支持 RSA2。
        alipayConfig.setSignType(shaxiang_sign_type);
        //构造client
        try {
            return new DefaultAlipayClient(alipayConfig);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return null;
    }

支付生成页面


 @RequestMapping(value = "/getAlipayPage", method = RequestMethod.GET)
    @ApiOperation("获取支付页面")
    public void getPayPage(HttpServletResponse resp, HttpServletRequest req) {
        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
        // 支付宝异步通知路径,付款完毕后会异步调用本项目的方法,必须为公网地址
        request.setNotifyUrl("");
        // 支付宝同步通知路径,也就是当付款完毕后跳转本项目的页面,可以不是公网地址
        request.setReturnUrl(alipayByAPPConfig.getShaxiang_return_url());
        JSONObject bizContent = new JSONObject();
        String out_trade_no = req.getParameter("out_trade_no");
        // 东八区时间搓,精确到秒级别
        long currentTime = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8"));
        // 设置商家订单号
        bizContent.put("out_trade_no", StringUtils.defaultIfEmpty(out_trade_no, String.valueOf(currentTime)));
        bizContent.put("total_amount", 200);
        bizContent.put("subject", "测试商品");
        bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");
        request.setBizContent(bizContent.toString());
        AlipayTradePagePayResponse response = null;
        try {
            response = alipayClient.pageExecute(request);
            resp.setHeader("Content-Type", "text/html;charset=utf-8");
            PrintWriter out = resp.getWriter();
            String body = response.getBody();
            out.print(body);
        } catch (AlipayApiException | IOException e) {
            e.printStackTrace();
        }
        assert response != null;
        if (response.isSuccess()) {
            log.info("调用成功");
        } else {
            log.error("调用失败==>{}", response);
        }
    }

支付成功回调地址

 @RequestMapping(value = "/alipayCallBackURl", method = RequestMethod.GET)
    @ApiOperation("支付完成回调地址")
    public ModelAndView alipayCallBackURl(HttpServletRequest req) throws UnsupportedEncodingException, AlipayApiException {
        Map<String, String[]> requestParams = req.getParameterMap();
        // 获取支付宝GET过来反馈信息
        Map<String, String> params = new HashMap<>();
        for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
            String name = iter.next();
            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] + ",";
            }
            // 乱码解决,这段代码在出现乱码时使用
            valueStr = new String(valueStr.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
            params.put(name, valueStr);
        }
        log.info("支付宝回调参数。。。。。。{}", params);
        //验证签名(支付宝公钥)
        boolean signVerified = AlipaySignature.rsaCheckV1(params,
                alipayByAPPConfig.getShaxiang_alipay_public_key(),
                alipayByAPPConfig.getShaxiang_char_set(),
                alipayByAPPConfig.getShaxiang_sign_type()); // 调用SDK验证签名
        ModelAndView modelAndView = new ModelAndView("/Alipay");
        //验证签名通过
        if (signVerified) {
            // 商户订单号
            String out_trade_no = new String(req.getParameter("out_trade_no").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
            // 支付宝交易流水号
            String trade_no = new String(req.getParameter("trade_no").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
            // 付款金额
            float money = Float.parseFloat(new String(req.getParameter("total_amount").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8));
            modelAndView.addObject("tradeNo", trade_no);
            modelAndView.addObject("tradeStatus", "回调成功");
            modelAndView.addObject("totalAmount", money);
            modelAndView.addObject("outTradeNo", out_trade_no);
            return modelAndView;
        } else {
            modelAndView.addObject("tradeNo", "验证签名未通过");
            modelAndView.addObject("tradeStatus", "验证签名未通过");
            modelAndView.addObject("totalAmount", "验证签名未通过");
            modelAndView.addObject("outTradeNo", "验证签名未通过");
        }
        return modelAndView;
    }

根据商户订单号查询支付结果


    /**
     * Description: 商家订单号查看订单
     *
     * @param out_trade_no
     * @author: GuoTong
     * @date: 2022-12-22 20:43:42
     * @return:org.springframework.web.servlet.ModelAndView
     */
    @RequestMapping(value = "/queryInfobyOutTradeNo", method = RequestMethod.GET)
    @ApiOperation("商家订单号查看订单")
    public ModelAndView queryAlipayInfo(@RequestParam("out_trade_no") String out_trade_no) {

        AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
        JSONObject bizContent = new JSONObject();
        bizContent.put("out_trade_no", out_trade_no);
        request.setBizContent(bizContent.toString());
        AlipayTradeQueryResponse response = null;
        ModelAndView modelAndView = new ModelAndView("/Alipay");
        try {
            response = alipayClient.execute(request);
            // 支付宝交易号
            String tradeNo = response.getTradeNo();
            // 交易状态:WAIT_BUYER_PAY(交易创建,等待买家付款)、TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款)、TRADE_SUCCESS(交易支付成功)、TRADE_FINISHED(交易结束,不可退款)
            String tradeStatus = response.getTradeStatus();
            //交易的订单金额
            String totalAmount = response.getTotalAmount();
            // 商家订单号
            String outTradeNo = response.getOutTradeNo();
            modelAndView.addObject("tradeNo", tradeNo);
            modelAndView.addObject("tradeStatus", tradeStatus);
            modelAndView.addObject("totalAmount", totalAmount);
            modelAndView.addObject("outTradeNo", outTradeNo);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        assert response != null;
        if (response.isSuccess()) {
            System.out.println("调用成功");
        } else {
            System.out.println("调用失败");
        }
        return modelAndView;
    }

本地展示界面


<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <script th:src="@{/bootstrap-3.4.1-dist/js/bootstrap.js}"></script>
    <link rel="stylesheet" th:href="@{/bootstrap-3.4.1-dist/css/bootstrap.css}" crossorigin="anonymous">
    <meta charset="UTF-8">
    <title>支付宝</title>
</head>
<body>
<div>
    <table class="table table-hover">
        <tr>
            <td class="active">支付宝交易号</td>
            <td class="success">交易状态</td>
            <td class="warning">交易的订单金额</td>
            <td class="danger">商家订单号</td>
        </tr>
        <tr>
            <td class="active" th:text="${tradeNo}">支付宝交易号</td>
            <td class="success" th:text="${tradeStatus}">交易状态</td>
            <td class="warning" th:text="${totalAmount}">交易的订单金额</td>
            <td class="danger" th:text="${outTradeNo}">商家订单号</td>
        </tr>
    </table>
    <div class="progress-bar progress-bar-success progress-bar-striped" role="progressbar" aria-valuenow="100"
         aria-valuemin="0" aria-valuemax="100" style="width: 100%">
        <span class="sr-only">100% Complete (success)</span>
    </div>
    <h1 align="center">支付反馈结果</h1>
</div>
</body>
</html>

其他操作请参考官方文档操作。。。

与支付宝接入技术相似的内容:

支付宝接入技术

准备工作:去支付宝开放平台准备好以下东西 // 沙箱应用私钥(private key) private String shaxiang_app_private_Key = "MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDX0zMqoLHjndD

接入HMS Core应用内支付服务过程中一些常见问题总结

华为HMS Core应用内支付服务(In-App Purchases,IAP)为应用提供便捷的应用内支付体验和简便的接入流程。该服务支持客户端和服务端两种开发形式,具体可以参考官方文档。 往期文章:常见问题总结(2)中分享总结了有关无法拉起支付页面的常见问题,本文将对近期开发者们较为关注的一些集成应

京东小程序接入ARVR的技术方案和性能调优

京东小程序是一个开放技术平台,正在被越来越多的头部品牌选择,用于站内私域流量的营销和运营。诸如各种日化、奢侈品等品牌对ARVR有较多的诉求,希望京东小程序引擎提供一些底层能力,叠加品牌自主的个性化开发和定制,以支持更加丰富的场景和玩法,比如AR试妆、试戴等。

鲸鸿动能流量变现服务中国大陆地区测试流程

一、鲸鸿动能流量变现服务前置说明 1.接入鲸鸿动能平台的应用需在应用市场上架。 2.与华为联运的游戏应用和快游戏禁止接入鲸鸿动能以外的其他广告内容/插件/SDK等。 3.中国大陆地区仅支持企业认证用户使用流量变现服务。 4.支持的设备限制: 5.媒体接入流程: 二、媒体服务平台 数据管理 【首页】或

楠姐技术漫话:接着唠唠社区发现

halo,大家好很开心又和大家见面了在第一篇 楠姐技术漫画:图计算的那些事 发布之后,楠姐收到了很多建议、鼓励和支持,非常感谢大家的喜欢,所以楠姐尽自己所能马不停蹄开始第二篇的创作,虽迟但到~

万物皆可集成系列:低代码对接Web Service接口

我们知道活字格支持不写代码实现双向API绑定,那么没那么主流的Web Service接口(SOAP协议+XML交互格式)呢?其实对接的思路没有那么复杂,得用C#编码来对接的。 作为一款企业级低代码开发平台,活字格可以和许多第三方软硬件进行集成,灵活、高效使它不可忽视的优势。在之前的内容中我们已经介绍

为什么现代的低代码开发平台都不支持导出源代码?

> 摘要:本文由葡萄城技术团队于博客园原创并首发。葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 初次接触低代码的程序员大多会纠结一个问题,为什么功能越强大的低代码开发平台越不会提供导出源代码的功能? 要想回答这个问题,我们得回顾一下低代码开发的发展史。事实上,支持导出[源代码](h

跑步课程导入能力,助力科学训练

HUAWEI Health Kit为开发者提供用户自定义的跑步课程导入接口,便于用户在华为运动健康App和华为智能穿戴设备上查看来自生态应用的训练课表,开启科学、适度的运动训练。 跑步课程导入能力支持生态应用在获取用户的华为帐号授权后,将跑步课程数据写入至华为运动健康App,并在已有的华为智能穿戴设

02.前后端分离中台框架前端 admin.ui.plus 学习-介绍与简单使用

## 中台框架前台项目 admin.ui.plus 的初识 > 基于 vue3.x + CompositionAPI setup 语法糖 + typescript + vite + element plus + vue-router-next + pinia 技术,内置支持一键生成微服务接口,适配手

.NET开源最全的第三方登录整合库 - CollectiveOAuth

前言 我相信很多同学都对接过各种各样的第三方平台的登录授权获取用户信息(如:微信登录、支付宝登录、GitHub登录等等)。今天给大家推荐一个.NET开源最全的第三方登录整合库:CollectiveOAuth。 官方项目介绍 .Net平台(C#) 史上最全的整合第三方登录的开源库 => 环境支持 .N