专注Java教育14年 全国咨询/投诉热线:444-1124-454
星辉LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 Java微信扫码支付的代码

Java微信扫码支付的代码

更新时间:2022-04-28 11:20:29 来源:星辉 浏览1168次

星辉小编告诉大家,微信扫码支付。简单来说就是你将微信支付所需的信息生成到二维码图片中。微信扫一扫,发起支付。我们需要做的是两件事:

一是:根据微信扫码支付规则生成二维码信息。

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

1.模式选择:

微信扫码支付,有两种方式,文档中有介绍。第二种模式,微信界面会将二维码信息返回给我们。第一种模式需要我们自己生成二维码信息。会有点麻烦。尤其是参数的情况,以及签名的问题,很容易出错。一般来说,第二种模式比第一种模式更简单。我使用的只是第二种模式,它更通用。京东和携程也采用第二种模式。

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

微信扫码支付第二种方式,需要调用微信统一下单接口生成预交易订单。(参数发送和接收都是 XML 格式。)

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

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 
       *  
       * 获取系统所有的网络接口,然后遍历每个网络下的InterfaceAddress组。
       * 获取满足<code>InetAddress instanceof Inet4Address</code>条件的IpV4地址
       * @return 
       */ 
      @SuppressWarnings("rawtypes" )
      private String localIp(){
          String ip = null ;
         枚举 allNetInterfaces;
         尝试{
             allNetInterfaces = NetworkInterface.getNetworkInterfaces();            
              while (allNetInterfaces.hasMoreElements()) {
                  NetworkInterface netInterface = (NetworkInterface) allNetInterfaces.nextElement();
                 列表<InterfaceAddress> InterfaceAddress = netInterface.getInterfaceAddresses();
                  for (InterfaceAddress add : InterfaceAddress) {
                      InetAddress Ip = add.getAddress();
                      if (Ip != null && Ip instanceof Inet4Address) {
                          ip =ip.getHostAddress();
                      }
                  }
              }
          }捕获(SocketException e){
             TODO 自动生成的catch block         
               logger.warn("获取本机IP失败:异常信息:" + e.getMessage());
          }
         返回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[ wx2015070818251790742fea5e0865 ]3] > </ 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);
文档 dd = null ;
字符串 code_url= null ;
 尝试{
      dd = DocumentHelper.parseText(resXml);
    } catch (DocumentException e) {
         return "" ; 
  }
  if (dd != null ) {
     元素根 = dd.getRootElement();
      if (root == null ) {
     返回"" ;
      }
     元素 codeUrl = root.element("code_url" );
      if (piEle == null ) {
     返回"" ;
      }  
       code_url = codeUrl.getText();//解析xml得到code_url 19}

3.动态生成二维码图片

使用了 google ZXing 库。提供一个jar地址,直接导入到你的项目中。

页面代码:

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

Java代码:

  /** 
       * 生成的二维码图片直接作为流输出到页面,不存储
       * @param content
       * @param response
       */       @SuppressWarnings({ "unchecked", "rawtypes" })
 public static void encodeQrcode(String content,HttpServletResponse response){ 
if (StringUtils.isBlank(content))
 return      ;
           MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
         地图提示 = new              HashMap();
         提示.put(EncodeHintType.CHARACTER_SET, "UTF-8"); 新的
         位矩阵 bitMatrix = null ;
         尝试{
              bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, 300, 300 ,hints);
              BufferedImage 图像 = toBufferedImage(bitMatrix);
             输出二维码图片流
              try {
                  ImageIO.write(image, "png" , response.getOutputStream());
              }捕捉(IOException e){
                 TODO 自动生成的 catch 块
                  e.printStackTrace();
              }
          }捕捉(WriterException e1){
             TODO 自动生成的 catch 块
              e1.printStackTrace();
          }         
      }

然后,您可以通过微信扫描生成的图片的代码来发起支付。

支付成功后,微信会调用你之前设置的回调函数地址。并且会为你带来之前发送给微信的商户自定义参数,帮助商户完成剩下的业务流程。如果大家想了解更多相关知识,不妨来关注一下星辉的Java星辉在线学习,里面的课程内容细致全面,通俗易懂,适合小白学习,希望对大家能够有所帮助。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>