千峰商城-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

相关文章

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

springboot整合阿里云百炼DeepSeek实现sse流式打印的操作方法

《springboot整合阿里云百炼DeepSeek实现sse流式打印的操作方法》:本文主要介绍springboot整合阿里云百炼DeepSeek实现sse流式打印,本文给大家介绍的非常详细,对大... 目录1.开通阿里云百炼,获取到key2.新建SpringBoot项目3.工具类4.启动类5.测试类6.测

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

浅析Java中如何优雅地处理null值

《浅析Java中如何优雅地处理null值》这篇文章主要为大家详细介绍了如何结合Lambda表达式和Optional,让Java更优雅地处理null值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录场景 1:不为 null 则执行场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常场景

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F