微信支付之01------获取订单微信支付二维码的接口------Java实现

  前言:以前写过一个获取微信二维码支付的接口,发现最近公司新开的项目会经常用到,现在我又翻出代码看了一遍,觉得还是把整个代码流程记下来的好

借鉴博客:

  他这篇博客写得不错,挺全的:https://www.cnblogs.com/xu-xiang/p/5797575.html

 

废话不多说,开撸:

  先声明:微信支付接口官方文档还是要看的,多看几遍所需要的参数,支付流程,再看一下别人博客的支付代码基本就明白了整个流程。

  1、先说说获取微信支付二维码所需要的几个重要配置参数:

      APP_ID (微信支付 公众号ID )

      MCH_ID  (商户号ID)
      API_KEY  (微信商户平台key密钥)
      NOTIFY_URL  (扫码支付成功后,微信要回调你服务器的接口地址)

         UFDODER_URL  (微信官方获取支付二维码的接口地址)

  上代码图:

 

 

   2、整个获取微信支付二维码所用到的代码文件

     HttpUtil03.java  发送get,post请求的工具类

    PayCommonUtil.java    请求微信接口时需要sign签名参数,里面有生成签名算法的方法

    PayConfigUtil.java  配置参数文件,放一些公众号ID、商户号ID、key、微信接口路径呀什么的配置参数

    WXGetScanCodePayUtil.java  处理发送参数,并发送参数获取二维码code的工具

    WXScanCodePayTest.java  main方法,编订单死数据,测试接口的

    XMLUtil4jdom.java  由于微信获取支付二维码code的接口所需要的参数是xml格式的,所以专门搞个工具类来把map转xml,或者把xml转String

    上图:

 

 

   3、上代码开始测试:

    3.1、我在WXScanCodePayTest.java这个类的main方法中测试运行整个请求处理接口流程,微信支付二维码接口需要一些订单商品参数,目前只是测试玩玩,所以写死

 

     String orderId = "201805150001";

        String order_price = "100";//100分,其实这里是10块钱
        // 微信支付URL需要传入的金额单位是分,此处将订单金额转换成'分'单位
        BigDecimal fen = new BigDecimal(order_price);
        fen = fen.setScale(0, BigDecimal.ROUND_HALF_UP);
        order_price = fen.toString();

        // 微信支付显示标题
        String body = "给老子100万";

        // 微信支交易订单号,不能重复
        String out_trade_no = "" + System.currentTimeMillis();

        // 组装参数
        Map<String, Object> param = new HashMap<String, Object>();
        param.put("order_price", order_price);
        param.put("body", body);//商品描述
        param.put("out_trade_no", out_trade_no);//微信支付交易订单号,自己生成
        param.put("attach", orderId);//订单id
        param.put("time_expire", DateUtil.getOrderExpireTime(1*60*1000L));//设置二维码失效时间:1分钟

        // 生成微信支付二维码链接
        Map<String, String> result = WXGetScanCodePayUtil.doUnifiedOrder(param, null);
        if ("FAIL".equals(result.get("return_code"))){

            log.error("生成二维码错误: " + result.get("return_msg"));
//            request.getSession().setAttribute("create_wx_qrcode_error_msg",  result.get("return_msg"));
//            session.setAttribute("create_wx_qrcode_error_msg",  result.get("return_msg"));
        } else {
            String urlCode = result.get("code_url");
            System.out.println("生成的二维码连接:" + urlCode);


//            BufferedImage bufferedImage = MatrixToImage.encodeQrcode(urlCode, 250, 250);
//            ImageIO.write(bufferedImage, "jpg", response.getOutputStream());


        以下代码是用在controller测试代码里的,用生成二维码图片的工具生成一个二维码图片,以流的形式返回给jsp页面的<img src="获取二维码图片流的controller接口地址">标签,以前测试玩的,我就不弄了
// 生成微信二维码,输出到response流中 // String icon = UserController.class.getClassLoader().getResource("coffee_icon.png").getPath(); //二维码绘图工具 // BufferedImage bufferedImage = MatrixToImageWriterWithLogo.genBarcode(urlCode, 512, 512, icon); // 二维码的内容,宽,高,二维码中心的图片地址 // ImageIO.write(bufferedImage, "jpg", response.getOutputStream()); }

 

 

       3.2、在WXGetScanCodePayUtil.doUnifiedOrder(param, null);方法里处理要传的参数,并处理发送(使用HttpUtil03.java工具)post请求给微信支付二维码接口

 /**
     *
     * @Description:调用微信支付接口返回URL
     * @author:zrt
     * @param param 订单价格,订单显示内容,订单号
     * @param request
     * @return
     * @throws Exception
     * @version:2018年5月15日下午12:02:06
     */
    @SuppressWarnings("unchecked")
    public static Map<String, String> doUnifiedOrder(Map<String, Object> param, HttpServletRequest request) throws Exception {

        String appid    = PayConfigUtil.APP_ID;      // appid
        String mch_id   = PayConfigUtil.MCH_ID;      // 商户号
        String key      = PayConfigUtil.API_KEY;     // key

        String trade_type = "NATIVE";
//        String spbill_create_ip = PayCommonUtil.getIpAddress(request);      // 获取发起电脑 ip
        String spbill_create_ip = "192.168.2.59";
        String notify_url = PayConfigUtil.NOTIFY_URL;                       // 回调接口

        String currTime = PayCommonUtil.getCurrTime();
        String strTime = currTime.substring(8, currTime.length());
        String strRandom = PayCommonUtil.buildRandom(4) + "";
        String nonce_str = strTime + strRandom;                             // 随机字符串

        String order_price = (String) param.get("order_price");             // 价格   注意:价格的单位是分
        String body = (String) param.get("body");                           // 商品名称
        String out_trade_no = (String) param.get("out_trade_no");           // 订单号

        String attach = (String) param.get("attach");                       // 附加参数,这里传的是我们的订单号orderId
        String time_expire = (String) param.get("time_expire");//设置二维码失效时间

        SortedMap<String,String> packageParams = new TreeMap<String,String>();
        packageParams.put("appid", appid);
        packageParams.put("mch_id", mch_id);
        packageParams.put("nonce_str", nonce_str);
        packageParams.put("body", body);
        packageParams.put("out_trade_no", out_trade_no);
        packageParams.put("total_fee", order_price);
        packageParams.put("spbill_create_ip", spbill_create_ip);
        packageParams.put("notify_url", notify_url);
        packageParams.put("trade_type", trade_type);
        packageParams.put("attach", attach);
        packageParams.put("time_expire", time_expire);

        // 签名
        String sign = PayCommonUtil.createSign("UTF-8", packageParams, key);
        packageParams.put("sign", sign);

        // 微信支付接口传输数据使用xml方式进行的,此处将参数装换为xml
        // map --> xml
        String requestXML = PayCommonUtil.getRequestXml(packageParams);
        System.out.println("---------- Request XML: " + requestXML);

        //设置请求头
        Map<String, String> headers = new HashMap<String, String>();
        headers.put("content-type", "text/html; charset=UTF-8");

//        String resXml = HttpUtil.postData(PayConfigUtil.UFDODER_URL, requestXML);
        HttpEntity httpEntity = HttpUtil03.sendHttpsPost(UFDODER_URL, headers, requestXML, true);
        BufferedReader reader = new BufferedReader(new InputStreamReader(httpEntity.getContent(), "UTF-8"));
        StringBuilder resXml = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            resXml.append(line);
            resXml.append("\r\n");
        }

        System.out.println("---------- Response XML: " + resXml.toString());

        // xml --> map
        return XMLUtil4jdom.doXMLParse(resXml.toString());
    }

 

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

 整个获取微信支付二维码的处理流程就是这样

 

上最后效果图:不要问为什么生成的支付二维码是红色的,我用生成二维码图片的插件自己调颜色大小时瞎调的,懒得改了

 

转载于:https://www.cnblogs.com/spll/p/10654831.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值