当前位置:网站首页>支付宝支付接口沙箱环境测试以及整合到一个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,里面都有很详细的说明!
支付接口与项目整合到此结束了
边栏推荐
- mysql版本升级+数据迁移
- 4个要点,助力产品管好项目
- 登录拦截器
- 数据同步
- 为什么Integer的比较最好使用equals
- Record the ideas and precautions for QT to output a small number of pictures to mp4
- How to generate get/set methods in idea
- C. Yet Another Card Deck-Educational Codeforces Round 107 (Rated for Div. 2)
- When are the three tools used for interface testing?
- mysql5.7版本在配置文件my.ini[mysqld]加上skip-grant-tables后无法启动
猜你喜欢
随机推荐
util. Collection and encapsulation of JS tool functions
Uniapp - call payment function: Alipay
YUV444、YUV422、YUV420、YUV420P、YUV420SP、YV12、YU12、NV12、NV21
4个要点,助力产品管好项目
Use Baidu map API to set an overlay (infowindow) in the map to customize the window content
达梦数据库修改字段信息采坑记
谷歌浏览器(Chrome)最新v80版本下载
Leetcode 513. 找树左下角的值
Problems encountered in Doris operation and maintenance
Hibernate core api/ configuration file / L1 cache details
后序线索二叉树
Apache doris1.0 cluster setup, load balancing and parameter tuning
Summary of common JDBC exceptions and error solutions
php中使用google protobuf协议环境配置
Analyse des cinq causes profondes de l'échec du développement de produits
Px4 simulation basis
Gradle的环境安装与配置
final和static
oracle写一个先插入一条数据,在将该数据中一个字段更新的触发器的坑
请问可以不部署服务端实现图片上传吗?