分享

java版app微信支付服务端代码【手机app微信支付】

 WindySky 2016-08-08

老早就像做支付模块的东西,因为觉得很高大上,很早就开始把微信支付模块的重心签名给做好了,一直就缺个商家的key,现在有幸来电商公司,哈哈,果然一切很顺利,能够很给力地App端提供支持;


个人觉得核心部分的代码:

签名:

  1. //参数:开始生成签名  
  2.         SortedMap<Object,Object> parameters = new TreeMap<Object,Object>();  
  3.         parameters.put("appid", appid);  
  4.         parameters.put("mch_id", mch_id);  
  5.         parameters.put("nonce_str", nonce_str);  
  6.         parameters.put("body", body);  
  7.         parameters.put("nonce_str", nonce_str);  
  8.         parameters.put("detail", detail);  
  9.         parameters.put("attach", attach);  
  10.         parameters.put("out_trade_no", out_trade_no);  
  11.         parameters.put("total_fee", total_fee);  
  12.         parameters.put("time_start", time_start);  
  13.         parameters.put("time_expire", time_expire);  
  14.         parameters.put("notify_url", notify_url);  
  15.         parameters.put("trade_type", trade_type);  
  16.         parameters.put("spbill_create_ip", spbill_create_ip);  

  1. /** 
  2.      * 微信支付签名算法sign 
  3.      * @param characterEncoding 
  4.      * @param parameters 
  5.      * @return 
  6.      */  
  7.     @SuppressWarnings("rawtypes")  
  8.     public static String createSign(String characterEncoding,SortedMap<Object,Object> parameters){  
  9.         StringBuffer sb = new StringBuffer();  
  10.         Set es = parameters.entrySet();//所有参与传参的参数按照accsii排序(升序)  
  11.         Iterator it = es.iterator();  
  12.         while(it.hasNext()) {  
  13.             Map.Entry entry = (Map.Entry)it.next();  
  14.             String k = (String)entry.getKey();  
  15.             Object v = entry.getValue();  
  16.             if(null != v && !"".equals(v)   
  17.                     && !"sign".equals(k) && !"key".equals(k)) {  
  18.                 sb.append(k + "=" + v + "&");  
  19.             }  
  20.         }  
  21.         sb.append("key=" + Key);  
  22.         System.out.println("字符串拼接后是:"+sb.toString());  
  23.         String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();  
  24.         return sign;  
  25.     }  

