千峰商城-springboot项目搭建-82-订单提交及支付-支付回调

本文主要是介绍千峰商城-springboot项目搭建-82-订单提交及支付-支付回调,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

支付回调:当用户支付成功之后,支付平台会向我们指定的服务器接口发送请求传递订单支付状态数据。
1.创建一个控制器定义回调接口
PayController :
@RestController
@RequestMapping("/pay")
public class PayController {//回调接口@PostMapping("/callback")public void success(){}
}

2.设置回调URL:在订单接口中申请支付链接时将回调接口的路径设置给微信支付平台

OrderController :

@RestController
@CrossOrigin
@RequestMapping("/order")
@Api(value = "提供订单相关的操作接口",tags = "订单管理")
public class OrderController {

@Autowired
private OrderService orderService;

@PostMapping("/add")
public ResultVO add(String cids,@RequestBody Orders order) {
ResultVO resultVO = null;
try {
Map<String,String> orderInfo = orderService.addOrder(cids,order);
String orderId = orderInfo.get("orderId");
//String orderId="1234561234567";
if (order != null){
//微信支付:申请支付连接
WXPay wxPay = new WXPay(new MyPayConfig());

HashMap<String,String> data = new HashMap<>();
data.put("body",orderInfo.get("productNames"));//商品描述
data.put("out_trade_no",orderId);//使用当前用户订单的编号作为当前用户订单的编号作为当前交易的交易号
data.put("fee_type","CNY");//支付币种
data.put("total_fee",order.getActualAmount()*100+"");//支付总金额(单位:分)
data.put("trade_type","NATIVE");//交易类型
data.put("notify_url","/pay/callback");//订单编号
//发送请求获取响应
Map<String, String> resp = wxPay.unifiedOrder(data);

System.out.println(resp);
orderInfo.put("payUrl",resp.get("code_url"));
resultVO = new ResultVO(ResStatus.OK,"提交订单成功!",orderInfo);
}else {
resultVO = new ResultVO(ResStatus.NO,"提交订单失败",null);
}

}catch (SQLException e){
resultVO = new ResultVO(ResStatus.NO,"提交订单失败",null);
} catch (Exception e) {
e.printStackTrace();
}
return resultVO;
}
}
 

3.如果按照如上配置,当用户支付成功之后,微信支付平台会向 http://192.168.55.3:8080/pay/callback 发送请求,因为我们的服务器项目是运行在本地计算机的(IP为内网IP),微信平台无法访问。

内网穿透:当客户端运行时会向服务器端请求建立连接,通过第三方(ngrok)建立隧道并获取唯一的隧道ID,当访问唯一的隧道的url网址时即可对外提供公网访问。支付成功后回调请求会到内网穿透的服务器,服务器相当于一个路由表,查询映射关系之后转发到连接,转发给客户端。

(客户端——>服务器(建立长连接) , 支付平台——>服务器——>客户端)

(1)开通隧道

https://ngrok.cc/

 (2)注册

(3)开通隧道

 

(4)获取隧道ID:134413368434

(5)下载Ngrok客户端

https://ngrok.cc/download.html

 (6)解压,打开windows_amd64中的bat。输入隧道id。回车。

 运行成功。

只要外网访问 http://ly01.free.idcfengye.com,就相当于访问127.0.0.1:8080  。

4.测试
PayController :
@RestController
@RequestMapping("/pay")
public class PayController {//回调接口@RequestMapping("/callback")public void success(){System.out.println("------------callback");}
}

访问地址:http://localhost:8080/pay/callback

结果:

再次访问:http://ly01.free.idcfengye.com/pay/callback

结果:

5.修改pay/callback地址:

 OrderController:

                HashMap<String,String> data = new HashMap<>();data.put("body",orderInfo.get("productNames"));//商品描述data.put("out_trade_no",orderId);//使用当前用户订单的编号作为当前用户订单的编号作为当前交易的交易号data.put("fee_type","CNY");//支付币种data.put("total_fee",order.getActualAmount()*100+"");//支付总金额(单位:分)data.put("trade_type","NATIVE");//交易类型data.put("notify_url","http://ly01.free.idcfengye.com/pay/callback");//订单编号
