微信支付后端

0.需要引入微信支付SDK

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

 1.生成支付二维码,前端接收到map之后,有二维码的地址等信息,前端直接展示即可。

这里使用的app_id 商户号等,都是老师的。

    /**
     * 根据订单编号,生成支付二维码
     * @param orderNo
     * @return
     */
    @Override
    public Map  creatQrCode(String orderNo) {
        try {
//         1.根据订单编号查询订单信息
            QueryWrapper queryWrapper = new QueryWrapper();
            queryWrapper.eq("order_no", orderNo);
            Order order = orderService.getOne(queryWrapper);

//         2.使用map设置生成二维码需要的参数
            Map map = new HashMap();
            map.put("appid","wx74862e0dfcf69954"); //支付id
            map.put("mch_id", "1558950191"); //商户号
            map.put("nonce_str", WXPayUtil.generateNonceStr()); //生成随机的字符串,让每次生成的二维码不一样
            map.put("body", order.getCourseTitle()); //生成二维码的名字,会显示在微信扫码后的界面
            map.put("out_trade_no", orderNo); //二维码唯一的标识,只要不重复就行,这里是订单编号
            map.put("total_fee", order.getTotalFee().multiply(new BigDecimal("100")).longValue()+""); //支付金额
            map.put("spbill_create_ip", "127.0.0.1"); //进行支付的ip地址,实际项目使用项目的域名
            map.put("notify_url", "http://guli.shop/api/order/weixinPay/weixinNotify"); //支付后回调地址
            map.put("trade_type", "NATIVE"); //支付类型,NATIVE:知道价格,生成二维码

//         3.发送httpclient请求,(需要xml格式参数) 地址是微信支付的固定地址
            HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder");
            client.setXmlParam(WXPayUtil.generateSignedXml(map, "T6m9iK73b0kn9g5v426MKfHQH7X8rKwb"));
            client.setHttps(true);
            //执行post请求发送
            client.post();

//         4.得到返回结果,结果是xml格式的
            String xml = client.getContent();
            // 将结果转为map
            Map<String, String> map2 = WXPayUtil.xmlToMap(xml);
            System.out.println("生成二维码,返回的结果"+map2);
            // 最终返回数据的封装
            Map resultMap = new HashMap();
            resultMap.put("out_trade_no", orderNo);//订单编号
            resultMap.put("course_id", order.getCourseId()); //课程编号
            resultMap.put("total_fee", order.getTotalFee() + ""); // 价格
            resultMap.put("result_code", map2.get("result_code"));  //返回二维码状态码
            resultMap.put("code_url", map2.get("code_url"));        //二维码地址
            return  resultMap;
        } catch (Exception e) {
            e.printStackTrace();
            throw new GuLiExeception(20001, "生成二维码时发生错误");
        }
    }

2.查询支付是否成功

前端每隔一秒就发一次http请求,直到支付成功或者支付失败。

后端接收到请求后,用订单编号去问微信接口,是否支付成功

/**
     * 通过订单编号查询支付状态
     * @param orderNo
     * @return
     */
    @Override
    public Map<String, String> querypayStatus(String orderNo) {
        try {
            // 1.使用map设置生成二维码需要的参数
            Map m = new HashMap<>();
            m.put("appid", "wx74862e0dfcf69954");
            m.put("mch_id", "1558950191");
            m.put("nonce_str", WXPayUtil.generateNonceStr());
            m.put("out_trade_no", orderNo);//订单编号
            // 2.发送httpClient请求
            HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/pay/orderquery");
            client.setXmlParam(WXPayUtil.generateSignedXml(m, "T6m9iK73b0kn9g5v426MKfHQH7X8rKwb"));
            client.setHttps(true);
            client.post();
            // 3.得到返回内容
            String xml = client.getContent();
            Map<String, String> map = WXPayUtil.xmlToMap(xml);
            System.out.println("查询订单支付状态接口返回:"+map);
            return map;
        } catch (Exception e) {
            e.printStackTrace();
            throw new GuLiExeception(20001, "在查询订单状态时发生异常");
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值