技术汇总:第十四章:电脑端生成支付宝二维码支付

@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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

经过日积月累, 以下是小编归纳整理的深入了解Java虚拟机文档,希望可以帮助大家过关斩将顺利通过面试。
由于整个文档比较全面,内容比较多,篇幅不允许,下面以截图方式展示 。







由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
虚拟机文档,希望可以帮助大家过关斩将顺利通过面试。**
由于整个文档比较全面,内容比较多,篇幅不允许,下面以截图方式展示 。

[外链图片转存中…(img-g8zNgmQI-1712928500183)]
[外链图片转存中…(img-oq4VYdYa-1712928500184)]
[外链图片转存中…(img-10BdeLGV-1712928500184)]
[外链图片转存中…(img-CBccs9m9-1712928500184)]
[外链图片转存中…(img-JhvknQq9-1712928500185)]
[外链图片转存中…(img-CJwABbGd-1712928500185)]
[外链图片转存中…(img-fHzKas7c-1712928500185)]

由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 16
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值