对接支付宝支付接口

这些是对接支付宝必要的一些参数  

// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
        public static String app_id = "";

        // 商户私钥,您的PKCS8格式RSA2私钥
        public static String merchant_private_key = “”;

        // 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
        public static String alipay_public_key = “”;

        // 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
        public static String notify_url = "http://localhoast:8080/returnUrl";

        // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
        public static String return_url = "http://localhost:8080/returnUrl";

        // 签名方式
        public static String sign_type = "RSA2";

        // 字符编码格式
        public static String charset = "utf-8";

        //沙箱网关
        public static String gatewayUrl ="https://openapi.alipaydev.com/gateway.do";

        // 仅支持JSON
        public static String format = "JSON";

//这个是发起接口

 @ApiOperation(value = "发起支付", notes = "支付宝")
        @RequestMapping(value = "/pay", method = RequestMethod.GET)
        public void pay(HttpServletRequest httpRequest, HttpServletResponse httpResponse)
                throws ServletException, IOException {
            // 获得初始化的AlipayClient
            AlipayClient alipayClient = new DefaultAlipayClient(gatewayUrl, app_id, merchant_private_key, format, charset,
                    alipay_public_key, sign_type); 
         // 创建API对应的request
            AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
         // 在公共参数中设置回跳和通知地址
            alipayRequest.setReturnUrl(return_url);
            alipayRequest.setNotifyUrl(notify_url);
            alipayRequest.setBizContent("{" + "    \"out_trade_no\":\"2015032001010100" + (int) (Math.random() * 1000) + "\","
                    //+ (int) (Math.random() * 10)
                    + "    \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," + "    \"total_amount\":"  + 0.88 + ","
                    + "    \"subject\":\"Iphone6 16G\"," + "    \"body\":\"Iphone6 16G 耐克金\","
                    + "    \"passback_params\":\"merchantBizType%3d3C%26merchantBizNo%3d2016010101111\","
                    + "    \"extend_params\":{" + "    \"sys_service_provider_id\":\"2088511833207846\"" + "    }" + "  }");// 填充业务参数
            String form = "";
            try {
                form = alipayClient.pageExecute(alipayRequest).getBody(); // 调用SDK生成表单
            } catch (AlipayApiException e) {
                e.printStackTrace();
            }
            httpResponse.setContentType("text/html;charset=" + charset);
            httpResponse.getWriter().write(form);// 直接将完整的表单html输出到页面
            httpResponse.getWriter().flush();
            httpResponse.getWriter().close();

        }

