支付宝回调JAVA版代码
支付宝回调:
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版代码的更多相关文章
- 【剑指offer】Java版代码(完整版)
原文地址:https://blog.csdn.net/baiye_xing/article/details/78428561 一.引言 <剑指offer>可谓是程序猿面试的神书了,在面试中 ...
- 剑指offer】Java版代码(完整版)
转自:剑指offer]Java版代码(完整版) 转自:[剑指offer] JAVA版题解(完整版)
- 我在生产项目里是如何使用Redis发布订阅的?(二)Java版代码实现(含源码)
上篇文章讲了在实际项目里的哪些业务场景用到Redis发布订阅,这篇文章就讲一下,在Java中如何实现的. 图解代码结构 发布订阅的理论以及使用场景大家都已经有了大致了解了,但是怎么用代码实现发布订阅呢 ...
- 布隆过滤器(Bloom Filter)-学习笔记-Java版代码(挖坑ing)
布隆过滤器解决"面试题: 如何建立一个十亿级别的哈希表,限制内存空间" "如何快速查询一个10亿大小的集合中的元素是否存在" 如题 布隆过滤器确实很神奇, 简单 ...
- python实现DFA模拟程序(附java实现代码)
DFA(确定的有穷自动机) 一个确定的有穷自动机M是一个五元组: M=(K,∑,f,S,Z) K是一个有穷集,它的每个元素称为一个状态. ∑是一个有穷字母表,它的每一个元素称为一个输入符号,所以也陈∑ ...
- 支付宝(移动支付)服务端java版
所需支付宝jar包: sdk2-2.0.jar(点击下载) 工具类目录结构: 点击下载 商户信息已经公钥私钥的配置(公钥私钥的生成与支付宝商户平台配置请看官方文档:https://doc.open ...
- 设计模式-Java版-全-附代码-超生动实例
阅读推荐:设计模式-简单篇 项目地址:https://gitee.com/zwtgit/gof23 学习网站推荐: https://refactoringguru.cn/design-patterns ...
- Android C代码回调java方法
本文将讲述下列三种C代码回调java方法 1.c代码回调java空方法 2.c代码回调java int类型参数方法 3.c代码回调javaString类型参数方法 方法都差不多,先看c代码回调java ...
- Android NDK开发(五)--C代码回调Java代码【转】
转载请注明出处:http://blog.csdn.net/allen315410/article/details/41862479 在上篇博客里了解了Java层是怎样传递数据到C层代码,并且熟悉了大部 ...
随机推荐
- Hbase记录-Hbase基础概念
HBase是什么? HBase是建立在Hadoop文件系统之上的分布式面向列的数据库.它是一个开源项目,是横向扩展的. HBase是一个数据模型,类似于谷歌的大表设计,可以提供快速随机访问海量结构化数 ...
- Hive记录-impala常用命令
1.impala是什么 Impala是Cloudera公司主导开发的新型查询系统,它提供SQL语义,能查询存储在Hadoop的HDFS和HBase中的PB级大数据.已有的Hive系统虽然也提供了SQL ...
- Python分析网页中的<a>标签
soup = BeautifulSoup(html,"html.parser") html=soup.select("table a") for k in ht ...
- Mybatis中的StatementType
原文:http://luoyu-ds.iteye.com/blog/1517607 要实现动态传入表名.列名,需要做如下修改 添加属性statementType=”STATEMENT” 同时sql里的 ...
- [C++]Linux之图形界面编程库[curses库]之入门教程
1. 安装 //方法一 sudo apt-get install libncurses5-dev [ ubuntu 16.04:亲测有效] //方法二 sudo apt-get install ncu ...
- Java EE之Hibernate异常总结【5】java.lang.StackOverflowError[栈溢出]
Exception in thread "main" java.lang.StackOverflowError at java.lang.reflect.InvocationTar ...
- CSS —— 选择器
选择器种类 标签选择器 id选择器 类选择器 通配符 交集选择器 并集选择器 后代选择器 子代选择器 选择器设置样式优先级 默认样式 < 继承样式 < 通配符设置样式 < 标签选择器 ...
- 如何成为软件测试职场“头号玩家”,月入10k+
最近看了一部电影,叫<头号玩家>,电影挺不错的,延伸到自己的测试职业生涯,其实在我们的测试职场,也是存在头号玩家的,但并不是真的在玩,而是在努力工作. 不管是什么游戏,如果要玩通关升级,那 ...
- mysql 原理 ~ 二阶段提交协议通说
一 简介: 今天是第二篇,讲解的是mysql的事务日志 二 具体 1 WAL技术(先写日志,再写磁盘) 2 binlog redolog 二阶段提交协议 目的 保持 redo log和binl ...
- C# List分页
假设你每页10条数据当前是第3页 跳到第4页则:List.Skip((4-1)*10).Take(10) 本文来自SunShine,转载请标明出处: http://do.jhost.cn/sunshi ...