java微信扫码二维码 公众号发放红包

最新研究微信红包接口的问题真是困扰了我好久,因为微信的api 实在是太坑爹了 ,如何没有大量的测试是行不通的,我是拼凑的所有人的集合才弄明白,接下来跟大家分享一下java 结合jsp ,两个服务器如何实现 微信扫码二维码 然后公众号发放红包的例子。

1.准备工作先不说了(比如验证回调函数服务器域名啊、程序必须部署在80端口等等,开通微信支付等功能,这个微信api 说的很清晰),需要两个程序 ,一个作为微信接口的回掉函数程序用来获取 code(简称服务器A),另一个作为调取发送红包的程序(简称服务器B)。(java 端jar包就不写了直接写方法,有需要加我QQ379378920)

2.首先在A服务器上部署back.html页面 ,然后用生成二维码工具将此页面路径生成二维码,页面自动授权跳转到回第二个页面 getback.html

 1 <!doctype html>
 2 <html>
 3 <head>
 4 <meta http-equiv="content-type" content="txt/html; charset=utf-8"/>
 5 
 6 <script type="text/javascript" src="jquery-1.8.3.js"></script>
 7 <script type="text/javascript">
 8 $(document).ready(function () {
 9 
10 window.location.href ="https://open.weixin.qq.com/connect/oauth2/authorize?appid=微信公众号的appid&redirect_uri=回调函数页面路劲(我的是getback.html)&response_type=code&scope=snsapi_userinfo&state=STATE&connect_redirect=1#wechat_redirect"
11 
12 });
13 
14 </script>
15 <style>
16 
17 </style>
18 </head>
19 <body>
20 </body>
21 </html>

 

接下来是 getback.html 代码

<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="txt/html; charset=utf-8"/>

<script type="text/javascript" src="jquery-1.8.3.js"></script>
<script type="text/javascript">
$(document).ready(function () {

var code = getQueryString('code');


if (code != null) {

window.location.href="B服务器路径的controller方法上?code="+code;

}
});


function getQueryString(name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
var r = window.location.search.substr(1).match(reg);
if (r != null) return unescape(r[2]);
return null;

}
</script>
<style>

</style>
</head>
<body>

</body>
</html>

 

 

这个页面难点在于获取code,终于要说的微信最坑的地方了 就是获取的code 是在回调路径中隐藏的,api根本就没有写,我是通过截取的方法获取路径发送给B服务器的。

3.controller 我就不写了,我就写通过取回来的code如何获取openid的方法吧 java端个

public String  getOpenId(String code) {
    String  openid = "";
        String uri="https://api.weixin.qq.com/sns/oauth2/access_token";
        String requestEntity = "appid=" + 你的appid + "&secret=" + 你的秘钥 + "&code=" + code + "&grant_type=" + 你的grant_type;
        HttpUriRequest httpUriRequest = RequestBuilder.post()
                .setUri(uri)
                .setHeader("Content-Type", "application/x-www-form-urlencoded")
                .addParameter("_type", "json")
                .setEntity(new StringEntity(requestEntity, Charset.forName("utf-8")))
                .build();
        HttpResponse httpResponse = LocalHttpClient.execute(httpUriRequest);
        try {
            String  result = EntityUtils.toString(httpResponse.getEntity());
            JSONObject jsonObject = JSONObject.fromObject(result);
            openid = jsonObject.getString("openid");
            System.out.println(openid);
        } catch (IOException e) {
            e.printStackTrace();
        }
    
    return openid;
};

 


