微信H5扫码支付 java

 本文直接从代码调用微信扫码支付讲起。账号配置,参数生成等请参考官方文档:      https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1

微信扫码支付。简单来说,就是你把微信支付需要的信息,生成到二维码图片中。通过微信扫一扫,发起支付。我们需要做的就是二件事:

  一:按照微信扫码支付规则生成二维码信息.

  二:微信没有提供生成二维码图片的接口。需要我们自己把二维码信息生成到二维码图片中。

1.模式选择:

微信扫码支付,有两种模式,文档中有介绍。第二种模式,微信接口会返回二维码信息给我们。而第一种模式则需要我们自己去生成二维码信息。会有些麻 烦。尤其是参数大小写,还有签名的问题,容易出错。总的来说第二种模式比第一种模式简单。所有我采用的是第二种模式,比较通用。京东与携程亦用的是第二种 模式。

2.调用统一下单接口获取带有二维码信息的url:(模式二)

模式二的微信扫码支付,需要先调用微信的统一下单接口,生成预交易单。(参数传递与接收都是XML 数据格式。)

正确调用后,会返回含有交易标示ID,和二维码链接的URL。

 public void test2{
        HashMap<String, String> paramMap = Maps.newHashMap();
        paramMap.put("trade_type", "NATIVE"); //交易类型
        paramMap.put("spbill_create_ip",localIp()); //本机的Ip
        paramMap.put("product_id", payOrderIdsStr); // 商户根据自己业务传递的参数 必填
        paramMap.put("body", orderSubject);         //描述
        paramMap.put("out_trade_no", payOrderIdsStr); //商户 后台的贸易单号
        paramMap.put("total_fee", "" + totalCount); //金额必须为整数  单位为分
        paramMap.put("notify_url", "http://" + getAccessDomain() + "/wx_pay_notify"); //支付成功后,回调地址
        paramMap.put("appid", siteConfig.getWxPayAppId()); //appid
        paramMap.put("mch_id", siteConfig.getWxPayMchId()); //商户号
        paramMap.put("nonce_str", CommonUtilPub.createNoncestr(32));  //随机数
        paramMap.put("sign",CommonUtilPub.getSign(paramMap,siteConfig.getWxPayPartnerKey()));//根据微信签名规则,生成签名
        String xmlData = CommonUtilPub.mapToXml(paramMap);//把参数转换成XML数据格式
    }

    /**
     * 获取本机Ip
     *
     *  通过 获取系统所有的networkInterface网络接口 然后遍历 每个网络下的InterfaceAddress组。
     *  获得符合 <code>InetAddress instanceof Inet4Address</code> 条件的一个IpV4地址
     * @return
     */
    @SuppressWarnings("rawtypes")
    private String localIp(){
        String ip = null;
        Enumeration allNetInterfaces;
        try {
            allNetInterfaces = NetworkInterface.getNetworkInterfaces();
            while (allNetInterfaces.hasMoreElements()) {
                NetworkInterface netInterface = (NetworkInterface)
                        allNetInterfaces.nextElement();
                List<InterfaceAddress> InterfaceAddress = netInterface.getInterfaceAddresses();
                for (InterfaceAddress add : InterfaceAddress) {
                    InetAddress Ip = add.getAddress();
                }
                if (Ip != null && Ip instanceof Inet4Address) {
                    ip = Ip.getHostAddress();
                }
            }
        }catch (SocketException e) {
            // TODO Auto-generated catch block
            logger.warn("获取本机Ip失败:异常信息:"+e.getMessage());
        }
        return ip;
    }

成功时返回的XML数据为:

 <xml>
	 <return_code><![CDATA[SUCCESS]]></return_code> 
	 <return_msg><![CDATA[OK]]></return_msg> 
	 <appid><![CDATA[wx49342bda0ef105dd]]></appid> 
	 <mch_id><![CDATA[10019460]]></mch_id> 
	 <nonce_str><![CDATA[UneMQd4qWQd0hJ4L]]></nonce_str> 
	 <sign><![CDATA[C621A9C586C1F0397D4C6B8003E0CBCE]]></sign> 
	 <result_code><![CDATA[SUCCESS]]></result_code> 
	 <prepay_id><![CDATA[wx2015070818251790742fea5e0865034508]]></prepay_id> 
	 <trade_type><![CDATA[NATIVE]]></trade_type>
	 <code_url><![CDATA[weixin://wxpay/bizpayurl?pr=AOFEsxf]]></code_url>
 </xml>

解析XML 获取 code_url:

 String resXml = HtmlUtil.postData("https://api.mch.weixin.qq.com/pay/unifiedorder", xmlData);
        Document dd = null;
        String code_url = null;
        try {
            dd = DocumentHelper.parseText(resXml);
        } catch (DocumentException e) {
            return "";
        }
        if (dd != null) {
            Element root = dd.getRootElement();
        }
        if (root == null) {
            return "";
        }
        Element codeUrl = root.element("code_url");
        if (piEle == null) {
            return "";
        }
        code_url = codeUrl.getText();  //解析 xml 获得 code_url

动态生成二维码图片

使用的是google ZXing库。 提供一个 jar 地址 直接引入到自己项目即可。http://download.csdn.net/detail/gonwy/7658135  

 页面代码:

<img src="qr_code.img?code_url= <#if code_url??>${code_url}</#if>" style="width:300px;height:300px;"/>

后端接口

/**
   * 生成二维码图片并直接以流的形式输出到页面
   * @param code_url
   * @param response
   */
  @RequestMapping("qr_code.img")
  @ResponseBody
  public void getQRCode(String code_url,HttpServletResponse response){
    GenerateQrCodeUtil.encodeQrcode(code_url, response);
  }

 

 /**
     * 生成二维码图片 不存储 直接以流的形式输出到页面
     * @param content
     * @param response
     * */
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public static void encodeQrcode(String content,HttpServletResponse response){
        if(StringUtils.isBlank(content))
            return;
        MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
        Map hints = new HashMap();
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
        //设置字符集编码类型
        BitMatrix bitMatrix = null;
        try {
            bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, 300, 300,hints);
        }catch ( Exception e1) {
            // TODO Auto-generated catch block26
            e1.printStackTrace();
        }
        BufferedImage image = toBufferedImage(bitMatrix);
        //输出二维码图片流18
        try {
            ImageIO.write(image, "png", response.getOutputStream());
        } catch (IOException e) {
            // TODO Auto-generated catch block22
            e.printStackTrace();
        }
    }

然后生成的图片,通过微信扫码就可以发起支付了。

支付成功后,微信会调用,你之前设置的回调函数地址。并且会把你之前传给微信的商户自定义参数带给你,以帮助商户完成余下业务流程。

源码下载:https://download.csdn.net/download/a947851266/9925882

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值