解决了昨天苦恼的前端页面跳转SpringMVC报路径错误的问题,原来是我的web.xml当中啥也没写,没有Spring的核心自然是没有办法走后台了,愚蠢的我还找了半天,简直了。
上午完成项目对接支付宝接口的测试(maven架构)后又和组内成员讨论了下所做项目的数据库设计。花了一下午完成了腾讯云计算机上的tomcat+jdk1.8的部署,耗费成本:24元,一元腾讯云计算机可用时常30天(首次购买+活动),23元购买域名,可用时长1年。
经过早上的错误发现自己对于Spring框架的架构步骤还是有所疏忽,回想一下在servlet中从前端jsp跳转后端其中必定经过web,xml中的"
通常我们在网上商城购买商品后,若选择支付宝支付,在点击提交订单后会跳转到像下面的二维码界面,扫码支付成功后,我们会跳转到支付宝提示支付成功的见面,一般等待五秒后再自动跳转商城界面。在此总结下如何从订单界面点击提交后,前端页面跳转支付宝。话不多说,上代码。
<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
@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("\n" +
"\t\n" +
"\t\t\n" +
"\t\t \n" +
"\t\n" +
"\t"+result+"\n" +
"");
//刷新页面
response.getWriter().flush();
} catch (AlipayApiException e) {
e.printStackTrace();
} finally {
try {
response.getWriter().close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
@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
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 + "
商户订单号"+ out_trade_no + "
付款金额:" + 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开始学?这也太难顶了!饿得半死,先去吃饭,一会回宿舍再想吧