@ApiOperation(“支付成功后同步回调转支付成功页面”)
@ResponseBody
@RequestMapping(value = “/alipay/callback/return”,method = RequestMethod.GET)
public CommonResult callBackReturn(HttpServletRequest request){// 页面同步反转的回调
Map<String,String> paramsMap = new HashMap<String, String>();
Map parameterMap = request.getParameterMap();
for(Iterator iter = parameterMap.keySet().iterator(); iter.hasNext()😉{
String name = iter.next();
String[] values = (String [])parameterMap.get(name);
String valueStr = “”;
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1 ) ? valueStr + values [i] : valueStr + values[i] + “,”;
}
paramsMap.put(name,valueStr);
}
String outTradeNo = request.getParameter(“out_trade_no”);
String tradeNo = request.getParameter(“trade_no”);
String sign = request.getParameter(“sign”);
try {
boolean b = AlipaySignature.rsaCheckV1(paramsMap, AlipayConfig.alipay_public_key,AlipayConfig.charset,AlipayConfig.sign_type);// 对支付宝回调签名的校验
} catch (AlipayApiException e) {
e.printStackTrace();
}
//修改支付信息,幂等性检查
/* boolean b = paymentService.checkPaymentStatus(outTradeNo);
if(!b){
PaymentInfo paymentInfo = paymentService.checkPaymentResult(outTradeNo);
paymentService.updatePayment(request.getQueryString(),outTradeNo,tradeNo);
//发送系统消息,出发并发商品支付业务消息队列
paymentService.sendPaymentSuccess(outTradeNo,paymentInfo.getPaymentStatus(),tradeNo);
}*/
return CommonResult.success(“支付成功”);
}
}
第三步:发送检查支付结果的消息队列
=================
@Autowired
private OmsOrderSettingMapper orderSettingMapper;
@Autowired
private AmqpTemplate amqpTemplate;
/**
-
发送检查支付结果的消息队列
-
@param orderSn
-
@param count
*/
@Override
public void sendDelayPaymentCheck(String orderSn, int count) {
//获取订单超时时间
OmsOrderSetting orderSetting = orderSettingMapper.selectByPrimaryKey(1L);
long delayTimes = orderSetting.getNormalOrderOvertime() * 60 * 1000;
HashMap<Object, Object> hashMap = new HashMap<>();
hashMap.put(“out_trade_no”,orderSn);
hashMap.put(“count”,count);
//给延迟队列发送消息
amqpTemplate.convertAndSend(QueueEnum.QUEUE_PAY_CANCEL.getExchange(), QueueEnum.QUEUE_PAY_CANCEL.getRouteKey(), hashMap, new MessagePostProcessor() {
@Override
public Message postProcessMessage(Message message) throws AmqpException {
//给消息设置延迟毫秒值
message.getMessageProperties().setExpiration(String.valueOf(delayTimes));
return message;
}
});
}
第四步:处理发送检查支付结果的消息队列
===================
package com.macro.mall.portal.component;
import com.macro.mall.model.PaymentInfo;
import com.macro.mall.portal.service.PaymentService;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.HashMap;
/**
- 支付的处理者
*/
@Component
@RabbitListener(queues = “mall.pay.cancel”)
public class PayReceiver {
@Autowired
PaymentService paymentService;
@RabbitHandler
public void handle(HashMap mapMessage){
try {
String outTradeNo = mapMessage.get(“out_trade_no”).toString();
int count = Integer.parseInt(mapMessage.get(“count”).toString());
// 如果没有支付成功,再次发送延迟检查队列
if (count > 0) {
// 进行支付状态检查
System.out.println(“正在进行第” + (6 - count) + “支付结果次检查”);
//调用alipayClient接口,根据out_trade_no查询支付信息
PaymentInfo paymentInfo = paymentService.checkPaymentResult(outTradeNo);
Thread thread = new Thread();
thread.start();
Thread.sleep(10000);
//判断是否已经支付成功
if (paymentInfo.getPaymentStatus()!=null&&(paymentInfo.getPaymentStatus().equals(“TRADE_SUCCESS”) || paymentInfo.getPaymentStatus().equals(“TRADE_FINISHED”))) {
// 交易成功或者失败,记录交易状态
System.out.println(“检查交易结果成功,记录交易状态。。。”);// 修改支付的状态信息
// 修改支付信息
boolean b = paymentService.checkPaymentStatus(outTradeNo);
if(!b){
//修改为已支付
paymentService.updatePayment(paymentInfo.getCallbackContent(),outTradeNo,paymentInfo.getAlipayTradeNo());
// 发送系统消息,出发并发商品支付业务消息队列
paymentService.sendPaymentSuccess(paymentInfo.getOutTradeNo(),paymentInfo.getPaymentStatus(),paymentInfo.getAlipayTradeNo());
}
} else {//未支付
// 再次进行延迟检查
System.out.println(“正在进行第” + (6 - count) + “支付结果次检查,检查用户尚未付款成功,继续巡检”);
paymentService.sendDelayPaymentCheck(outTradeNo, count - 1);
}
} else {
System.out.println(“支付结果次检查次数耗尽,支付未果。。。”);
}
} catch (Exception e) {
}
}
}
第五步:调用alipayClient接口,根据out_trade_no查询支付信息
===========================================
@Autowired
AlipayClient alipayClient;
/**
-
进行支付状态检查
-
@param outTradeNo
-
@return
*/
@Override
public PaymentInfo checkPaymentResult(String outTradeNo) {
PaymentInfo paymentInfo = new PaymentInfo();
// 调用alipayClient接口,根据out_trade_no查询支付状态
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
Map<String,Object> mapString = new HashMap<String,Object>();
mapString.put(“out_trade_no”,outTradeNo);
String s = JSON.toJSONString(mapString);
request.setBizContent(s);
AlipayTradeQueryResponse response = null;
try {
response = alipayClient.execute(request);
} catch (AlipayApiException e) {
e.printStackTrace();
}
// 等待付款、付款成功、付款失败、已经结束
paymentInfo.setCallbackTime(new Date());
paymentInfo.setOutTradeNo(outTradeNo);
paymentInfo.setCallbackContent(response.getMsg());
if(response.isSuccess()){
System.out.println(“交易已经创建”);
paymentInfo.setPaymentStatus(response.getTradeStatus());
paymentInfo.setAlipayTradeNo(response.getTradeNo());
} else {
System.out.println(“交易未创建”);
}
return paymentInfo;
}
第六步:发送系统消息,出发并发商品支付业务消息队列
=========================
@Autowired
private OmsOrderSettingMapper orderSettingMapper;
@Autowired
private AmqpTemplate amqpTemplate;
/**
-
发送系统消息,出发并发商品支付业务消息队列
-
@param outTradeNo
-
@param paymentStatus
-
@param tradeNo
*/
@Override
public void sendPaymentSuccess(String outTradeNo, String paymentStatus, String tradeNo) {
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put(“outTradeNo”,outTradeNo);
hashMap.put(“paymentStatus”,paymentStatus);
hashMap.put(“tradeNo”,tradeNo);
OmsOrderSetting orderSetting = orderSettingMapper.selectByPrimaryKey(1L);
long delayTimes = orderSetting.getNormalOrderOvertime() * 60 * 1000;
//给延迟队列发送消息
amqpTemplate.convertAndSend(QueueEnum.QUEUE_PAYMENT_SUCCESS_CANCEL.getExchange(), QueueEnum.QUEUE_PAYMENT_SUCCESS_CANCEL.getRouteKey(), hashMap, new MessagePostProcessor() {
@Override
public Message postProcessMessage(Message message) throws AmqpException {
//给消息设置延迟毫秒值
message.getMessageProperties().setExpiration(String.valueOf(delayTimes));
return message;
}
});
}
第七步:处理发送系统消息,出发并发商品支付业务消息队列
===========================
package com.macro.mall.portal.component;
import com.macro.mall.portal.service.OmsOrderService;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.HashMap;
/**
- 支付成功的处理者
*/
@Component
@RabbitListener(queues = “mall.paysuccess.cancel”)
public class PaySuccessReceiver {
@Autowired
private OmsOrderService orderService;
@RabbitHandler
public void handle(HashMap mapMessage){
String outTradeNo = mapMessage.get(“outTradeNo”).toString();
String trackingNo = mapMessage.get(“tradeNo”).toString();
String paymentStatus = mapMessage.get(“paymentStatus”).toString();
// 消费代码
orderService.updateOrder(outTradeNo,paymentStatus,trackingNo);
// 发送一个订单成功的消息队列,由库存系统消费(或者调用库存接口)
orderService.sendOrderResult(outTradeNo);
}
}
第八步:发送一个订单成功的消息队列,由库存系统消费(或者调用库存接口)
===================================
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

最后
经过日积月累, 以下是小编归纳整理的深入了解Java虚拟机文档,希望可以帮助大家过关斩将顺利通过面试。
由于整个文档比较全面,内容比较多,篇幅不允许,下面以截图方式展示 。
由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
虚拟机文档,希望可以帮助大家过关斩将顺利通过面试。**
由于整个文档比较全面,内容比较多,篇幅不允许,下面以截图方式展示 。
[外链图片转存中…(img-g8zNgmQI-1712928500183)]
[外链图片转存中…(img-oq4VYdYa-1712928500184)]
[外链图片转存中…(img-10BdeLGV-1712928500184)]
[外链图片转存中…(img-CBccs9m9-1712928500184)]
[外链图片转存中…(img-JhvknQq9-1712928500185)]
[外链图片转存中…(img-CJwABbGd-1712928500185)]
[外链图片转存中…(img-fHzKas7c-1712928500185)]
由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!