将一坨参数包装成XML格式丢给微信:

  1. /** 
  2.      * 构造xml参数 
  3.      * @param xml 
  4.      * @return 
  5.      */  
  6.     public static String xmlInfo(Unifiedorder unifiedorder){  
  7.         //构造xml参数的时候,至少有10个必传参数  
  8.         /* 
  9.          * <xml> 
  10.                <appid>wx2421b1c4370ec43b</appid> 
  11.                <attach>支付测试</attach> 
  12.                <body>JSAPI支付测试</body> 
  13.                <mch_id>10000100</mch_id> 
  14.                <nonce_str>1add1a30ac87aa2db72f57a2375d8fec</nonce_str> 
  15.                <notify_url>http://wxpay.weixin.qq.com/pub_v2/pay/notify.v2.php</notify_url> 
  16.                <openid>oUpF8uMuAJO_M2pxb1Q9zNjWeS6o</openid> 
  17.                <out_trade_no>1415659990</out_trade_no> 
  18.                <spbill_create_ip>14.23.150.211</spbill_create_ip> 
  19.                <total_fee>1</total_fee> 
  20.                <trade_type>JSAPI</trade_type> 
  21.                <sign>0CB01533B8C1EF103065174F50BCA001</sign> 
  22.             </xml> 
  23.          */  
  24.   
  25.         if(unifiedorder!=null){  
  26.             StringBuffer bf = new StringBuffer();  
  27.             bf.append("<xml>");  
  28.   
  29.             bf.append("<appid><![CDATA[");  
  30.             bf.append(unifiedorder.getAppid());  
  31.             bf.append("]]></appid>");  
  32.   
  33.             bf.append("<mch_id><![CDATA[");  
  34.             bf.append(unifiedorder.getMch_id());  
  35.             bf.append("]]></mch_id>");  
  36.   
  37.             bf.append("<nonce_str><![CDATA[");  
  38.             bf.append(unifiedorder.getNonce_str());  
  39.             bf.append("]]></nonce_str>");  
  40.   
  41.             bf.append("<sign><![CDATA[");  
  42.             bf.append(unifiedorder.getSign());  
  43.             bf.append("]]></sign>");  
  44.   
  45.             bf.append("<body><![CDATA[");  
  46.             bf.append(unifiedorder.getBody());  
  47.             bf.append("]]></body>");  
  48.   
  49.             bf.append("<detail><![CDATA[");  
  50.             bf.append(unifiedorder.getDetail());  
  51.             bf.append("]]></detail>");  
  52.   
  53.             bf.append("<attach><![CDATA[");  
  54.             bf.append(unifiedorder.getAttach());  
  55.             bf.append("]]></attach>");  
  56.   
  57.             bf.append("<out_trade_no><![CDATA[");  
  58.             bf.append(unifiedorder.getOut_trade_no());  
  59.             bf.append("]]></out_trade_no>");  
  60.   
  61.             bf.append("<total_fee><![CDATA[");  
  62.             bf.append(unifiedorder.getTotal_fee());  
  63.             bf.append("]]></total_fee>");  
  64.   
  65.             bf.append("<spbill_create_ip><![CDATA[");  
  66.             bf.append(unifiedorder.getSpbill_create_ip());  
  67.             bf.append("]]></spbill_create_ip>");  
  68.   
  69.             bf.append("<time_start><![CDATA[");  
  70.             bf.append(unifiedorder.getTime_start());  
  71.             bf.append("]]></time_start>");  
  72.   
  73.             bf.append("<time_expire><![CDATA[");  
  74.             bf.append(unifiedorder.getTime_expire());  
  75.             bf.append("]]></time_expire>");  
  76.   
  77.             bf.append("<notify_url><![CDATA[");  
  78.             bf.append(unifiedorder.getNotify_url());  
  79.             bf.append("]]></notify_url>");  
  80.   
  81.             bf.append("<trade_type><![CDATA[");  
  82.             bf.append(unifiedorder.getTrade_type());  
  83.             bf.append("]]></trade_type>");  
  84.   
  85.   
  86.             bf.append("</xml>");  
  87.             return bf.toString();  
  88.         }  
  89.   
  90.         return "";  
  91.     }  

  1. //构造xml参数  
  2.         String xmlInfo = HttpXmlUtils.xmlInfo(unifiedorder);  
  3.           
  4.         String wxUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder";  
  5.           
  6.         String method = "POST";  
  7.           
  8.         String weixinPost = HttpXmlUtils.httpsRequest(wxUrl, method, xmlInfo).toString();  
