当前位置:网站首页>支付宝支付接口沙箱环境测试以及整合到一个ssm电商项目中
支付宝支付接口沙箱环境测试以及整合到一个ssm电商项目中
2022-06-25 22:08:00 【程の编程日记】
准备工作
- 官方demo
- 支付宝账号
- eclipse/idea
- tomcat
具体步骤
- 先下载官方给的demo
https://docs.open.alipay.com/270/106291/ - 导入到eclipse中
注意:因为此demo不是maven项目所以得配置本地的tomcat
- 到支付宝开放平台注册开发者账号,进入沙箱

- 进入沙箱会看到给的一个appid和测试用的支付宝网关,这个用于配置我们的工程的配置文件,后面会用到
- 生成应用密钥和应用公钥

根据说明的步骤下载支付宝开放平台开发助手,生成应用密钥和应用公钥即可
并且在沙箱环境中进行配置应用公钥
配置完之后会有一个支付宝公钥,这个也需要配置到配置文件中的 - 关于demo
有一堆jsp文件和一个config类,其实jsp文件中也是写的java代码
config类:需要配置的参数
app_id: 就是你的沙箱中的appid,如果申请到正式的了也会有一个appid
merchant_private_key: 应用私钥,就是刚刚生成的应用私钥
alipay_public_key: 支付宝公钥,这个就是刚刚配置在沙箱中的应用公钥配置后生成的支付宝公钥,注意这里不是配置应用公钥!
notify_url:这个是支付宝服务器异步通知页面路径,具体如何处理的代码在notify_url.jsp中
return_url:这个是支付宝服务器同步通知页面的路径,支付完成后会提示跳转到商户页面也就是此页面,具体代码可以看demo中的return_url.jsp
gatewayUrl:这个很重要,是支付宝网关,因为我们是沙箱环境所以一定要配置测试用的网关 - 运行测试
运行index.jsp
点击付款,就会成功跳转到扫码页面(如果提示钓鱼网站,建议换浏览器或者把此浏览器关于支付宝的页面都关闭再付款)
如何付款?
此时注意沙箱中提供了测试账号,可以下载沙箱版支付宝app登录测试账号进行支付,也可以,点击右侧的登录账户付款进行支付
沙箱账号:
付款之后
也是跳转到了同步通知页面
基本流程也是这样。
整合到ssm项目中
大体思路:在项目中有一个购物车结算页面,点击提交订单,controller中处理,查看此订单的付款方式,如果是在线支付就跳转到另一个controller中,这个controller也就是demo中的处理支付跳转的jsp中的代码,还要配置一个return_url用来同步页面通知,这个配置同样也是一个controller来处理跳转到一个success.jsp支付成功的页面,这个controller除了跳转到支付成功页面还可以在里面处理订单状态改为已支付一类的业务逻辑
首先是点击提交订单,需要创建一个订单,然后判断订单状态,是货到付款还是在线支付
@RequestMapping("/create")
public String orderCreate(Order order, Model model,HttpServletRequest request){
try {
System.out.println("支付方式为:"+order.getPaymentType());
//获取用户信息,因为order下都是拦截器拦截过的,拦截器把用户信息存入了请求中
TbUser user = (TbUser) request.getAttribute("user");
//设置用户信息,提交订单之前补全用户信息
order.setBuyerNick(user.getUsername());
order.setUserId(user.getId());
String orderId = orderService.createOrder(order);
//创建完订单之后,如果订单的支付方式为4,代表在线支付,我们要将其跳转到在线支付页面
if(order.getPaymentType() == 4){
return "redirect:/order/goAliPay/"+orderId+".html";
}
model.addAttribute("paymentType",order.getPaymentType());
model.addAttribute("orderId",orderId);
model.addAttribute("payment",order.getPayment());
model.addAttribute("date",new DateTime().plusDays(3).toString("yyyy-MM-dd"));
return "success";
} catch (Exception e) {
e.printStackTrace();
model.addAttribute("message","出现了一点问题...");
return "/error/exception";
}
}
在线支付,跳转到另一个controller,注意这里有一个编码设置,如果不设置为UTF-8的话会出现验签失败,而且界面的css样式消失的问题。
@RequestMapping(value = "/goAliPay/{orderId}",produces = "text/html; charset=UTF-8")
@ResponseBody
public String goAlipay(@PathVariable String orderId, HttpServletRequest request, HttpServletRequest response) throws Exception {
//根据orderId获取订单信息
Order order = orderService.getOrderByOrderId(orderId);
//获得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
//设置请求参数
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(AlipayConfig.return_url);
alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
//商户订单号,商户网站订单系统中唯一订单号,必填
String out_trade_no = orderId;
//付款金额,必填
String total_amount = order.getPayment();
//订单名称,必填
String subject = order.getOrderItems().get(0).getTitle();
//商品描述,可空
String body = order.getOrderItems().get(0).getTitle();
// 该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。 该参数数值不接受小数点, 如 1.5h,可转换为 90m。
String timeout_express = "1c";
alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
+ "\"total_amount\":\""+ total_amount +"\","
+ "\"subject\":\""+ subject +"\","
+ "\"body\":\""+ body +"\","
+ "\"timeout_express\":\""+ timeout_express +"\","
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
//请求
String result = alipayClient.pageExecute(alipayRequest).getBody();
return result;
}
支付成功同步通知页面controller
@RequestMapping("/paySuccess")
public String paySuccess(HttpServletRequest request, HttpServletResponse response,Model model) throws Exception {
//获取支付宝GET过来反馈信息
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 = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type); //调用SDK验证签名
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");
Order order = orderService.getOrderByOrderId(out_trade_no);
order.setStatus(2);
//修改订单状态
Integer integer = orderService.changeStatus(order);
//返回正常修改成功
if (integer == 200){
//还要额外加订单支付方式
model.addAttribute("paymentType",order.getPaymentType());
model.addAttribute("orderId",order.getOrderId());
model.addAttribute("payment",order.getPayment());
model.addAttribute("date",new DateTime().plusDays(3).toString("yyyy-MM-dd"));
return "success";
}else{
return "/error/exception";
}
}else {
System.out.println("验签失败");
}
return "/error/exception";
}
这个也是复制的demo中的代码稍作修改即可
整体整合流程就这样,整合的关键是分析一下demo中的alipay.trade.page.pay.jsp和return_url.jsp和notify_url.jsp,里面都有很详细的说明!
支付接口与项目整合到此结束了
边栏推荐
- Apache Doris1.0版本集群搭建、负载均衡与参数调优
- Qtcreator formatting code
- mysql
- STL教程5-STL基本概念及String和vector使用
- 为什么Integer的比较最好使用equals
- 51 single chip microcomputer, some registers, some knowledge points
- 格式化编号,不够位数的补0,例如1:0001,25:0025
- oracle写一个先插入一条数据,在将该数据中一个字段更新的触发器的坑
- Can I upload pictures without deploying the server?
- debezium
猜你喜欢

