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。