获取到openid就离成功不远了。
4.通过openid发送红包(不要看我的返回值redenvelope具体需求具体分析)
 
  1 public String   sendRedEnvelopes(String openId,String id) throws Exception {
  2     String  redenvelope="";
  3     //具体参数查看具体实体类,实体类中的的参数参考微信的红包发放接口,这里你直接用map,进行设置参数也可以。。。
  4   
  5     //转换成发送给为微信的参数的xml
  6     SendRedPackBack sendRedPackBack=new SendRedPackBack();
  7     sendRedPackBack.setNonce_str(MoneyUtils.buildRandom());
  8     sendRedPackBack.setMch_billno(MoneyUtils.getOrderNo());
  9     sendRedPackBack.setMch_id(参数实体里有我就不举例子了);
 10     sendRedPackBack.setWxappid();
 11     sendRedPackBack.setSend_name();
 12     sendRedPackBack.setRe_openid(openId);
 13     sendRedPackBack.setTotal_amount();
 14     sendRedPackBack.setTotal_num();
 15     sendRedPackBack.setWishing();
 16     sendRedPackBack.setClient_ip();
 17     sendRedPackBack.setAct_name();
 18     //将实体类转换为url形式
 19     String urlParamsByMap = Tool.getUrlParamsByMap(Tool.toMap(sendRedPackBack));
 20     //拼接我们再前期准备好的API密钥,前期准备第5条
 21     urlParamsByMap += "&key="+证书秘钥;
 22     //进行签名,需要说明的是,如果内容包含中文的话,要使用utf-8进行md5签名,不然会签名错误
 23     String sign = Tool.parseStrToMd5L32(urlParamsByMap).toUpperCase();
 24     sendRedPackBack.setSign(sign);
 25     //微信要求按照参数名ASCII字典序排序,这里巧用treeMap进行字典排序
 26     TreeMap treeMap = new TreeMap(Tool.toMap(sendRedPackBack));
 27     //然后转换成xml格式
 28     String soapRequestData = Tool.getSoapRequestData(treeMap);
 29     //发起请求前准备
 30     RequestBody body = RequestBody.create(MediaType.parse("text/xml;charset=UTF-8"), soapRequestData);
 31     Request request = new Request.Builder()
 32             .url("https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack")
 33             .post(body)
 34             .build();
 35     //为http请求设置证书
 36     SSLSocketFactory socketFactory = getSSL().getSocketFactory();
 37     X509TrustManager x509TrustManager = Platform.get().trustManager(socketFactory);
 38     OkHttpClient okHttpClient = new OkHttpClient.Builder().sslSocketFactory(socketFactory, x509TrustManager).build();
 39     //得到输出内容
 40     Response response = okHttpClient.newCall(request).execute();
 41     String content = response.body().string();
 42     System.out.println(content);
 43     //解析返回数据
 44     RedDevelop redDevelop= xmlBean(content,id);
 45     if(redDevelop.getReturnCode().equals("SUCCESS")){
 46         if(redDevelop.getResultCode().equals("SUCCESS")){
 47             redenvelope= String.valueOf(redDevelop.getTotalAmount()/100);
 48             //保存红包已经被领取
 49             newUseRegisterService.setRedPack(id);
 50         }else {
 51             redenvelope="fail";//接口调取成功但是获取openid失败
 52         }
 53     }else {
 54         redenvelope="fail";//接口调取失败
 55     }
 56     return redenvelope;
 57 }
 58 
 59 public  SSLContext getSSL() throws KeyStoreException, IOException, CertificateException, NoSuchAlgorithmException, UnrecoverableKeyException, KeyManagementException {
 60   
 61     KeyStore keyStore = KeyStore.getInstance("PKCS12");
 62     String mchId=你的微信商户id;
 63     //证书位置自己定义
 64     FileInputStream instream = new FileInputStream(new File(证书路径));
 65     try {
 66         keyStore.load(instream, mchId.toCharArray());
 67     } finally {
 68         instream.close();
 69     }
 70     SSLContext sslcontext = SSLContexts.custom()
 71             .loadKeyMaterial(keyStore, mchId.toCharArray())
 72             .build();
 73     return sslcontext;
 74 }
 75 
 76 //这部分是将调取成功后的xml返回值转成实体继续保存,实体就不提供了
 77 public RedDevelop xmlBean(String content,String id){
 78 
 79     RedDevelop redDevelop=new RedDevelop();
 80     Document dom= null;
 81     try {
 82         dom = DocumentHelper.parseText(content);
 83     } catch (DocumentException e) {
 84         e.printStackTrace();
 85     }
 86     Element root=dom.getRootElement();
 87     String returnCode=root.element("return_code").getText();
 88     String returnMsg=root.element("return_msg").getText();
 89     String resultCode=root.element("result_code").getText();
 90     String errCode=root.element("err_code").getText();
 91     String errCodeDes=root.element("err_code_des").getText();
 92     String mchBillno=root.element("mch_billno").getText();
 93     String mchId=root.element("mch_id").getText();
 94     String wxappid=root.element("wxappid").getText();
 95     String reOpenid=root.element("re_openid").getText();
 96     String totalAmount=root.element("total_amount").getText();
 97     redDevelop.setReturnCode(returnCode);
 98     redDevelop.setReturnMsg(returnMsg);
 99     redDevelop.setResultCode(resultCode);
100     redDevelop.setErrCode(errCode);
101     redDevelop.setErrCodeDes(errCodeDes);
102     redDevelop.setMchBillno(mchBillno);
103     redDevelop.setMchId(mchId);
104     redDevelop.setWxappid(wxappid);
105     redDevelop.setReOpenid(reOpenid);
106     redDevelop.setTotalAmount(Integer.valueOf(totalAmount));
107     redDevelop.setRegisterId(id);
108     redDevelopService.save(redDevelop);
109     return redDevelop;
110 }

 