实例:用C#.NET手把手教你做微信公众号开发(21)--使用微信支付线上收款:H5方式

社招两年半10个公司28轮面试面经(含字节、拼多多、美团、滴滴......)

期末复习【机器学习】

Summary of common JDBC exceptions and error solutions

CSDN添加页内跳转和页外指定段落跳转

QT custom implemented calendar control

解析產品開發失敗的5個根本原因

CSDN add on page Jump and off page specified paragraph jump

二进制、16进制、大端小端

Bi-sql stored procedure (I)
随机推荐
数据同步
Record the ideas and precautions for QT to output a small number of pictures to mp4
对伪类的理解
谈一谈PHP变量或参数的Copy On Write机制
php进程间传递文件描述符
line-height小用
格式化编号,不够位数的补0,例如1:0001,25:0025
Run the dronekit flight control application on Shumei faction under px4-jmavsim software simulation environment
CSDN add on page Jump and off page specified paragraph jump
When are the three tools used for interface testing?
Analysis on the control condition and mode of go cooperation overtime exit
如何设计产品的roadmap?
为什么Integer的比较最好使用equals
Ad20 learning notes II
Px4 multi computer simulation (gazebo)
Stream in PHP socket communication_ Understanding of select method
Doris 运维中遇到的问题
C# IO Stream 流(一)基础概念_基本定义
Download the latest V80 version of Google Chrome
Uniapp - call payment function: Alipay