2020年1月10日个人学习小结------maven架构web项目中页面调用支付宝

今日学习总览

在这里插入图片描述解决了昨天苦恼的前端页面跳转SpringMVC报路径错误的问题,原来是我的web.xml当中啥也没写,没有Spring的核心自然是没有办法走后台了,愚蠢的我还找了半天,简直了。
上午完成项目对接支付宝接口的测试(maven架构)后又和组内成员讨论了下所做项目的数据库设计。花了一下午完成了腾讯云计算机上的tomcat+jdk1.8的部署,耗费成本:24元,一元腾讯云计算机可用时常30天(首次购买+活动),23元购买域名,可用时长1年。

低级错误反省(web.xml中的配置)

经过早上的错误发现自己对于Spring框架的架构步骤还是有所疏忽,回想一下在servlet中从前端jsp跳转后端其中必定经过web,xml中的"<servlet>“标签和”<servlet-mapping>"标签,在maven整合Spring以及SpringMVC项目过程中前后端的流程还是不变的,只不过许多调用的步骤在Spring中利用控制反转和属性注入替我们完成了,既然想要Spring框架替我们打工,它的核心我们肯定是需要配置的,昨天我居然找了半天还没找到,现状回想起来简直惨不忍睹。

maven架构web项目中页面调用支付宝

使用Alipay项目的方法生成订单跳转二维码支付

通常我们在网上商城购买商品后,若选择支付宝支付,在点击提交订单后会跳转到像下面的二维码界面,扫码支付成功后,我们会跳转到支付宝提示支付成功的见面,一般等待五秒后再自动跳转商城界面。在此总结下如何从订单界面点击提交后,前端页面跳转支付宝。话不多说,上代码。

前端提交数据方式

<script type="text/javascript">
        $(function () {
            $("input[type=button]").click(function () {
               window.location.href="pay/payForGoods?name="+$("input[name='name']").val()+"&phoneNumber="+$("input[name='phoneNumber']").val()+"&price="+100;
            })
        })
 </script>

注意:此处提交后台数据不要用ajax,因为返回的值是一个表单并且自动跳转,不可以使用ajax中的回调函数接收返回值,否则页面不会跳转!

后台接受收数据的实体类

其中APPID和商户私钥、支付宝公钥的获取请见 支付宝沙箱环境的使用