实体类:
package com.sgepm.modules.marketing.entity;

import com.sgepm.common.persistence.DataEntity;


/**
 * Created by zxw on 2018-7-27
 */
public class SendRedPackBack {
    private String nonce_str; //随机字符串
    private String sign;      //签名
    private String mch_billno;//商户订单号
    private String mch_id;      //商户号
    private String mchId;      //商户号
    private String wxappid;     //公众账号appid
    private String send_name;       //商户名称
    private String re_openid;       //用户openid
    private Integer total_amount;        //付款金额 单位分
    private Integer total_num;    //付款人数
    private String wishing;         //红包祝福语
    private String client_ip;       //调用接口的机器Ip地址
    private String act_name;        //活动名称
    private String remark;          //备注
    private String scene_id;        //场景id
    private String risk_info;       //活动信息
    private String consume_mch_id;  //资金授权商户号

    public SendRedPackBack() {
    }

    public SendRedPackBack(String nonce_str, String mch_billno, String mch_id, String wxappid, String send_name, String re_openid, Integer total_amount, Integer total_num, String wishing, String client_ip, String act_name) {
        this.nonce_str = nonce_str;
        this.mch_billno = mch_billno;
        this.mch_id = mch_id;
        this.wxappid = wxappid;
        this.send_name = send_name;
        this.re_openid = re_openid;
        this.total_amount = total_amount;
        this.total_num = total_num;
        this.wishing = wishing;
        this.client_ip = client_ip;
        this.act_name = act_name;
    }


    public String getNonce_str() {
        return nonce_str;
    }

    public void setNonce_str(String nonce_str) {
        this.nonce_str = nonce_str;
    }

    public String getSign() {
        return sign;
    }

    public void setSign(String sign) {
        this.sign = sign;
    }

    public String getMch_billno() {
        return mch_billno;
    }

    public void setMch_billno(String mch_billno) {
        this.mch_billno = mch_billno;
    }

    public String getMch_id() {
        return mch_id;
    }

    public void setMch_id(String mch_id) {
        this.mch_id = mch_id;
    }

    public String getWxappid() {
        return wxappid;
    }

    public void setWxappid(String wxappid) {
        this.wxappid = wxappid;
    }

    public String getSend_name() {
        return send_name;
    }

    public void setSend_name(String send_name) {
        this.send_name = send_name;
    }

    public String getRe_openid() {
        return re_openid;
    }

    public void setRe_openid(String re_openid) {
        this.re_openid = re_openid;
    }

    public Integer getTotal_amount() {
        return total_amount;
    }

    public void setTotal_amount(Integer total_amount) {
        this.total_amount = total_amount;
    }

    public Integer getTotal_num() {
        return total_num;
    }

    public void setTotal_num(Integer total_num) {
        this.total_num = total_num;
    }

    public String getWishing() {
        return wishing;
    }

    public void setWishing(String wishing) {
        this.wishing = wishing;
    }

    public String getClient_ip() {
        return client_ip;
    }

    public void setClient_ip(String client_ip) {
        this.client_ip = client_ip;
    }

    public String getAct_name() {
        return act_name;
    }

