微信支付订单工具类

订单工具

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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值