支付宝回调JAVA版代码
2023-09-27 14:24:02 时间
支付宝回调:
1 //这个是支付宝回调的信息 2 @RequestMapping("alipay_callback.do") 3 @ResponseBody 4 public Object alipayCallback(HttpServletRequest request){ 5 Map<String,String> params = Maps.newHashMap(); 6 //getParameterMap()一般多用于接收前台表单多参数传输的数据 7 //支付宝的回调都是把信息放到request里面 8 Map requestParams = request.getParameterMap(); 9 //keyset()是获取所有的key值,iterator()是迭代遍历 10 for(Iterator iter = requestParams.keySet().iterator();iter.hasNext();){ 11 String name = (String)iter.next(); 12 //这里把key放到数组里面 13 String[] values = (String[]) requestParams.get(name); 14 String valueStr = ""; 15 //这个for循环的尊用就是把上面那个String中的值都遍历一遍 16 for(int i = 0 ; i <values.length;i++){ 17 //这个是三元运算符 18 valueStr = (i == values.length -1)?valueStr + values[i]:valueStr + values[i]+","; 19 } 20 //把数据全部加进map集合中 name就是key valueStr就是value 21 params.put(name,valueStr); 22 } 23 //sign就是签名 trade_status是交易的状态 24 logger.info("支付宝回调,sign:{},trade_status:{},参数:{}",params.get("sign"),params.get("trade_status"),params.toString()); 25 26 //非常重要,验证回调的正确性,是不是支付宝发的.并且呢还要避免重复通知. 27 //这个非常重要,但是不知道这个是什么意思
//这个是签名类型 sign参数已经帮我们删除掉了,在这里我们要把签名类型删除掉 28 params.remove("sign_type"); 29 try { 30 //这里是RSA验证签名 31 // Configs.getAlipayPublicKey() 其实就是支付宝的应用公钥(记住不是支付宝的公钥,是支付宝应用公钥) 32 //Configs.getSignType()也就是支付宝文本类型里面的签名类型:RSA2 33 boolean alipayRSACheckedV2 = AlipaySignature.rsaCheckV2(params, Configs.getAlipayPublicKey(),"utf-8",Configs.getSignType()); 34 //如果验证上面的boolean为true的话,我们就应该更改下订单的状态,减少下库存这些操作 35 if(!alipayRSACheckedV2){ 36 return ServerResponse.createByErrorMessage("非法请求,验证不通过,再恶意请求我就报警找网警了"); 37 } 38 } catch (AlipayApiException e) { 39 logger.error("支付宝验证回调异常",e); 40 }
//回调之后修改账单状态 ServerResponse serverResponse = iOrderService.aliCallback(params); if(serverResponse.isSuccess()){ return Const.AlipayCallback.RESPONSE_SUCCESS; } return Const.AlipayCallback.RESPONSE_FAILED; }
支付宝回调之后修改账单的状态
//这个是回调地址之后更新一些订单状态的方法 public ServerResponse aliCallback(Map<String,String> params){ //订单号 Long orderNo = Long.parseLong(params.get("out_trade_no")); //支付宝的交易号 String tradeNo = params.get("trade_no"); //支付宝的交易状态 String tradeStatus = params.get("trade_status"); //在这个方法里面查询一下,看一下这个订单号码是否存在 Order order = orderMapper.selectByOrderNo(orderNo); if(order == null){ return ServerResponse.createByErrorMessage("非快乐慕商城的订单,回调忽略"); } //在这里调用枚举类,判断订单是否已经支付 if(order.getStatus() >= Const.OrderStatusEnum.PAID.getCode()){ return ServerResponse.createBySuccess("支付宝重复调用"); } //这里调用的是支付宝官方的枚举 //“TRADE_STATUS_TRADE_SUCCESS”是交易完成的意思 if(Const.AlipayCallback.TRADE_STATUS_TRADE_SUCCESS.equals(tradeStatus)){ //记录交易的时间,这个字符串是固定的 order.setPaymentTime(DateTimeUtil.strToDate(params.get("gmt_payment"))); order.setStatus(Const.OrderStatusEnum.PAID.getCode()); orderMapper.updateByPrimaryKeySelective(order); //把订单状态改成已付款 } PayInfo payInfo = new PayInfo(); payInfo.setUserId(order.getUserId()); payInfo.setOrderNo(order.getOrderNo()); payInfo.setPayPlatform(Const.PayPlatformEnum.ALIPAY.getCode()); payInfo.setPlatformNumber(tradeNo); payInfo.setPlatformStatus(tradeStatus); payInfoMapper.insert(payInfo); return ServerResponse.createBySuccess(); }
支付宝通知返回时的交易状态列表
即时到帐接口——交易状态列表
交易状态操作:支付宝有交易记录,没付款
交易状态(trade_status):WAIT_BUYER_PAY
备注:通知不会返回,不能申请修改。
交易状态操作:交易完成
交易状态(trade_status):TRADE_FINISHED
备注:交易结束,不可退款
交易状态操作:交易完成
交易状态(trade_status):TRADE_SUCCESS
备注:高级即时到帐状态下
交易状态操作:交易关闭
交易状态(trade_status):TRADE_CLOSED
备注:默认通知不返回,可申请修改(条件需开通高级即时到帐功能,且非常需要退款的同步)。出现该情况在开通高级即时到帐时的人工操作退款时、买家没付款系统自动或卖家手动关闭了该笔交易
相关文章
- java核心技术卷I-线程安全(二)
- 一行Java代码实现游戏中交换装备
- 25个Java机器学习工具和库
- java中同步嵌套引起的死锁事例代码
- Java 代码中数字中间带下划线是几个意思
- Lombok 安装、入门 - 消除冗长的 java 代码
- java值传递与引用传递
- Effective Java 第三版——61. 基本类型优于装箱的基本类型
- Java代码审计入门篇
- 快速排序实现-JAVA
- [Effective Java]第二章 创建和销毁对象
- .NET和Java之争
- 推荐程序员面试秘籍!你会的还只有初级Java工程师的技术吗
- Java设计模式(18)——行为模式之迭代子模式(Iterator)
- java并发api总结
- Java常见的几种排序算法-插入、选择、冒泡、快排、堆排等
- 成为Java GC专家(5)—Java性能调优原则
- Java 8 forEach简单例子
- 请问如何实现字符串UTF8->BIG5,BIG5->UTF8。保证送分。-Java/JavaSE
- JAVA对XML文件的读写(有具体的代码和解析)
- java连接各种数据库代码大全
- Android 自己的自动化测试(2)依据ID查找对象(java)
- Java简洁代码实现归并排序算法
- 【JAVA长虹键法】第十一式 装饰器模式(23种设计模式)
- Java Jsoup 解析处理百度谷歌搜索结果的示例代码
- Java EasyExcel处理Excel日期、数字或者自定义格式转换方法及示例代码
- Java JDK 版本管理工具jabba常用命令
- java实现图片和字符串互相转换的代码
- 中文转换成Unicode编码和Unicode编码转换成中文,Java代码实现
- 【我的Android进阶之旅】Android 源代码中的Java代码中//$NON-NLS-1$ 注释是什么意思?