package com.kgc.exam.entity;

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

    // 商户应用私钥,您的PKCS8格式RSA2私钥
    public static String merchant_private_key = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAEAAoIBAQCDpRpOiNkVRP2KLprtfQ37NvaI36fMtuOvqMJxE/9byFINxHkDDIh4zh2fbftVUoXDFjScK7B4sShcM6pjJqz5twcOQSrt8K+NL0+Do8fS8teJcZqcZou4PtTK+uftx3hsTsrdzofz03h+UgCz+drewtTJ5xUCZZZ1Z5Dxaa55ADml+aWZweyGWgXK1V3JL5gkD8CrKikCoRGbv1QgWkmg9b3o2/9zGR0We+SAbFyoGVF+taltJVWb8HquV8n5QDHfR7t1wBMX2UxhebH/m4tP5CExVDaBhbpWSvjz6m0zqGvg7fLKKzTX/GJhxrGQ5HcORXSkLloWxX0SorXGLvv1AgMBAAECggEAFaG+peME0OLqSpeH67hd4MbSUgF2YEQ5O7ceZFhl4J4VJaAARoj7r+Ympfj7kLSjuD/g2zyundZ2jFgNCofjapExvpzkwf6HykpY5Ye3ISm4UyRwxHxxPxBMBSKfk8nwNtPnr/TtEBrStOciqHBJD8uyDY9EO4WX6Kjg/1pfShCLfsvVp5o7PimDCJxotXpfOZRWkShbf/lveJHjAut97tUghH5sel3LD3w6FFZRoCfftTNMh6BxuMEh4R8oe0OzRXFvkAFavfvMLW5mi7X5zjSwQws3fIHgKb5rQPyCXskKWBSqobceaUpDxJxY0zaLWJ87KKGRbXSZkRdsmcPKbQKBgQDS4njn8WgwVVaQ0LYWwOUqsS6H6YaaV/biFPxOYe5soycL1ZxfNwilnN6kgcoPQxEMaHi5NcY2yvuXz77bQnj14VBD0ESOV4kFGF7mvoo2ZHZjAKrRUAu+i5/O64Atyc/h0NLGqJCiVud+APJ3mo2iqyThIARBeleUyL5LjAGkbwKBgQCfzufUOwat/YFrdyDWvIcTqc2nZyopgllfzp2ptBekjJSKhxcwxeM38ydBpTHKZmYyL7itfX/YltZxbH2/Lw9Yfb9v0KFqwq2OQ1ykjQGzhxNZ1NG/V8/hIOxSuIXu/Gny/UdMyOqoLKzXSGmZUmxCNaldfGXDJn7/thoxw7A/2wKBgDFypxUD1wFWUUj9l2S4cEPVbeqyiDxSmfIjJ5IdhnF0xCgTO2pcFiv3H4GFaWKwwCOfr4cGI+cfK2VKch8pdAF7hn2QLTMPNXK7Zy1FylS8s8G9G1CfK1HPnXZAZDrYUmVJuNKaHefi5r716+S9ma5l4Ozku/q6fCTH+U7vkkcDAoGAdkgTSP9DS2Z18w+ia63woHou8Deoej6zXfk0stXMJguzKfEhFgVxzwiWxry5ZKB0BbNSkn5wMOQ75omxbN8tEYdJOT6HKtja0pBDMrv3RWS1yuh9Mo2RHIVcxUE0SJXk6WfT7R5MqJsgdttu5X+fB0Zmi/4158JHf4bOToUTn78CgYEAp04OcMC4Y7OUPRTbUuGMB86/zzyeUDS31Jf6PzYxqTSGDnmfSqS5AV/LSabr18XIpDcToBu1592booLvczvRk2TfVwqMnxTsAhf/P/UEEascOzno8NVSaOzPO0ItF/staOV1aIE7rQ9pbFWREKIGn7dh+xTfOOitihTsW7nJI9s=";

    // 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm
    // 对应APPID下的支付宝公钥。
    public static String alipay_public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw9BZowTY8zanLI4Qn+SwTh34SdC/qD6epUxp36P4ceB5hW5B17NmfsniuM4NCLUEdjjzCE3e+FxEOE9q7i15xY49TKK1vKcnZFEA+Z+jf6bXKeodAqFc/0nEb9BRM6OsYEvmLQFLnm30A9WH3FpOmf84Uq+ViWdKPRejtPxDioWXmNJL9QUiqzPRYmWdHbsQVwBpxfPKtJBxTtCCx0Ax4tfkYXytxorBnCwxFBFVWjya2dIfxYfN16DVDvwuWvd0uRuwxyCpnVGTCr5e3vG6JtTwViscfvB3On++p9rkGipuxsxpwebRIi4UPgrdVHpTm5ei9t7J1m0IVp01sECsQIDAQAB";

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

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

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

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

    // 支付宝网关
    public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
}

后台接受收数据的controller层

@Controller
@RequestMapping("pay")
public class PayController {

    @RequestMapping("payForGoods")
    public void payForGoods(@RequestParam(value = "name",defaultValue = "无名氏") String name,@RequestParam(value = "phoneNumber",defaultValue = "12357846662") String phoneNumber, String price, HttpServletRequest request, HttpServletResponse response) throws IOException{
        AlipayClient alipayClient = new DefaultAlipayClient(
                AlipayAttr.gatewayUrl, AlipayAttr.app_id,
                AlipayAttr.merchant_private_key, "json", AlipayAttr.charset,
                AlipayAttr.alipay_public_key, AlipayAttr.sign_type);
        // 创建唯一订单号
        int random = (int) (Math.random() * 10000);
        String dateStr = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());

