Springboot整合微信支付

Springboot整合微信支付

官方文档地址:https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html

注意: 调用微信第三方链接Api必须使用xml格式请求才能获取数据,最终再将xml格式转换成对象,这里给大家提供了HttpClient工具类,需要大家自行在本博客其他文章中获取

业务流程:

Springboot整合微信支付_第1张图片

一、生成微信支付二维码

1、申请开通微信支付

获取以下内容:
Springboot整合微信支付_第2张图片

2、引入依赖

 <dependency>
      <groupId>com.github.wxpay</groupId>
      <artifactId>wxpay-sdk</artifactId>
      <version>0.0.3</version>
 </dependency>

3、定义接口

	//生成微信支付二维码接口
    //微信支付
    @GetMapping("/createNative/{orderNo}")
    public R wxPay(@PathVariable String orderNo) {
        //返回相关信息  二维码地址和其他信息
        Map map = payLogService.createNative(orderNo);
        //自定义封装的统一返回结果(可查看博客获取)
        return R.ok().data(map);
    }

4、业务实现

注意:
1、未标注自定义的都是微信Api使用的默认key和value不可以随意设置
2、HttpClient为工具类,请自行到博客中查找工具类文章获取

   public Map createNative(String orderNo) {
        try {
            //1、根据订单号查询出订单信息
            TOrder order = orderService.getOne(new QueryWrapper<TOrder>()
            .lambda().eq(TOrder::getOrderNo, orderNo));

            //2、使用map设置生成二维码需要的参数
            Map m = new HashMap<>();
            //1、设置支付参数
            
            //关联的公众号(微信方提供)
            m.put("appid", "wx74862e0dfcf69954"); 
            
            //商户号(微信方提供)
            m.put("mch_id", "1558950191"); 
             
            //设置签名(微信方提供Api)
            m.put("nonce_str", WXPayUtil.generateNonceStr()); 
            
            //课程标题(自定义)
            m.put("body", order.getCourseTitle()); 
            
            //订单号(自定义)
            m.put("out_trade_no", orderNo); 
            
            //价格 (自定义)
            m.put("total_fee", order.getTotalFee()
            .multiply(new BigDecimal("100")).longValue()+""); 
            
            //支付ip地址(自定义,根据服务ip,这里是调用本地服务)
            m.put("spbill_create_ip", "127.0.0.1"); 
            
            //回调地址(微信方提供)
            m.put("notify_url","http://guli.shop/api/order/weixinPay/weixinNotify\n"); 
            
            //类型 根据价格生成二维码(微信方提供)
            m.put("trade_type", "NATIVE"); 

            //3、发送httpClient请求,传递参数xml格式
            //  3.1使用工具类传入固定地址(微信方提供支付地址)
            HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder");
            
            //  3.2设置xml格式的参数
            //  传入商户key
            client.setXmlParam(WXPayUtil.generateSignedXml(
            m ,"T6m9iK73b0kn9g5v426MKfHQH7X8rKwb"));
            
            client.setHttps(true);
            //  3.3执行请求发送
            client.post();

            //4、得到发送请求返回结果
            //返回内容,使用xml格式返回
            String xml = client.getContent();

            //把xml格式转换map集合,把map集合返回
            Map<String, String> resultMap = WXPayUtil.xmlToMap(xml);
            
            //最终返回数据的封装
            Map map = new HashMap();
            map.put("out_trade_no", orderNo);  //默认key 传入自定义值
            map.put("course_id", order.getCourseId()); //自定义
            map.put("total_fee", order.getTotalFee()); //自定义
            map.put("result_code", resultMap.get("result_code")); //返回二维码操作状态码
            //**************二维码地址***************//
            map.put("code_url", resultMap.get("code_url"));  

            return map;

        } catch (Exception e) {
            throw new GuliException(20001,"生成二维码失败");
        }
}

二、查询当前支付状态

1、定义接口

 	//查询订单支付状态
    //参数:订单号,根据订单查询支付状态
    @GetMapping("/getOrderStatus/{orderNo}")
    public R getOrderStatus(@PathVariable String orderNo) {
        //查询是否存在当前订单
        Map<String,String> map = payLogService.queryPayStatus(orderNo);
        if (map == null) {
            return R.error().message("支付出错了");
        }
        //存在当前订单,判断当前支付状态
        //通过map获取订单状态
        /**
        *	trade_state:
        *		支付成功:SUCCESS
        *		未支付:NATIVE
        */
        System.out.println(map.get("trade_state"));
        if (map.get("trade_state").equals("SUCCESS"))  { //支付成功
            //添加记录到支付表,更新订单表订单状态
            payLogService.updateOrderStatus(map);
            return R.ok().message("支付成功......");
        }
        return R.ok().code(25000).message("支付中");
    }
}

2、业务实现

    //查询订单支付状态
    @Override
    public Map<String, String> queryPayStatus(String orderNo) {
        try {
            //1、封装参数
            Map m = new HashMap<>();
            m.put("appid", "wx74862e0dfcf69954");
            m.put("mch_id", "1558950191");
            m.put("out_trade_no", orderNo);
            m.put("nonce_str", WXPayUtil.generateNonceStr());
            
            //2、设置请求(固定地址)
            HttpClient client = new HttpClient(
            "https://api.mch.weixin.qq.com/pay/orderquery");
            
            //转换为xml设置商户key
            client.setXmlParam(WXPayUtil.generateSignedXml
            (m, "T6m9iK73b0kn9g5v426MKfHQH7X8rKwb"));
            
            client.setHttps(true);
            client.post();
            //3、返回第三方的数据
            
            String xml = client.getContent();
            //6、xml格式转成Map
            Map<String, String> resultMap = WXPayUtil.xmlToMap(xml);
            //7、返回
            return resultMap;
        } catch (Exception e) {
            return null;
        }
    }


以上已完成整合微信支付,以下为个人项目中的业务逻辑,用于博主参考回顾

//添加支付记录和更新订单状态
    @Override
    public void updateOrderStatus(Map<String, String> map) {
        //从map中获取订单号
        String orderNo = map.get("out_trade_no");
        //根据订单号查询出订单信息
        TOrder order = orderService.getOne(new QueryWrapper<TOrder>().lambda().eq(TOrder::getOrderNo, orderNo));
        //更新订单状态
        if (order.getStatus() == 1) {
            //已经支付
            return;
        } else {
            order.setStatus(1);
            orderService.updateById(order);
        }
        //向支付表中添加支付记录
        TPayLog payLog = new TPayLog();
        payLog.setOrderNo(orderNo); //订单号
        payLog.setPayTime(new Date()); //订单完成时间
        payLog.setPayType(1);//支付类型
        payLog.setTotalFee(order.getTotalFee());//总金额(分)
        payLog.setTradeState(map.get("trade_state"));//支付状态
        payLog.setTransactionId(map.get("transaction_id")); //流水号
        payLog.setAttr(JSONObject.toJSONString(map)); //其他值

        baseMapper.insert(payLog);
    }
}

你可能感兴趣的:(java)