    public void setAct_name(String act_name) {
        this.act_name = act_name;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    public String getScene_id() {
        return scene_id;
    }

    public void setScene_id(String scene_id) {
        this.scene_id = scene_id;
    }

    public String getRisk_info() {
        return risk_info;
    }

    public void setRisk_info(String risk_info) {
        this.risk_info = risk_info;
    }

    public String getConsume_mch_id() {
        return consume_mch_id;
    }

    public void setConsume_mch_id(String consume_mch_id) {
        this.consume_mch_id = consume_mch_id;
    }

    public String getMchId() {
        return mchId;
    }

    public void setMchId(String mchId) {
        this.mchId = mchId;
    }


}

 


工具类:
package com.sgepm.common.utils.weixin;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.Charset;
import java.security.KeyStore;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;

import javax.net.ssl.SSLContext;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.Args;
import org.apache.http.util.CharArrayBuffer;
import org.apache.http.util.EntityUtils;


public class MoneyUtils {
   private static String appid = "";// 应用ID
   private static String appsecret = "";// 应用密钥
   private static String partner = "";// 微信支付商户号
   private static String partnerkey = "";// 财付通初始密�?
   private static String charset = "";

   /**
    * 随机16为数值
    * 
    * @return
    */
   public static String buildRandom() {
      String currTime = TenpayUtil.getCurrTime();
      String strTime = currTime.substring(8, currTime.length());
      int num = 1;
      double random = Math.random();
      if (random < 0.1) {
         random = random + 0.1;
      }
      for (int i = 0; i < 4; i++) {
         num = num * 10;
      }
      return (int) ((random * num)) + strTime;
   }

   /**
    * 获取ip
    * 
    * @param request
    * @return
    */
   public static String getIpAddr(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();
      }
      if (null == ip) {
         ip = "";
      }
      if (StringUtils.isNotEmpty(ip)) {
         String[] ipArr = ip.split(",");
         if (ipArr.length > 1) {
            ip = ipArr[0];
         }
      }
      return ip;
   }

   /**
    * 创建md5摘要,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。 sign
    */
   public static String createSign(Map<String, Object> map) {
      SortedMap<String, String> packageParams = new TreeMap<String, String>();
      for (Map.Entry<String, Object> m : map.entrySet()) {
         packageParams.put(m.getKey(), m.getValue().toString());
      }

      StringBuffer sb = new StringBuffer();
      Set<?> es = packageParams.entrySet();
      Iterator<?> it = es.iterator();
      while (it.hasNext()) {
         Map.Entry entry = (Map.Entry) it.next();
         String k = (String) entry.getKey();
         String v = (String) entry.getValue();
         if (!StringUtils.isEmpty(v) && !"sign".equals(k) && !"key".equals(k)) {
            sb.append(k + "=" + v + "&");
         }
      }
      sb.append("key=" + partnerkey);
       
      
      String sign = MD5Util.MD5Encode(sb.toString(), charset).toUpperCase();
      return sign;
   }

   public static String getOrderNo() {
      String order = partner
            + new SimpleDateFormat("yyyyMMdd").format(new Date());
      Random r = new Random();
      for (int i = 0; i < 10; i++) {
         order += r.nextInt(9);
      }
      return order;
   }

   /*
    * public static void main(String[] args) {
    * System.out.println(getOrderNo()); }
    */

   final static String KEYSTORE_FILE = "D:/works/cert/apiclient_cert.p12";
// final static String KEYSTORE_PASSWORD = "CDATA[签名错误";
   
