首页 > 编程 > Java > 正文

java 服务端对接微信支付 Demo

2019-11-08 01:49:27
字体:
来源:转载
供稿:网友

服务端代码:

package com.wlsq.kso.web;import java.io.ByteArrayOutputStream;import java.io.InputStream;import java.io.UnsupportedEncodingException;import java.math.BigDecimal;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Map.Entry;import java.util.Random;import java.util.Set;import java.util.SortedMap;import java.util.TreeMap;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.cxf.common.util.StringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.sPRingframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject;import com.wlsq.kso.annotation.MethodAction;import com.wlsq.kso.entity.ResultObject;import com.wlsq.kso.service.AccountWalletService;import com.wlsq.kso.util.HttpUtil;import com.wlsq.kso.util.Mymd5Util;import com.wlsq.kso.util.xmltoJsonUtil;/** * 微信支付接口Controller *  * @author zzg * @date 2017-02-18 */@Controller@RequestMapping(value = "/WeiXinPay")public class AccountWeiXinController {	private static final Logger LOG = LoggerFactory			.getLogger(AccountWeiXinController.class);		@Autowired	private AccountWalletService accountWalletService;	// 微信统一下单接口路径	private static final String UNIFORMORDER = "https://api.mch.weixin.QQ.com/pay/unifiedorder";	// 微信商户号:*****	private static final String MCHID = "********";	// 微信回调地址	private static final String NOTIFYURL = "*********";	// 微信交易类型	private static final String TRADETYPE = "APP";	//微信APIKEY    private static final String APIKEY ="************";	/**	 * 微信统一下单	 * 	 * @return	 * @throws UnsupportedEncodingException 	 */	@MethodAction(optionDescription = "微信统一下单", methodName = "/WeiXinPay/uniformorder")	@RequestMapping(value = "/uniformorder", method = RequestMethod.POST, produces = "text/html;charset=UTF-8")	@ResponseBody	public String uniformorder(HttpServletRequest request) throws UnsupportedEncodingException {		ResultObject result = new ResultObject();// 返回数据结果集合		request.setCharacterEncoding("UTF-8");  	    		try {			//APP ID			String appid = request.getParameter("appid") == null ? null					: request.getParameter("appid").trim().toUpperCase();			// 用户访问令牌			String accessToken = request.getParameter("accessToken") == null ? null					: request.getParameter("accessToken").trim();			// 订单编号			String orderNum = request.getParameter("orderNum") == null ? null					: request.getParameter("orderNum").trim();// 订单编号			// 消费金额			String money = request.getParameter("money") == null ? null					: request.getParameter("money").trim();// 消费金额			// 消费主题			String subject = request.getParameter("subject") == null ? null					: request.getParameter("subject").trim();// 消费主体						if(StringUtils.isEmpty(appid)){				result.setMsg("参数:appid 为空");				result.setResultCode("-1");				return JSON.toJSONString(result);			}			if(StringUtils.isEmpty(accessToken)){				result.setMsg("参数:accessToken 为空");				result.setResultCode("-1");				return JSON.toJSONString(result);			}						if(StringUtils.isEmpty(orderNum)){				result.setMsg("参数:orderNum 为空");				result.setResultCode("-1");				return JSON.toJSONString(result);			}			if(StringUtils.isEmpty(money)){				result.setMsg("参数:money 为空");				result.setResultCode("-1");				return JSON.toJSONString(result);			}			if(StringUtils.isEmpty(subject)){				result.setMsg("参数:subject 为空");				result.setResultCode("-1");				return JSON.toJSONString(result);			}			SortedMap<Object,Object> parame = new TreeMap<Object,Object>();			parame.put("appid", *********");			parame.put("mch_id", MCHID);// 商家账号。			String randomStr = getRandomString(18).toUpperCase();			parame.put("nonce_str", randomStr);// 随机字符串						parame.put("body", subject);// 商品描述			parame.put("out_trade_no", orderNum);// 商户订单编号			   //支付金额			parame.put("total_fee", BigDecimal.valueOf(Long.parseLong(money)).multiply(new BigDecimal(100)).toString());// 消费金额			String ip = getIpAddr(request);			if (StringUtils.isEmpty(ip)) {				parame.put("spbill_create_ip", "127.0.0.1");// 消费IP地址			} else {				parame.put("spbill_create_ip", ip);// 消费IP地址			}			parame.put("notify_url", NOTIFYURL);// 回调地址			parame.put("trade_type", TRADETYPE);// 交易类型APP			String sign =createSign(parame); 			parame.put("sign", sign);// 数字签证						String xml = getRequestXML(parame);				String content = HttpUtil.sendPost(UNIFORMORDER, xml);				System.out.println(content);			JSONObject jsonObject = JSONObject.parSEObject(XmltoJsonUtil.xml2JSON(content)) ;  			JSONObject result_xml = jsonObject.getJSONObject("xml");			JSONArray result_code =  result_xml.getJSONArray("result_code");						String code = (String)result_code.get(0);						List<String> data = new ArrayList<String>();						if(code.equalsIgnoreCase("FAIL")){				result.setMsg("微信统一订单下单失败");				result.setResultCode("-1");				result.setData(data);			}else if(code.equalsIgnoreCase("SUCCESS")){				JSONArray prepay_id = result_xml.getJSONArray("prepay_id");								String prepayId = (String)prepay_id.get(0);				data.add(prepayId);				result.setMsg("微信统一订单下单成功");				result.setResultCode("1");				result.setData(data);			}						return JSON.toJSONString(result);				} catch (Exception e) {			result.setMsg(e.getMessage());			result.setResultCode("-1");			return JSON.toJSONString(result);		}			}		/**	 * 微信订单回调接口	 * 	 * @return	 */	@MethodAction(optionDescription = "微信回掉接口", methodName = "/WeiXinPay/notify")	@RequestMapping(value = "/notify", method = RequestMethod.POST, produces = "text/html;charset=UTF-8")	@ResponseBody	public void notify(HttpServletRequest request,HttpServletResponse response){		ResultObject result = new ResultObject();// 返回数据结果集合		try{			request.setCharacterEncoding("UTF-8");  		    response.setCharacterEncoding("UTF-8");  		    response.setContentType("text/html;charset=UTF-8");  		    response.setHeader("Access-Control-Allow-Origin", "*");   		    InputStream in=request.getInputStream();  		    ByteArrayOutputStream out=new ByteArrayOutputStream();  		    byte[] buffer =new byte[1024];  		    int len=0;  		    while((len=in.read(buffer))!=-1){  		        out.write(buffer, 0, len);  		    }  		    out.close();  		    in.close();  		    String content=new String(out.toByteArray(),"utf-8");//xml数据  		    		    JSONObject jsonObject = JSONObject.parseObject(XmltoJsonUtil.xml2JSON(content)) ;  			JSONObject result_xml = jsonObject.getJSONObject("xml");			JSONArray result_code =  result_xml.getJSONArray("result_code");			String code = (String)result_code.get(0);						if(code.equalsIgnoreCase("FAIL")){				result.setMsg("微信统一订单下单失败");				result.setResultCode("-1");											response.getWriter().write(setXml("SUCCESS", "OK"));											}else if(code.equalsIgnoreCase("SUCCESS")){				result.setMsg("微信统一订单下单成功");				result.setResultCode("1");									JSONArray out_trade_no = result_xml.getJSONArray("out_trade_no");//订单编号				Map<String,Object> map = new HashMap<String,Object>();				map.put("orderNum", (String)out_trade_no.get(0));				map.put("consumState", 1);				accountWalletService.updateAccountOrderState(map);								response.getWriter().write(setXml("SUCCESS", "OK"));							}								   		}catch(Exception e){			result.setMsg(e.getMessage());			result.setResultCode("-1");			return;		}			}		// 返回用IP地址	public 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();		}		return ip;	}	// 随机字符串生成	public static String getRandomString(int length) { // length表示生成字符串的长度		String base = "abcdefghijklmnopqrstuvwxyz0123456789";		Random random = new Random();		StringBuffer sb = new StringBuffer();		for (int i = 0; i < length; i++) {			int number = random.nextInt(base.length());			sb.append(base.charAt(number));		}		return sb.toString();	}			//拼接xml 请求路径	public static String getRequestXML(SortedMap<Object, Object> parame){		StringBuffer buffer = new StringBuffer();		buffer.append("<xml>");		Set set = parame.entrySet();		Iterator iterator = set.iterator();		while(iterator.hasNext()){			Map.Entry entry = (Map.Entry) iterator.next();			String key = (String)entry.getKey();			String value = (String)entry.getValue();			//过滤相关字段sign			if("sign".equalsIgnoreCase(key)){				buffer.append("<"+key+">"+"<![CDATA["+value+"]]>"+"</"+key+">");			}else{				buffer.append("<"+key+">"+value+"</"+key+">");			}					}		buffer.append("</xml>");		return buffer.toString();	}		//创建md5 数字签证	public static String createSign(SortedMap<Object, Object> parame){		StringBuffer buffer = new StringBuffer();		Set set = parame.entrySet();		Iterator iterator = set.iterator();		while(iterator.hasNext()){			Map.Entry entry = (Map.Entry) iterator.next();			String key = (String)entry.getKey();			Object value = (String)entry.getValue();			if(null != value && !"".equals(value) && !"sign".equals(key) && !"key".equals(key)){				buffer.append(key+"="+value+"&");			}					}		buffer.append("key="+APIKEY);		String sign =MyMd5Util.md5(buffer.toString()).toUpperCase(); 		System.out.println("签名参数:"+sign);		return sign;	}		//返回微信服务	 public static String setXml(String return_code,String return_msg){  	        return "<xml><return_code><![CDATA["+return_code+"]]></return_code><return_msg><![CDATA["+return_msg+"]]></return_msg></xml>";  	}  		//模拟微信回调接口	 public static String callbakcXml(String orderNum){		 return "<xml><appid><![CDATA[wx2421b1c4370ec43b]]></appid><attach><![CDATA[支付测试]]></attach><bank_type><![CDATA[CFT]]></bank_type><fee_type><![CDATA[CNY]]></fee_type> <is_subscribe><![CDATA[Y]]></is_subscribe><mch_id><![CDATA[10000100]]></mch_id><nonce_str><![CDATA[5d2b6c2a8db53831f7eda20af46e531c]]></nonce_str><openid><![CDATA[oUpF8uMEb4qRXf22hE3X68TekukE]]></openid> <out_trade_no><![CDATA["+orderNum+"]]></out_trade_no>  <result_code><![CDATA[SUCCESS]]></result_code> <return_code><![CDATA[SUCCESS]]></return_code><sign><![CDATA[B552ED6B279343CB493C5DD0D78AB241]]></sign><sub_mch_id><![CDATA[10000100]]></sub_mch_id> <time_end><![CDATA[20140903131540]]></time_end><total_fee>1</total_fee><trade_type><![CDATA[JSAPI]]></trade_type><transaction_id><![CDATA[1004400740201409030005092168]]></transaction_id></xml>";	 }			public static void main(String[] args) throws Exception{		String str = HttpUtil.sendPost("http://localhost:8080/WlsqWS/WeiXinPay/notify", callbakcXml("a313a907f72f4f70b53a46b9773a9d42"));		System.out.println("result :"+str);//		SortedMap<Object,Object> parame = new TreeMap<Object,Object>();//		parame.put("appid", "wxdf26629c37f5b7c1");//		parame.put("mch_id", MCHID);//		String randomStr = getRandomString(18).toUpperCase();//		parame.put("nonce_str", randomStr);//		String subject = "余额充值";//		parame.put("body", subject);//		String orderNum = "3a6154e2a662407c8223971284c372a7";//		parame.put("out_trade_no", orderNum);//		String money ="1";//		parame.put("total_fee", money);//		String ip ="127.0.0.1";//		parame.put("spbill_create_ip", ip);//		parame.put("notify_url", NOTIFYURL);//		parame.put("trade_type", TRADETYPE);//		String sign =createSign(parame); //		parame.put("sign", sign);// 数字签证//		//		String xml = getRequestXML(parame);		////		String content = HttpUtil.sendPost(UNIFORMORDER, xml);//		//		//成功代码//		String result = XmltoJsonUtil.xml2JSON(content);		//		JSONObject jsonObject = JSONObject.parseObject(result) ;  //		JSONObject results = jsonObject.getJSONObject("xml");//		JSONArray array =  results.getJSONArray("result_code");//		String code = (String)array.get(0);//		System.out.println(results.toString());//		System.out.println(code);				//失败代码//		String result = XmltoJsonUtil.xml2JSON(content);		//		JSONObject jsonObject = JSONObject.parseObject(result) ; //		System.out.println(jsonObject.toString());	}}

java 工具类:

HttpUtil 类

package com.wlsq.kso.util;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintStream;import java.io.PrintWriter;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLConnection;import java.util.Map;public class HttpUtil{  public static final String POST = "POST";  public static final String GET = "GET";  public static String post(String uriString, Map<String, String> params)    throws Exception  {    URL url = new URL(uriString);    HttpURLConnection con = (HttpURLConnection)url.openConnection();    con.setDoOutput(true);    con.setDoInput(true);    con.setRequestMethod(RequstMethod.POST.value());    con.setRequestProperty(" Content-Type ",       " application/x-www-form-urlencoded ");    con.setUseCaches(false);    con.setInstanceFollowRedirects(true);    if (params != null) {      StringBuffer sb = new StringBuffer();      String data = null;      byte[] b = null;      for (String key : params.keySet()) {        sb.append(key).append('=').append((String)params.get(key)).append('&');      }      data = sb.substring(0, sb.length() - 1);      b = data.getBytes("UTF-8");      OutputStream out = con.getOutputStream();      out.write(b);      out.flush();      out.close();    }    InputStream in = con.getInputStream();    String responseBody = FileUtil.readAll(in);    return responseBody;  }  public static String post(String uriString, Map<String, String> params, String authorization)    throws Exception  {    URL url = new URL(uriString);    HttpURLConnection con = (HttpURLConnection)url.openConnection();    con.setDoOutput(true);    con.setDoInput(true);    con.setRequestMethod(RequstMethod.POST.value());    con.setRequestProperty("Content-Type", "application/json");    con.setRequestProperty("Authorization", authorization);    con.setUseCaches(false);    con.setInstanceFollowRedirects(true);    if (params != null) {      StringBuffer sb = new StringBuffer();      String data = null;      byte[] b = null;      for (String key : params.keySet()) {        sb.append(key).append('=').append((String)params.get(key)).append('&');      }      data = sb.substring(0, sb.length() - 1);      b = data.getBytes("UTF-8");      OutputStream out = con.getOutputStream();      out.write(b);      out.flush();      out.close();    }    InputStream in = con.getInputStream();    String responseBody = FileUtil.readAll(in);    return responseBody;  }  public static String jpost(String uriString, Map<String, String> params)    throws Exception  {    URL url = new URL(uriString);    HttpURLConnection con = (HttpURLConnection)url.openConnection();    con.setDoOutput(true);    con.setDoInput(true);    con.setRequestMethod(RequstMethod.POST.value());    con.setRequestProperty("Content-Type", "application/json");    con.setUseCaches(false);    con.setInstanceFollowRedirects(true);    if (params != null) {      StringBuffer sb = new StringBuffer();      String data = null;      byte[] b = null;      for (String key : params.keySet()) {        sb.append(key).append('=').append((String)params.get(key)).append('&');      }      data = sb.substring(0, sb.length() - 1);      b = data.getBytes("UTF-8");      OutputStream out = con.getOutputStream();      out.write(b);      out.flush();      out.close();    }    InputStream in = con.getInputStream();    String responseBody = FileUtil.readAll(in);    return responseBody;  }  public static String sendGet(String url, String param)  {    String result = "";    BufferedReader in = null;    try {      String urlNameString = url + "?" + param;      URL realUrl = new URL(urlNameString);      URLConnection connection = realUrl.openConnection();      connection.setRequestProperty("accept", "*/*");      connection.setRequestProperty("Content-Type", "application/json");      connection.setRequestProperty("connection", "Keep-Alive");      connection.setRequestProperty("user-agent",         "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");      connection.connect();      Map map = connection.getHeaderFields();//      for (String key : map.keySet()) {//        System.out.println(key + "--->" + map.get(key));//      }      in = new BufferedReader(new InputStreamReader(        connection.getInputStream(), "utf-8"));      String line;      while ((line = in.readLine()) != null)      {        //String line;        result = result + line;      }    } catch (Exception e) {      System.out.println("����GET��������쳣��" + e);      e.printStackTrace();      try      {        if (in != null)          in.close();      }      catch (Exception e2) {        e2.printStackTrace();      }    }    finally    {      try      {        if (in != null)          in.close();      }      catch (Exception e2) {        e2.printStackTrace();      }    }    return result;  }  public static String sendPost(String url, String param)  {    PrintWriter out = null;    BufferedReader in = null;    String result = "";    try {      URL realUrl = new URL(url);      URLConnection conn = realUrl.openConnection();      conn.setRequestProperty("Content-Type", "application/xml");      conn.setDoOutput(true);      conn.setDoInput(true);      out = new PrintWriter(conn.getOutputStream());      out.print(param);      out.flush();      in = new BufferedReader(        new InputStreamReader(conn.getInputStream()));      String line;      while ((line = in.readLine()) != null)      {        //String line;        result = result + line;      }    } catch (Exception e) {      System.out.println("���� POST ��������쳣��" + e);      e.printStackTrace();      try      {        if (out != null) {          out.close();        }        if (in != null)          in.close();      }      catch (IOException ex)      {        ex.printStackTrace();      }    }    finally    {      try      {        if (out != null) {          out.close();        }        if (in != null)          in.close();      }      catch (IOException ex)      {        ex.printStackTrace();      }    }    return result;  }  public static enum RequstMethod  {    GET("GET"), POST("POST");    private String value;    private RequstMethod(String value) {      this.value = value;    }    public String value() {      return this.value;    }  }}

XmltoJsonUtil 类

package com.wlsq.kso.util;import java.io.ByteArrayInputStream;import java.io.InputStream;import java.util.HashMap;import java.util.LinkedList;import java.util.List;import java.util.Map;import org.jdom.Document;  import org.jdom.Element;  import org.jdom.input.SAXBuilder;  import com.alibaba.fastjson.JSONObject;public class XmltoJsonUtil {	public static  String xml2JSON(String xml) {          JSONObject obj = new JSONObject();          try {              InputStream is = new ByteArrayInputStream(xml.getBytes("utf-8"));              SAXBuilder sb = new SAXBuilder();              Document doc = sb.build(is);              Element root = doc.getRootElement();              obj.put(root.getName(), iterateElement(root));              return obj.toString();          } catch (Exception e) {              e.printStackTrace();              return null;          }      } 		 private static Map  iterateElement(Element element) {  	        List jiedian = element.getChildren();  	        Element et = null;  	        Map obj = new HashMap();  	        List list = null;  	        for (int i = 0; i < jiedian.size(); i++) {  	            list = new LinkedList();  	            et = (Element) jiedian.get(i);  	            if (et.getTextTrim().equals("")) {  	                if (et.getChildren().size() == 0)  	                    continue;  	                if (obj.containsKey(et.getName())) {  	                    list = (List) obj.get(et.getName());  	                }  	                list.add(iterateElement(et));  	                obj.put(et.getName(), list);  	            } else {  	                if (obj.containsKey(et.getName())) {  	                    list = (List) obj.get(et.getName());  	                }  	                list.add(et.getTextTrim());  	                obj.put(et.getName(), list);  	            }  	        }  	        return obj;  	    }  	 	 }MyMd5Util 类

package com.wlsq.kso.util;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;/** * @author fengcai ouyang * @version V1.0 * @Description: * @date 2016/7/23 18:48 * @Update by: ${todo} */public class MyMd5Util {    private static MessageDigest sMd5MessageDigest;    private static StringBuilder sStringBuilder;    private MyMd5Util() {    }    public static String md5(String s) {        sMd5MessageDigest.reset();        sMd5MessageDigest.update(s.getBytes());        byte[] digest = sMd5MessageDigest.digest();        sStringBuilder.setLength(0);        for (int i = 0; i < digest.length; ++i) {            int b = digest[i] & 255;            if (b < 16) {                sStringBuilder.append('0');            }            sStringBuilder.append(Integer.toHexString(b));        }        return sStringBuilder.toString().toUpperCase();    }    static {        try {            sMd5MessageDigest = MessageDigest.getInstance("MD5");        } catch (NoSuchAlgorithmException var1) {        }        sStringBuilder = new StringBuilder();    }}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表