PayController :
@RestController
@RequestMapping("/pay")
public class PayController {@Autowiredprivate OrderService orderService;//回调接口:当用户支付成功之后,微信支付平台就会请求这个接口,将支付状态的数据传递过来//1.接收微信支付平台传递的数据(传递的数据格式为request的输入流)@RequestMapping("/callback")public String success(HttpServletRequest request) throws Exception {System.out.println("------------callback");ServletInputStream is = request.getInputStream();byte[] bs = new byte[1024];int len = -1;StringBuilder builder = new StringBuilder();while ( (len = is.read(bs)) != -1){builder.append(new  String(bs,0,len));}String s = builder.toString();//使用帮助类将xml接口的字符串转换成mapMap<String, String> map = WXPayUtil.xmlToMap(s);if (map != null && "success".equalsIgnoreCase( map.get("result_code")) ){//支付成功//2.修改订单状态为“待发货/已支付”String orderId = map.get("out_trade_no");int i = orderService.updateOrderStatus(orderId, "2");System.out.println("----orderId:"+orderId);//3.响应微信支付平台if (i>0){HashMap<String,String> resp = new HashMap<>();resp.put("return_code","success");resp.put("return_msg","OK");resp.put("app_id",map.get("appid"));resp.put("result_code","success");String s1 = WXPayUtil.mapToXml(resp);return s1;}else {return null;}}else {//支付失败return null;}}
}

6.回调接口实现

OrderService :
public interface OrderService {public Map<String,String> addOrder(String cids, Orders order) throws SQLException;public int updateOrderStatus(String orderId,String status);
}

 OrderServiceImpl:

    @Overridepublic int updateOrderStatus(String orderId, String status) {Orders orders = new Orders();orders.setOrderId(orderId);orders.setStatus(status);int i = ordersMapper.updateByPrimaryKeySelective(orders);return i;}

这篇关于千峰商城-springboot项目搭建-82-订单提交及支付-支付回调的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/260766

相关文章

5分钟获取deepseek api并搭建简易问答应用

《5分钟获取deepseekapi并搭建简易问答应用》本文主要介绍了5分钟获取deepseekapi并搭建简易问答应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1、获取api2、获取base_url和chat_model3、配置模型参数方法一:终端中临时将加

IDEA运行spring项目时,控制台未出现的解决方案

《IDEA运行spring项目时,控制台未出现的解决方案》文章总结了在使用IDEA运行代码时,控制台未出现的问题和解决方案,问题可能是由于点击图标或重启IDEA后控制台仍未显示,解决方案提供了解决方法... 目录问题分析解决方案总结问题js使用IDEA,点击运行按钮,运行结束,但控制台未出现http://

解决Spring运行时报错:Consider defining a bean of type ‘xxx.xxx.xxx.Xxx‘ in your configuration

《解决Spring运行时报错:Considerdefiningabeanoftype‘xxx.xxx.xxx.Xxx‘inyourconfiguration》该文章主要讲述了在使用S... 目录问题分析解决方案总结问题Description:Parameter 0 of constructor in x

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

Java中注解与元数据示例详解

《Java中注解与元数据示例详解》Java注解和元数据是编程中重要的概念,用于描述程序元素的属性和用途,:本文主要介绍Java中注解与元数据的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参... 目录一、引言二、元数据的概念2.1 定义2.2 作用三、Java 注解的基础3.1 注解的定义3.2 内

Java中使用Java Mail实现邮件服务功能示例

《Java中使用JavaMail实现邮件服务功能示例》:本文主要介绍Java中使用JavaMail实现邮件服务功能的相关资料,文章还提供了一个发送邮件的示例代码,包括创建参数类、邮件类和执行结... 目录前言一、历史背景二编程、pom依赖三、API说明(一)Session (会话)(二)Message编程客

Java中List转Map的几种具体实现方式和特点

《Java中List转Map的几种具体实现方式和特点》:本文主要介绍几种常用的List转Map的方式,包括使用for循环遍历、Java8StreamAPI、ApacheCommonsCollect... 目录前言1、使用for循环遍历:2、Java8 Stream API:3、Apache Commons

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为