   public static String doSendMoney(String url, String data) throws Exception {
      KeyStore keyStore  = KeyStore.getInstance("PKCS12");
       FileInputStream instream = new FileInputStream(new File(KEYSTORE_FILE));//P12文件目录
//    InputStream instream = MoneyUtils.class.getResourceAsStream("/apiclient_cert.p12");
        try {
            keyStore.load(instream, "pamtpamtpamtpamtpamtpamtpamtpamt".toCharArray());//这里写密码..默认是你的MCHID
        } finally {
            instream.close();
        }
        // Trust own CA and all self-signed certs
        SSLContext sslcontext = SSLContexts.custom()
                .loadKeyMaterial(keyStore, "pamtpamtpamtpamtpamtpamtpamtpamt".toCharArray())//这里也是写密码的
                .build();
        // Allow TLSv1 protocol only
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null,
              SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
        CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
        try {
           HttpPost httpost = new HttpPost(url); // 设置响应头信息
           httpost.addHeader("Connection", "keep-alive");
           httpost.addHeader("Accept", "*/*");
           httpost.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
           httpost.addHeader("Host", "api.mch.weixin.qq.com");
           httpost.addHeader("X-Requested-With", "XMLHttpRequest");
           httpost.addHeader("Cache-Control", "max-age=0");
           httpost.addHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) ");
          httpost.setEntity(new StringEntity(data, "UTF-8"));
            CloseableHttpResponse response = httpclient.execute(httpost);
            try {
                HttpEntity entity = response.getEntity();
                String jsonStr = toStringInfo(response.getEntity(),"UTF-8");
                
                //微信返回的报文时GBK,直接使用httpcore解析乱码
              //  String jsonStr = EntityUtils.toString(response.getEntity(),"UTF-8");
                EntityUtils.consume(entity);
               return jsonStr;
            } finally {
                response.close();
            }
        } finally {
            httpclient.close();
        }
   }
   
   private static String toStringInfo(HttpEntity entity, String defaultCharset) throws Exception, IOException{
      final InputStream instream = entity.getContent();
       if (instream == null) {
           return null;
       }
       try {
           Args.check(entity.getContentLength() <= Integer.MAX_VALUE,
                   "HTTP entity too large to be buffered in memory");
           int i = (int)entity.getContentLength();
           if (i < 0) {
               i = 4096;
           }
           Charset charset = null;
           
           if (charset == null) {
               charset = Charset.forName(defaultCharset);
           }
           if (charset == null) {
               charset = HTTP.DEF_CONTENT_CHARSET;
           }
           final Reader reader = new InputStreamReader(instream, charset);
           final CharArrayBuffer buffer = new CharArrayBuffer(i);
           final char[] tmp = new char[1024];
           int l;
           while((l = reader.read(tmp)) != -1) {
               buffer.append(tmp, 0, l);
           }
           return buffer.toString();
       } finally {
           instream.close();
       }
   }
   
   public static String createXML(Map<String, Object> map){
      String xml = "<xml>";
      Set<String> set = map.keySet();
      Iterator<String> i = set.iterator();
      while(i.hasNext()){
         String str = i.next();
         xml+="<"+str+">"+"<![CDATA["+map.get(str)+"]]>"+"</"+str+">";
      }
      xml+="</xml>";
      return xml;
   }
}

 


  1 package com.sgepm.common.utils.weixin;
  2 import org.apache.commons.lang3.RandomUtils;
  3 import org.apache.commons.lang3.StringUtils;
  4 import org.json.JSONException;
  5 import java.beans.BeanInfo;
  6 import java.beans.IntrospectionException;
  7 import java.beans.Introspector;
  8 import java.beans.PropertyDescriptor;
  9 import java.io.UnsupportedEncodingException;
 10 import java.lang.reflect.InvocationTargetException;
 11 import java.lang.reflect.Method;
 12 import java.security.MessageDigest;
 13 import java.security.NoSuchAlgorithmException;
 14 import java.util.HashMap;
 15 import java.util.Map;
 16 import java.util.TreeMap;
 17 import java.util.UUID;
 18 
 19 /**
 20  * Created by  on 2016/9/6.
 21  */
 22 public class Tool {
 23 
 24 
 25     /**
 26      * 获取订单号
 27      * @return
 28      */
 29     public static String getOrderNum(){
 30 
 31         return String.valueOf(System.currentTimeMillis())+getRandom4();
 32 
 33     }
 34 
 35 
 36     /**
 37      * 获取一个4位随机数
 38      * @return
 39      */
 40     public static int getRandom4(){
 41         int x = RandomUtils.nextInt(1000,9999);
 42         return x;
 43     }
 44 
 45     /**
 46      * 获取UUID
 47      * @return
 48      */
 49     public static String returnUUID() {
 50         return parseStrToMd5L32(UUID.randomUUID().toString());
 51     }
 52 
 53     /**
 54      * 获取md5
 55      * @param str
 56      * @return
 57      */
 58     public static String parseStrToMd5L32(String str) {
 59         return parseStrToMd5L32(str,"utf-8");
 60     }
 61 
 62     public static String parseStrToMd5L32(String str, String charset) {
 63         String reStr = null;
 64         try {
 65             MessageDigest md5 = MessageDigest.getInstance("MD5");
 66             byte[] bytes = md5.digest(str.getBytes(charset));
 67             StringBuffer stringBuffer = new StringBuffer();
 68             for (byte b : bytes) {
 69                 int bt = b & 0xff;
 70                 if (bt < 16) {
 71                     stringBuffer.append(0);
 72                 }
 73                 stringBuffer.append(Integer.toHexString(bt));
 74             }
 75             reStr = stringBuffer.toString();
 76         } catch (NoSuchAlgorithmException e) {
 77             e.printStackTrace();
 78         } catch (UnsupportedEncodingException e) {
 79             e.printStackTrace();
 80         }
 81         return reStr;
 82     }
 83 
 84     /**
 85      * 将map转换成url
 86      * @param map
 87      * @return
 88      */
 89     public static String getUrlParamsByMap(Map<String, String> map) {
 90         if (map == null) {
 91             return "";
 92         }
 93         StringBuffer sb = new StringBuffer();
 94         map = new TreeMap<String, String>(map);
 95         for (Map.Entry<String, String> entry : map.entrySet()) {
 96             if(entry.getValue() == null){
 97                 continue;
 98             }
 99             sb.append(entry.getKey() + "=" + entry.getValue());
100             sb.append("&");
101         }
102         String s = sb.toString();
103         if (s.endsWith("&")) {
104             s = StringUtils.substringBeforeLast(s, "&");
105         }
106         return s;
107     }
108 
109     /**
110      * Sha1加密方法
111      */
112     public static String getSha1(String decript) {
113         try {
114             MessageDigest digest = MessageDigest
115                     .getInstance("SHA-1");
116             digest.update(decript.getBytes());
117             byte messageDigest[] = digest.digest();
118             // Create Hex String
119             StringBuffer hexString = new StringBuffer();
120             // 字节数组转换为 十六进制 数
121             for (int i = 0; i < messageDigest.length; i++) {
122                 String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
123                 if (shaHex.length() < 2) {
124                     hexString.append(0);
125                 }
126                 hexString.append(shaHex);
127             }
128             return hexString.toString();
129 
130         } catch (NoSuchAlgorithmException e) {
131             e.printStackTrace();
132         }
133         return "";
134     }
135 
136 
137     public static Map toMap(Object bean) {
138         Class<? extends Object> clazz = bean.getClass();
139         Map<Object, Object> returnMap = new HashMap<Object, Object>();
140         BeanInfo beanInfo = null;
141         try {
142             beanInfo = Introspector.getBeanInfo(clazz);
143             PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
144             for (int i = 0; i < propertyDescriptors.length; i++) {
145                 PropertyDescriptor descriptor = propertyDescriptors[i];
146                 String propertyName = descriptor.getName();
147                 if (!propertyName.equals("class")) {
148                     Method readMethod = descriptor.getReadMethod();
149                     Object result = null;
150                     result = readMethod.invoke(bean, new Object[0]);
151                     if (null != propertyName) {
152                         propertyName = propertyName.toString();
153                     }
154                     if (null != result) {
155                         result = result.toString();
156                         returnMap.put(propertyName, result);
157                     }
158                 }
159             }
160         } catch (IntrospectionException e) {
161             System.out.println("分析类属性失败");
162         } catch (IllegalAccessException e) {
163             System.out.println("实例化 JavaBean 失败");
164         } catch (IllegalArgumentException e) {
165             System.out.println("映射错误");
166         } catch (InvocationTargetException e) {
167             System.out.println("调用属性的 setter 方法失败");
168         }
169         return returnMap;
170     }
171 
172     /**
173      * 凑成xml格式字符串
174      *
175      * @return
176      */
177     public static String getSoapRequestData(Map<String, String> map) throws JSONException {
178 
179         StringBuffer sb = new StringBuffer();
180 
181         sb.append("<xml>");
182 
183         for (Map.Entry<String, String> entry : map.entrySet()) {
184 
185             sb.append("<" + entry.getKey() + ">" + entry.getValue() + "</" + entry.getKey() + ">");
186         }
187 
188         sb.append("</xml>");
189         return sb.toString();
190     }
191 
192 
193 }

 


