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

    @Autowired
    private 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接口的字符串转换成map
        Map<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:

    @Override
    public int updateOrderStatus(String orderId, String status) {
        Orders orders = new Orders();
        orders.setOrderId(orderId);
        orders.setStatus(status);
        int i = ordersMapper.updateByPrimaryKeySelective(orders);
        return i;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
千峰是一个IT培训机构,致力于提供高质量的前端培训课程。其中,Vue是千峰的核心课程之一,也是目前前端领域最受欢迎的JavaScript框架之一。Vue具有简洁易学的特点,使得开发者可以快速构建交互式的用户界面。 Vue具有以下特点: 1. 响应式数据绑定:Vue采用了一种数据驱动的思想,可以将数据与DOM元素进行绑定,当数据改变时,对应的DOM元素会自动更新,实现页面的动态渲染。 2. 组件化开发:Vue将UI页面拆分为多个组件,每个组件都有自己的逻辑和样式,可以实现组件的高复用性,提高开发效率。 3. 虚拟DOM:Vue通过虚拟DOM技术优化了页面渲染的效率,当数据变化时,Vue会先将页面的变动进行diff算法比较,然后只更新需要更新的部分,减少了不必要的性能消耗。 4. 生态丰富:Vue有庞大的社区支持,拥有许多开源组件库,例如Element UI和Vuetify等,可以方便地集成到自己的项目中,加快开发速度。 5. 完善的文档和学习资源:Vue拥有详细的官方文档和丰富的学习资源,对于初学者来说很友好,可以帮助开发者快速入门和提升技术。 在千峰的Vue课程中,学员将学习Vue框架的使用以及相关的生态技术,包括Vue Router、VueX等,还会通过实战项目进行实践,提升实际开发能力。课程采用了理论结合实践的教学方法,注重实际项目开发经验的分享。 总之,千峰的Vue课程是一个很好的学习机会,通过学习Vue,可以快速掌握前端开发的技能,提高自己在职场上的竞争力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值