微信支付订单工具类
2016-12-28 17:15
225 查看
订单工具
package com.ghgcn.antifakeApp.wxpay.util; import java.io.IOException; import java.io.InputStream; import java.io.StringReader; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Random; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; import javax.servlet.http.HttpServletRequest; import org.apache.commons.httpclient.NameValuePair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory; import com.ghgcn.antifakeApp.alipay.config.AlipayConfig; import com.ghgcn.antifakeApp.alipay.util.SignUtils; import com.ghgcn.antifakeApp.wxpay.config.WxpayConfig; import com.legendshop.model.entity.SubSettlement; import com.legendshop.util.Arith; /** * 微信订单工具类 * @ClassName: WxOrderInfoUtil * @Description: * @author 刘楠 * @date 2016-12-23 上午10:57:47 * */ public class WxOrderInfoUtil { static Logger logger = LoggerFactory.getLogger(WxOrderInfoUtil.class); /** * @throws UnsupportedEncodingException * 生成诵支付订单 * @Title: buildOrderParamMap * @Description: TODO(这里用一句话描述这个方法的作用) * @param @param settlement * @param @param ip * @param @return 设定文件 * @return String 返回类型 * @throws */ public static String buildOrderParamMap(SubSettlement settlement, String ip,String subNums) { SortedMap<String, String> keyValues = new TreeMap<String, String>(); // 微信开放平台审核通过的应用APPID keyValues.put("appid", WxpayConfig.APP_ID); // 微信支付分配的商户号 keyValues.put("mch_id", WxpayConfig.MCH_ID); // 随机字符串,不长于32位。推荐随机数生成算法 keyValues.put("nonce_str", genNonceStr()); // keyValues.put("body", "正品管家-订单编号 "+subNums); // 商户订单号 keyValues.put("out_trade_no", settlement.getSubSettlementSn()); // 订单总金额,单位为分,详见支付金额 keyValues.put("total_fee", ((int) (settlement.getCashAmount() * 100))+""); keyValues.put("spbill_create_ip", ip); keyValues.put("notify_url", WxpayConfig.notify_url); keyValues.put("trade_type", WxpayConfig.trade_type); /* for(Map.Entry<String, String> entry:keyValues.entrySet()){ String key = entry.getKey(); String value = entry.getValue(); System.out.println("key "+key+ ": value="+value); } */ String sign = genAppSign(keyValues); keyValues.put("sign", sign); String unifiedorder = toXml(keyValues); return unifiedorder; } /** * 获取随机号 * @Title: genNonceStr * @Description: TODO(这里用一句话描述这个方法的作用) * @param @return 设定文件 * @return String 返回类型 * @throws */ private static String genNonceStr() { Random random = new Random(); return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes()); } /** * 获取微信Sign * @Title: genAppSign * @Description: TODO(这里用一句话描述这个方法的作用) * @param @param map * @param @return 设定文件 * @return String 返回类型 * @throws */ private static String genAppSign(Map<String, String> map) { List<String> keys = new ArrayList<String>(map.keySet()); // key排序 Collections.sort(keys); StringBuilder authInfo = new StringBuilder(); for (int i = 0; i < keys.size(); i++) { String key = keys.get(i); String value = map.get(key); authInfo.append(key); authInfo.append("="); authInfo.append(value); authInfo.append("&"); } /*String tailKey = keys.get(keys.size() - 1); String tailValue = map.get(tailKey); authInfo.append(tailKey); authInfo.append("="); authInfo.append(tailValue); */ authInfo.append("key"); authInfo.append("="); authInfo.append(WxpayConfig.API_KEY); //生成微信签名 String appSign=null; try { appSign = MD5.getMessageDigest(authInfo.toString().getBytes("utf-8")).toUpperCase(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return appSign; } /** * 转化为XML * @Title: toXml * @Description: TODO(这里用一句话描述这个方法的作用) * @param @param params * @param @return 设定文件 * @return String 返回类型 * @throws */ public static String toXml(Map<String, String> params) { StringBuilder sb = new StringBuilder(); sb.append("<xml>"); for (Map.Entry<String, String> entry : params.entrySet()) { sb.append("<" + entry.getKey() + ">"); sb.append("<![CDATA["+entry.getValue()+"]]>"); sb.append("</" + entry.getKey() + ">"); } sb.append("</xml>"); logger.debug("orion" + sb.toString()); /** *转化为u8 */ String xmlU8String = null; try { // xmlU8String = new String(sb.toString().getBytes("utf-8"),"ISO8859-1"); xmlU8String = new String(sb.toString().getBytes("utf-8"),"ISO8859-1"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return xmlU8String; } /** * 将预支付回调解析 * 将XML解析为MAP * @Title: decodeXml * @Description: * @param @param content * @param @return 设定文件 * @return Map<String,String> 返回类型 * @throws */ public static Map<String, String> decodeXml(String content) { Map<String, String> map =null; try { XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); //从工厂获得解析器 ---生产线 XmlPullParser pullParser = factory.newPullParser(); pullParser.setInput(new StringReader(content)); int eventType = pullParser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_DOCUMENT: map = new HashMap<String, String>(); break; case XmlPullParser.START_TAG: String key = pullParser.getName(); if (key.equals("xml")) break; String value = pullParser.nextText(); map.put(key, value); break; case XmlPullParser.END_TAG: break; } eventType = pullParser.next(); } //return map; } catch (Exception e) { logger.debug("orion", e.toString()); } return map; } /** * 生成APP接口需要的参数 * @Title: buildAppParamMap * @Description: TODO(这里用一句话描述这个方法的作用) * @param @param prepay_id * @param @return 设定文件 * @return Map<String,String> 返回类型 * @throws */ public static Map<String, String> buildAppParamMap(String prepay_id){ SortedMap<String, String> params = new TreeMap<>(); //应用ID params.put("appid", WxpayConfig.APP_ID); //商户号 params.put("partnerid", WxpayConfig.MCH_ID); //预支付交易会话ID params.put("prepayid", prepay_id); //Sign=WXPay 暂填写固定值Sign=WXPay params.put("package", WxpayConfig.Wx_PACKAGE); //noncestr 随机字符串,不长于32位。推荐随机数生成算法 params.put("noncestr", genNonceStr()); //时间戳 timestamp String(10) 是 1412000000 时间戳,请见接口规则-参数规定 //IOS 只能是10位,不能使用System.currentTimeMillis(); SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss", Locale.getDefault()); Date date = new Date(); params.put("timestamp", format.format(date)+""); String sign =genAppSign(params); params.put("sign", sign); return params; } /** * 解析微信回调 * @Title: parseXml * @Description: TODO(这里用一句话描述这个方法的作用) * @param @param inputStream * @param @return * @param @throws XmlPullParserException * @param @throws IOException 设定文件 * @return Map<String,String> 返回类型 * @throws */ public static Map<String, String> parseXml(InputStream inputStream )throws XmlPullParserException, IOException { //InputStream inputStream = request.getInputStream(); Map<String, String> map = null; XmlPullParser pullParser = XmlPullParserFactory.newInstance().newPullParser(); pullParser.setInput(inputStream, "UTF-8"); // 为xml设置要解析的xml数据 int eventType = pullParser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_DOCUMENT: map = new HashMap<String, String>(); break; case XmlPullParser.START_TAG: String key = pullParser.getName(); if (key.equals("xml")) break; String value = pullParser.nextText(); map.put(key, value); break; case XmlPullParser.END_TAG: break; } eventType = pullParser.next(); } return map; } public static void main(String[] args) { XmlPullParserFactory factory; try { factory = XmlPullParserFactory.newInstance(); System.out.println(factory); XmlPullParser pullParser = factory.newPullParser(); System.err.println(pullParser); } catch (XmlPullParserException e) { // TODO Auto-generated catch block e.printStackTrace(); } //从工厂获得解析器 ---生产线 } /** * 用于验证签名 * @Title: createSign * @Description: TODO(这里用一句话描述这个方法的作用) * @param @param map * @param @return 设定文件 * @return String 返回类型 * @throws */ public static String createSign(Map<String, String> map) { List<String> keys = new ArrayList<String>(map.keySet()); // key排序 Collections.sort(keys); StringBuilder authInfo = new StringBuilder(); for (int i = 0; i < keys.size(); i++) { String key = keys.get(i); String value = map.get(key); if (null != value && !"".equals(value) && !"sign".equals(key)&& !"key".equals(key)) { authInfo.append(key); authInfo.append("="); authInfo.append(value); authInfo.append("&"); } } /*String tailKey = keys.get(keys.size() - 1); String tailValue = map.get(tailKey); authInfo.append(tailKey); authInfo.append("="); authInfo.append(tailValue); */ /** 支付密钥必须参与加密,放在字符串最后面 */ authInfo.append("key"); authInfo.append("="); authInfo.append(WxpayConfig.API_KEY); //生成微信签名 String checkSign=null; try { checkSign = MD5.getMessageDigest(authInfo.toString().getBytes("utf-8")).toUpperCase(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return checkSign; } }
相关文章推荐
- 微信小程序——自定义圆形进度条
- 机器学习公众号推荐
- 基于企业号微信的扫码登录业务流程
- 微信小程序 1 月 9 日正式发布!张小龙解答了 10 大疑问
- 重力操作图片移动(小程序)
- 微信小程序之我见
- 17年1月9日,小程序来了。深度解析2017微信公开课
- 17年1月9日,小程序来了。深度解析2017微信公开课
- 张小龙首次全面阐述小程序,定1月9日上线(内附小程序开发课程)
- 张小龙在2017微信公开课PRO版讲了什么(附演讲实录和2016微信数据报告)
- 小程序-页面生命周期
- 微信扫码支付
- 小程序1月9号将上线,官方详解七大能力
- Java-Web微信网页支付开发流程以及各种坑
- 小程序组件之时间戳转化为几天前,几小时前,几分钟前
- Android仿微信朋友圈图片查看器
- 微信扫码支付(模式一)
- 微信小程序完整开发过程
- 百度代码分享到QQ、微信、人人网等
- 小程序之switch...case...break