        // 订单号拼接规则:手机号后四位+当前时间后四位+随机数四位数
        String out_trade_no = phoneNumber.substring(7) + dateStr.substring(10)
                + random;
        // 拼接订单名称
		String subject = name + "的订单";
        // 总价格设置
        // 设置请求参数
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        alipayRequest.setReturnUrl(AlipayAttr.return_url);//支付成功响应后跳转地址
        alipayRequest.setNotifyUrl(AlipayAttr.notify_url);//异步请求地址
        /*FAST_INSTANT_TRADE_PAY 二维码瞬时支付
         * out_trade_no 订单号 total_amount 订单金额  subject 订单名称
         */
        alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no
                + "\"," + "\"total_amount\":\"" + price + "\","
                + "\"subject\":\"" + subject + "\"," + "\"body\":\""
                + ""+ "\"," + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
        String result = "请求无响应";
        try {
            //通过阿里客户端,发送支付页面请求
            result = alipayClient.pageExecute(alipayRequest).getBody();
            /*
             * 在此处使用response.getWriter().println()打印一个界面,
             * result是个字符串,其中的值是我们提交给支付宝的订单信息加上一
             * 段提交请求的js。订单信息以form表单的形式存储,js将表单提交
             */
            response.getWriter().println("<html>\n" +
                    "\t<head>\n" +
                    "\t\t<meta charset=\"utf-8\">\n" +
                    "\t\t<title></title>\n" +
                    "\t</head>\n" +
                    "\t<body>"+result+"</body>\n" +
                    "</html>");
            //刷新页面
            response.getWriter().flush();
        } catch (AlipayApiException e) {
            e.printStackTrace();
        } finally {
            try {
                response.getWriter().close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

获取支付宝返回信息的controller层

@Controller
public class NotifyController {

    @RequestMapping("notify")
    public void NotifyUrl(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // 获取支付宝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);
        }

        boolean signVerified = false;
        try {
            signVerified = AlipaySignature.rsaCheckV1(params,
                    AlipayAttr.alipay_public_key, AlipayAttr.charset,
                    AlipayAttr.sign_type);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        } // 调用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");

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

        } else {// 验证失败
            response.getWriter().println("验签/支付失败!");
            response.getWriter().flush();
            response.getWriter().close();

            // 调试用,写文本函数记录程序运行情况是否正常
            // String sWord = AlipaySignature.getSignCheckContentV1(params);
            // AlipayConfig.logResult(sWord);
        }
    }
}

支付成功后得到controller层(实现跳转回商户页面)

@Controller
public class AlipayReturnController {

    @RequestMapping("alipayReturn")
    public void AlipayReturn(HttpServletRequest request, HttpServletResponse response) throws IOException {
        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);
        }
        boolean signVerified = false;
        try {// 调用SDK验证签名
            signVerified = AlipaySignature.rsaCheckV1(params, AlipayAttr.alipay_public_key, AlipayAttr.charset,AlipayAttr.sign_type);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        // 请在这里编写您的程序(以下代码仅作参考)
        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");
            String msg = "支付宝交易号:" + trade_no + "<br/>商户订单号"+ out_trade_no + "<br/>付款金额:" + total_amount;
            System.out.println(msg);
            request.setAttribute("msg", msg);
            try {
                request.getRequestDispatcher("success.jsp").forward(request, response);
            } catch (ServletException e) {
                e.printStackTrace();
            }
        } else {
            response.getWriter().println("验签/支付失败");
            response.getWriter().flush();
            response.getWriter().close();
        }
    }
}

安排

目前七点半,今天还没碰realsence sr300实感摄像机,慌乱,毕设题目昨晚又接着找资料,不怎么找得到学习的方向,点云学习的基础从哪开始入手感觉挺迷茫的,难不成要从openCV开始学?这也太难顶了!饿得半死,先去吃饭,一会回宿舍再想吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值