接口返回类:

  1 package com.sgepm.modules.marketing.entity;
  2 
  3 import org.hibernate.validator.constraints.Length;
  4 import com.sgepm.modules.sys.entity.Office;
  5 
  6 import com.sgepm.common.persistence.DataEntity;
  7 
  8 /**
  9  * 红包管理Entity
 10  * @author zxw
 11  * @version 2018-08-02
 12  */
 13 public class RedDevelop extends DataEntity<RedDevelop> {
 14    
 15    private static final long serialVersionUID = 1L;
 16    private String returnCode;    // 返回状态码
 17    private String returnMsg;     // 返回信息
 18    private String resultCode;    // 业务结果
 19    private String errCode;       // 错误代码
 20    private String errCodeDes;    // 错误代码描述
 21    private String mchBillno;     // 商户订单号
 22    private String mchId;     // 商户号
 23    private String wxappid;       // 公众账号appid
 24    private String reOpenid;      // 用户openid
 25    private Integer totalAmount;      // 付款金额
 26    private String sendListid;    // 微信单号
 27    private String registerId;    //注册人id
 28    private Office office;    // 归属机构
 29    
 30    public RedDevelop() {
 31       super();
 32    }
 33 
 34    public RedDevelop(String id){
 35       super(id);
 36    }
 37 
 38    @Length(min=0, max=16, message="返回状态码长度必须介于 0 和 16 之间")
 39    public String getReturnCode() {
 40       return returnCode;
 41    }
 42 
 43    public void setReturnCode(String returnCode) {
 44       this.returnCode = returnCode;
 45    }
 46    
 47    @Length(min=0, max=128, message="返回信息长度必须介于 0 和 128 之间")
 48    public String getReturnMsg() {
 49       return returnMsg;
 50    }
 51 
 52    public void setReturnMsg(String returnMsg) {
 53       this.returnMsg = returnMsg;
 54    }
 55    
 56    @Length(min=0, max=16, message="业务结果长度必须介于 0 和 16 之间")
 57    public String getResultCode() {
 58       return resultCode;
 59    }
 60 
 61    public void setResultCode(String resultCode) {
 62       this.resultCode = resultCode;
 63    }
 64    
 65    @Length(min=0, max=32, message="错误代码长度必须介于 0 和 32 之间")
 66    public String getErrCode() {
 67       return errCode;
 68    }
 69 
 70    public void setErrCode(String errCode) {
 71       this.errCode = errCode;
 72    }
 73    
 74    @Length(min=0, max=128, message="错误代码描述长度必须介于 0 和 128 之间")
 75    public String getErrCodeDes() {
 76       return errCodeDes;
 77    }
 78 
 79    public void setErrCodeDes(String errCodeDes) {
 80       this.errCodeDes = errCodeDes;
 81    }
 82    
 83    @Length(min=0, max=28, message="商户订单号长度必须介于 0 和 28 之间")
 84    public String getMchBillno() {
 85       return mchBillno;
 86    }
 87 
 88    public void setMchBillno(String mchBillno) {
 89       this.mchBillno = mchBillno;
 90    }
 91    
 92    @Length(min=0, max=32, message="商户号长度必须介于 0 和 32 之间")
 93    public String getMchId() {
 94       return mchId;
 95    }
 96 
 97    public void setMchId(String mchId) {
 98       this.mchId = mchId;
 99    }
100    
101    @Length(min=0, max=32, message="公众账号appid长度必须介于 0 和 32 之间")
102    public String getWxappid() {
103       return wxappid;
104    }
105 
106    public void setWxappid(String wxappid) {
107       this.wxappid = wxappid;
108    }
109    
110    @Length(min=0, max=32, message="用户openid长度必须介于 0 和 32 之间")
111    public String getReOpenid() {
112       return reOpenid;
113    }
114 
115    public void setReOpenid(String reOpenid) {
116       this.reOpenid = reOpenid;
117    }
118    
119    public Integer getTotalAmount() {
120       return totalAmount;
121    }
122 
123    public void setTotalAmount(Integer totalAmount) {
124       this.totalAmount = totalAmount;
125    }
126    
127    @Length(min=0, max=32, message="微信单号长度必须介于 0 和 32 之间")
128    public String getSendListid() {
129       return sendListid;
130    }
131 
132    public void setSendListid(String sendListid) {
133       this.sendListid = sendListid;
134    }
135    
136    public Office getOffice() {
137       return office;
138    }
139 
140    public void setOffice(Office office) {
141       this.office = office;
142    }
143 
144    public String getRegisterId() {
145       return registerId;
146    }
147 
148    public void setRegisterId(String registerId) {
149       this.registerId = registerId;
150    }
151 }

 


6.这就是全部过程如果有遗漏大家多多体谅,毕竟这些是我用好长时间整理出来的 希望对你们有帮助 晒几张图片

  

如果需要单独做红包的特效页面也可以联系我 我这里有领取红包的模板和js。



posted @ 2018-08-15 22:33  就是这个biu  阅读(603)  评论(0)    收藏  举报