//这个是回调接口
        @ApiOperation(value = "支付同步回调", notes = "支付宝")
        @RequestMapping(value = "/returnUrl", method = RequestMethod.GET)
        public void returnUrl(HttpServletRequest request, HttpServletResponse response)
                throws IOException, AlipayApiException {
            System.out.println("=================================同步回调=====================================");

            // 获取支付宝GET过来反馈信息
            response.setContentType("text/html;charset=utf-8");
            Map<String, String> params = new HashMap<String, String>();
            Map<String, String[]> requestParams = request.getParameterMap();
            for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
                String name = (String) iter.next();
                String[] values = (String[]) 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("ISO-8859-1"), "utf-8");
                params.put(name, valueStr);
            }

            System.out.println(params);
            boolean signVerified = AlipaySignature.rsaCheckV1(params, alipay_public_key, charset, sign_type);

            // ——请在这里编写您的程序(以下代码仅作参考)——
            if (signVerified) {
                // 商户订单号
                String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");

                // 支付宝交易号
                String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");

                // 付款金额
                String total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"), "UTF-8");

                System.out.println("商户订单号=" + out_trade_no);
                System.out.println("支付宝交易号=" + trade_no);
                System.out.println("付款金额=" + total_amount);

                response.getWriter().write(
                        "商户订单号=" + trade_no + "<br/>支付宝交易号=" + out_trade_no + "<br/>付款金额=:" + total_amount);
            } else {
                response.getWriter().write("验签失败");
            }
            response.getWriter().flush();
            response.getWriter().close();
        }
        @ApiOperation(value = "支付异步回调", notes = "支付宝")
        @RequestMapping(value = "/notifyUrl", method = RequestMethod.GET)
        public void notifyUrl(HttpServletRequest request, HttpServletResponse response)
                throws AlipayApiException, IOException {
            System.out.println("#################################异步回调######################################");

            // 获取支付宝POST过来反馈信息
            Map<String, String> params = new HashMap<String, String>();
            Map<String, String[]> requestParams = request.getParameterMap();
            for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
                String name = (String) iter.next();
                String[] values = (String[]) 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("ISO-8859-1"), "utf-8");
                params.put(name, valueStr);
            }

            System.out.println(params);
            boolean signVerified = AlipaySignature.rsaCheckV1(params, alipay_public_key, charset, sign_type); // 调用SDK验证签名

            // ——请在这里编写您的程序(以下代码仅作参考)——

            /*
             * 实际验证过程建议商户务必添加以下校验: 1、需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
             * 2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额), 3、校验通知中的seller_id(或者seller_email)
             * 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)
             * 4、验证app_id是否为该商户本身。
             */
            if (signVerified) {// 验证成功
                // 商户订单号
                String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");

                // 支付宝交易号
                String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");

                // 交易状态
                String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");

                System.out.println("商户订单号=" + out_trade_no);
                System.out.println("支付宝交易号=" + trade_no);
                System.out.println("交易状态=" + trade_status);
                if (trade_status.equals("TRADE_FINISHED")) {
                    // 判断该笔订单是否在商户网站中已经做过处理
                    // 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                    // 如果有做过处理,不执行商户的业务程序

                    // 注意:
                    // 退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
                } else if (trade_status.equals("TRADE_SUCCESS")) {
                    // 判断该笔订单是否在商户网站中已经做过处理
                    // 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                    // 如果有做过处理,不执行商户的业务程序

                    // 注意:
                    // 付款完成后,支付宝系统发送该交易状态通知
                }

                System.out.println("异步回调验证成功");
                response.getWriter().write("success");

            } else {// 验证失败
                System.out.println("异步回调验证失败");
                response.getWriter().write("fail");

                // 调试用,写文本函数记录程序运行情况是否正常
                // String sWord = AlipaySignature.getSignCheckContentV1(params);
                // AlipayConfig.logResult(sWord);
            }
            response.getWriter().flush();
            response.getWriter().close();
        }
        //这个是要退款金额的接口
        @ApiOperation(value = "退款", notes = "支付宝")
        @RequestMapping(value = "/reUrl", method = RequestMethod.GET)
        public void reUrl(HttpServletRequest request, HttpServletResponse response,String out_trade_no,String refund_amount) throws AlipayApiException, IOException{
            response.setContentType("text/html;charset=utf-8");
            PrintWriter out = response.getWriter();
            //获得初始化的AlipayClient
            AlipayClient alipayClient = new DefaultAlipayClient(gatewayUrl, app_id, merchant_private_key, format, charset,
                    alipay_public_key, sign_type);
            //设置请求参数
            AlipayTradeRefundRequest alipayRequest = new AlipayTradeRefundRequest();
            //商户订单号,必填
//            String out_trade_no = new String("订单号");
            //需要退款的金额,该金额不能大于订单金额,必填
//            String refund_amount = new String("退款金额");
            //标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传
            String out_request_no = new String(UUID.randomUUID().toString());
         
            alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
                    + "\"refund_amount\":\""+ refund_amount +"\","
                    + "\"out_request_no\":\""+ out_request_no +"\"}");
            //请求
            String result = alipayClient.execute(alipayRequest).getBody();
            //输出
            out.println(result);
        }

对接支付宝接口涉及到前后端的交互,具体步骤如下: 1. 在支付宝开放平台注册开发者账号,并创建应用获取应用的AppID、公钥、私钥等信息。 2. 后端(Spring Boot)部分: - 引入支付宝SDK,可以使用官方提供的SDK或者第三方封装的SDK。 - 在应用配置文件中配置支付宝相关参数,如AppID、公钥、私钥等。 - 编写接口用于生成支付宝订单信息,并将订单信息返回给前端。 - 编写接口用于接收支付宝异步通知,验证支付结果并处理业务逻辑。 - 编写接口用于查询订单状态等其他操作。 3. 前端(Vue)部分: - 使用支付宝提供的前端组件,如扫码支付组件、H5支付组件等。 - 在前端页面中引入支付宝提供的组件,并配置相关参数,如AppID、订单信息等。 - 编写逻辑处理用户支付成功或失败的回调方法,并提示用户支付结果。 4. 后端与前端通信: - 后端提供生成订单信息的接口,前端调用该接口获取订单信息。 - 前端将订单信息传递给支付宝前端组件,并完成支付操作。 - 支付宝将支付结果以异步通知的形式发送给后端,后端接收并验证支付结果。 - 后端处理支付结果,更新订单状态等业务逻辑。 需要注意的是,在实际操作中还需要考虑安全性、异常处理、日志记录等方面的内容,以确保支付流程的稳定和安全。同时,支付宝也提供了详细的开发文档和示例代码,可以参考官方文档进行具体操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值