因为body部分是商品的名称什么的,设计到中文,这个过程可能毁在统一下单的时候提醒:body不是UTF-8编码(我擦,我就在这里折腾了半天的http://blog.csdn.net/xb12369/article/details/50512633


然后开始统一下单得到预支付ID,包装好给app端,app端处理好后再由微信开始回调,回调就会跳转到你的回调地址上,微信说建议校验下签名,照做就是的!

  1. /** 
  2.      * 微信支付回调 
  3.      * @param request 
  4.      * @param resposne 
  5.      */  
  6.     @RequestMapping(value="/notifyUrlWeixin")  
  7.     public void notifyWeixinPayment(HttpServletRequest request,HttpServletResponse response){  
  8.         try{  
  9.             BufferedReader reader = request.getReader();  
  10.   
  11.             String line = "";  
  12.             StringBuffer inputString = new StringBuffer();  
  13.   
  14.             try{  
  15.                 PrintWriter writer = response.getWriter();  
  16.   
  17.                 while ((line = reader.readLine()) != null) {  
  18.                     inputString.append(line);  
  19.                 }  
  20.   
  21.                 if(reader!=null){  
  22.                     reader.close();  
  23.                 }  
  24.   
  25.                 System.out.println("----[微信回调]接收到的报文---"+inputString.toString());  
  26.   
  27.                 if(!StringUtils.isEmpty(inputString.toString())){  
  28.                     WXPayResult wxPayResult = JdomParseXmlUtils.getWXPayResult(inputString.toString());  
  29.   
  30.                     if("SUCCESS".equalsIgnoreCase(wxPayResult.getReturn_code())){  
  31.                         SortedMap<Object,Object> parameters = new TreeMap<Object,Object>();  
  32.                         parameters.put("appid", wxPayResult.getAppid());  
  33.                         parameters.put("attach", wxPayResult.getAttach());  
  34.                         parameters.put("bank_type", wxPayResult.getBank_type());  
  35.                         parameters.put("cash_fee", wxPayResult.getCash_fee());  
  36.                         parameters.put("fee_type", wxPayResult.getFee_type());  
  37.                         parameters.put("is_subscribe", wxPayResult.getIs_subscribe());  
  38.                         parameters.put("mch_id", wxPayResult.getMch_id());  
  39.                         parameters.put("nonce_str", wxPayResult.getNonce_str());  
  40.                         parameters.put("openid", wxPayResult.getOpenid());  
  41.                         parameters.put("out_trade_no", wxPayResult.getOut_trade_no());  
  42.                         parameters.put("result_code", wxPayResult.getResult_code());  
  43.                         parameters.put("return_code", wxPayResult.getReturn_code());  
  44.                         parameters.put("time_end", wxPayResult.getTime_end());  
  45.                         parameters.put("total_fee", wxPayResult.getTotal_fee());  
  46.                         parameters.put("trade_type", wxPayResult.getTrade_type());  
  47.                         parameters.put("transaction_id", wxPayResult.getTransaction_id());  
  48.   
  49.                         //反校验签名  
  50.                         String sign = WXSignUtils.createSign("UTF-8", parameters);  
  51.   
  52.                         if(sign.equals(wxPayResult.getSign())){  
  53.                             //修改订单的状态  
  54.                             orderService.alipayNotifyPayment(wxPayResult.getOut_trade_no(), wxPayResult.getTransaction_id(),2);  
  55.                               
  56.                             writer.write(HttpXmlUtils.backWeixin("SUCCESS","OK"));  
  57.                         }else{  
  58.                             writer.write(HttpXmlUtils.backWeixin("FAIL","签名失败"));  
  59.                         }  
  60.                     }else{  
  61.                         writer.write(HttpXmlUtils.backWeixin("FAIL",wxPayResult.getReturn_msg()));  
  62.                           
  63.                         System.out.println("---------微信支付返回Fail----------"+wxPayResult.getReturn_msg());  
  64.                     }  
  65.   
  66.                     if(writer!=null){  
  67.                         writer.close();  
  68.                     }  
  69.                 }else{  
  70.                     writer.write(HttpXmlUtils.backWeixin("FAIL","未获取到微信返回的结果"));  
  71.                 }  
  72.             }catch(Exception e){  
  73.                 e.printStackTrace();  
  74.             }  
  75.         }catch(Exception ex){  
  76.             ex.printStackTrace();  
  77.         }  
  78.     }  


到这里差不多这个流程就算完了!!!!

下面是源码地址:http://download.csdn.net/detail/xb12369/9403396

注:1、修改资源文件中的  resources/sys.properties

#weixin apy
appid=你们的appid
mch_id=你们的mch_id
notify_url=你们的回调地址


2、key   weixin/Utils/WXSignUtils.java

//http://mch.weixin.qq.com/wiki/doc/api/index.php?chapter=4_3
//商户Key:改成公司申请的即可
//32位密码设置地址:http://www./  jdex1hvufnm1sdcb0e81t36k0d0f15nc
private static String Key = "你们的Key";


好了后新建一个Test的项目就可以直接运行了




有人问我appid是啥,我。。。。。我说什么好呢?我是说还是不说呢?


o(︶︿︶)o 唉,说了没意思,这是最最基础的,不说有别扭,想想,还是贴出来咯~~


师傅领进门,修行个人呐



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多