微信支付-----统一下单action



public class PayAction extends BaseAction {
    
    public String JsapiPay(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception {
        PrintWriter out = response.getWriter();
        //商品描述  商品或支付单简要描述
        String body = request.getParameter("body");
        //商户订单号     商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
        String out_trade_no = request.getParameter("out_trade_no");
        //总金额    订单总金额,只能为整数,详见支付金额   注意:金额不带小数点,最小为分,即1元=100分,传数据即可
        String total_fee = request.getParameter("total_fee");
        //用户标识  trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识
        String openid = request.getParameter("openid");
        
        
        String MCH_ID = PropUtil.getPropertyValue("wx.sz.mchid", "").replace("\"","");
        //接收微信支付异步通知回调地址
        String NOTIFY_URL = PropUtil.getPropertyValue("wx.sz.notify.url", "").replace("\"","");
        //String openid=request.getParameter("openid");
        SortedMap<Object,Object> parameters = new TreeMap<Object,Object>();
        //公众账号ID  微信分配的公众账号ID(企业号corpid即为此appId)
        parameters.put("appid", GetTokenUtil.appid);
        //商户号    微信支付分配的商户号
        parameters.put("mch_id", MCH_ID);
        //随机字符串  随机字符串,不长于32位。推荐随机数生成算法
        parameters.put("nonce_str", GetTokenUtil.noncestr);
        //商品描述  商品或支付单简要描述
        parameters.put("body", body);
        SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmss");
        
        /*//生成商品订单号 测试用时间作为订单号,具体的业务中请传入订单号,并且保持唯一性
        Calendar start1=Calendar.getInstance();
        String time_start1 =sdf.format(start1.getTimeInMillis());*/
        
        
        //商户订单号     商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
        parameters.put("out_trade_no", out_trade_no);
        //总金额    订单总金额,只能为整数,详见支付金额
        parameters.put("total_fee", total_fee);
        //终端IP  APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IP。
        parameters.put("spbill_create_ip",request.getRemoteHost());
        System.out.println("用户ip地址为:"+request.getRemoteHost());
        
        //通知地址    接收微信支付异步通知回调地址
        parameters.put("notify_url", NOTIFY_URL);
        
        //当前时间
        Calendar start=Calendar.getInstance();
        String time_start =sdf.format(start.getTimeInMillis());
        //交易起始时间  订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则
        parameters.put("time_start", time_start);
        //订单失效时间 订单失效时间为下单后30分钟,30分钟未支付则一律作废,如果有需求可以调整时间
        Calendar expire=Calendar.getInstance();
        int cont = Integer.parseInt(PropUtil.getPropertyValue("wx.sz.pay.out.of.time", "30").replace("\"",""));
        
        expire.add(Calendar.MINUTE,cont);
        String time_expire=sdf.format(expire.getTimeInMillis());
        //交易结束时间   订单失效时间,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为20091227091010。其他详见时间规则注意:最短失效时间间隔必须大于5分钟
        parameters.put("time_expire", time_expire);
        
        //交易类型    取值如下:JSAPI,NATIVE,APP,WAP,详细说明见参数规定
        parameters.put("trade_type", "JSAPI");
        //用户标识  trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识。
        //openid如何获取,可参考【获取openid】
        parameters.put("openid", openid);
        String sign = SignUtil.createSign("UTF-8", parameters);
        parameters.put("sign", sign);
        System.out.println("===========微信支付签名===========为:"+sign);
        String requestXML = SignUtil.getRequestXml(parameters);
        String unify_url = PropUtil.getPropertyValue("wx.sz.pay.unify", "https://api.mch.weixin.qq.com/pay/unifiedorder").replace("\"","");
        
        String retxml = HttpsUtil.httpsReq(unify_url, "POST", requestXML);
        Map<String, String> map =  MessageUtil.parsePayXml(retxml);
        String prepay_id = null;
        String return_code = null;
        String result_code = null;
        if (map.size()>0) {
            return_code =map.get("return_code");
            result_code =map.get("result_code");
            if ("SUCCESS".equals(return_code)&&"SUCCESS".equals(result_code)) {
                System.out.println("下单成功!");
                prepay_id =map.get("prepay_id");
                System.out.println("生成预订单的id:"+prepay_id);
                //获取版本号
                String userAgent = request.getHeader("user-agent");
                System.out.println("");
                //"Mozilla/5.0(iphone;CPU iphone OS 5_1_1 like Mac OS X) AppleWebKit/534.46(KHTML,like Geocko) Mobile/9B206 MicroMessenger/5.0";  
                char agent = userAgent.charAt(userAgent.indexOf("MicroMessenger")+15);  
                if (prepay_id!=""||prepay_id!=null) {
                    //生成时间戳
                    String    timestamp=Long.toString(new Date().getTime()).substring(0, 10);
                    SortedMap<Object,Object> params = new TreeMap<Object,Object>();
                    params.put("appId", GetTokenUtil.appid);
                    params.put("timeStamp", timestamp);
                    params.put("nonceStr",  GetTokenUtil.noncestr);
                    params.put("package", "prepay_id="+prepay_id);
                    params.put("signType", "MD5");
                    String paySign =  SignUtil.createSign("UTF-8", params);
                    params.put("packageValue", "prepay_id="+prepay_id);    //这里用packageValue是预防package是关键字在js获取值出错
                    params.put("paySign", paySign);                     //paySign的生成规则和Sign的生成规则一致
                    params.put("agent", agent);//微信版本号,用于前面提到的判断用户手机微信的版本是否是5.0以上版本。
                    String ret = JSONObject.fromObject(params).toString();
                    out.println(ret);
                }else {
                    out.println("");
                }
            }else {
                out.println("");
            }
        
        }else {
            out.println("");
        }
        return null;
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

微信支付-----统一下单action

上一篇:微信支付--MD5util


下一篇:微信支付--异步处理支付结果