微信扫码支付(NATIVE) java

微信扫码支付功能(模式二)

模式二说明: https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5

1. 该案列用的是微信官方提供的sdk,首先去微信官方下载sdk,SDK配置可参考

https://www.cnblogs.com/lccsdncnblogs/p/wxpay.html

直接上干货

    /**
     * 微信扫码支付(NATIVE)
     * @return
     */
    public String wxPayNATIVE(HttpServletRequest  request) {
        try {
            String out_trade_no = System.currentTimeMillis( ) + "";
            Map< String, String > maps = new HashMap<>( );//商品描述
            maps.put("body", "xxxxx费用");
            maps.put("out_trade_no", out_trade_no + "");
            //设置支付金额(分)
            maps.put("total_fee", 1 + "");
            maps.put("spbill_create_ip", getRealIp(request));
            //回调函数
            maps.put("notify_url", "http://xxxxxxxxxxxxxxxxxx/notifyUrl");
            maps.put("trade_type", "NATIVE");

            MyWxPayConfig myWxPayConfig = new MyWxPayConfig( );
            WXPay wxPay = new WXPay(myWxPayConfig);
            Map< String, String > reqData = wxPay.fillRequestData(maps);
            Map< String, String > map = wxPay.unifiedOrder(reqData);
            System.err.println(map);
            return map.get("code_url");
        } catch (Exception e) {
            e.printStackTrace( );
        }
        return  "二维码生成失败!";
    }

获取ip

    public String getRealIp(HttpServletRequest request) {
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        return ip;
    }

支付回调函数 notifyUrl

    /**
     * 微信支付 回调函数
     */
    public void notifyUrl(HttpServletRequest request) throws Exception {//读取参数
        BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream( )));
        String line;
        StringBuilder sb = new StringBuilder( );
        while ((line = br.readLine( )) != null) {
            sb.append(line);
        }
        if (StringUtils.isBlank(sb)) {
            return;
        }
        //支付结果通知的xml格式数据
        String notifyData = sb.toString( );
        MyWxPayConfig myWxPayConfig = new MyWxPayConfig( );
        WXPay wxpay = new WXPay(myWxPayConfig);
        Map< String, String > notifyMap = WXPayUtil.xmlToMap(notifyData);

        //验证签名是否正确
        if (wxpay.isPayResultNotifySignatureValid(notifyMap)) {
            //支付成功
            if ("SUCCESS".equals(notifyMap.get("result_code"))) {
                //商户订单号
                String out_trade_no = notifyMap.get("out_trade_no");
                Student order = Student.dao.findFirst("select * from student where wx_order_number = ? ", out_trade_no);
                order.setIspay(1);
                order.setPayMethod(2);
                order.setPayTime(new Date( ));
                order.update( );
                //把订单状态改成已付款
            } else {
                //log.info("微信支付回调函数:支付失败");
            }
        } else {
            //log.info("微信支付回调函数:微信签名错误");
        }
    }

 

{nonce_str=6LaEcEc4fzyAfTWN, code_url=weixin://wxpay/bizpayurl?pr=2mjNiuG, appid=wxea6cab2463501e33, sign=50FC8428E809E62AB7F11256581661AC, trade_type=NATIVE, return_msg=OK, result_code=SUCCESS, mch_id=1601460322, return_code=SUCCESS, prepay_id=wx2514033483568531299a2d15fad6880000}

标红部分直接粘贴到微信中测试支付

 成功之后 , 将路径放到二维码中

 

posted @ 2020-08-25 14:56  lanwf  阅读(702)  评论(1编辑  收藏  举报