java 微信支付,异步通知

微信公众号配置共五个地方:

1、设置key:微信商户平台——账户设置——API安全——密钥设置

2、页面授权域名:用来过的openID,公众号设置——功能设置——设置【网页授权域名】(【js安全域名】【业务域名】也一并设置了吧)

3、设置支付目录:微信支付——公众号支付——设置支付目录

4、配置回调信息:开发——基本配置

5、设置管理员:设置——安全中心

支付的话,设置红字的配置即可

[java]  view plain  copy
  1. package com.wxpay.servlet;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.IOException;  
  5. import java.io.InputStreamReader;  
  6. import java.io.PrintWriter;  
  7. import java.util.Date;  
  8. import java.util.HashMap;  
  9. import java.util.Iterator;  
  10. import java.util.Map;  
  11. import java.util.Map.Entry;  
  12.   
  13. import javax.servlet.ServletException;  
  14. import javax.servlet.ServletInputStream;  
  15. import javax.servlet.http.HttpServlet;  
  16. import javax.servlet.http.HttpServletRequest;  
  17. import javax.servlet.http.HttpServletResponse;  
  18. import com.wxpay.WxPayUtil;  
  19.   
  20. /** 
  21.  * 微信支付,工具类 
  22.  * 
  23.  * @author muyunfei 
  24.  * 
  25.  *<p>Modification History:</p> 
  26.  *<p>                 Author          Description</p> 
  27.  *<p>------------------------------------------------------------------</p> 
  28.  *<p>muyunfei         牟云飞         新建</p> 
  29.  */  
  30. public class WxNotifyAction extends HttpServlet  {  
  31.   
  32.   
  33.     private static final long serialVersionUID = 1L;  
  34.   
  35.     @Override  
  36.     protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
  37.             throws ServletException, IOException {  
  38.         // TODO Auto-generated method stub  
  39.         this.doPost(req, resp);  
  40.     }  
  41.   
  42.     @Override  
  43.     protected void doPost(HttpServletRequest req, HttpServletResponse resp)  
  44.             throws ServletException, IOException {  
  45.         try{  
  46.             //获取支付宝POST过来反馈信息  
  47.             Map<String,String> params = new HashMap<String,String>();  
  48.             // post请求的密文数据  
  49.             // sReqData = HttpUtils.PostData();  
  50.             ServletInputStream in = req.getInputStream();  
  51.             BufferedReader reader =new BufferedReader(new InputStreamReader(in));  
  52.             String sReqData="";  
  53.             String itemStr="";//作为输出字符串的临时串,用于判断是否读取完毕  
  54.             while(null!=(itemStr=reader.readLine())){  
  55.                 sReqData+=itemStr;  
  56.             }  
  57.             //----  待修改,可以在这里写一个log日志文件,记录相应信息  
  58.             System.out.println(sReqData);  
  59.             //----  待修改,结束  
  60.             //解析数据  
  61.             Map<String, Object> map = WxPayUtil.getMapFromXML(sReqData);  
  62. //          //打印接收信息  
  63. //          Iterator iterator = map.entrySet().iterator();    
  64. //          while (iterator.hasNext()) {    
  65. //              Map.Entry<String, String> entry = (Entry<String, String>) iterator.next();    
  66. //              System.out.println("key:" + entry.getKey() + " value:"+ entry.getValue());    
  67. //          }  
  68.             //判断支付结果,return_code通信标识,非交易标识,交易是否成功需要查看result_code来判断  
  69.             String return_code=map.get("return_code")+"";  
  70.             String result_code=map.get("result_code")+"";  
  71.             if("SUCCESS".equals(return_code)&&"SUCCESS".equals(result_code)){  
  72.                 //表示支付成功  
  73.                 //sign进行验签,确保消息的真伪  
  74.                 String sign = map.get("sign")+"";//sign不参与验签  
  75.                 String reSign = WxPayUtil.getSign(map);  
  76.                 if(sign.equals(reSign)){  
  77.                     //验签成功,进行结算  
  78.                     System.out.println("验签成功");  
  79.                       
  80.                     //----待修改,结算时,加锁加事务,验证订单是否有效,判断金额是否正确  
  81.                 }  
  82.             }  
  83.             //返回消息  
  84.             String resultMsg="<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml> ";  
  85.             PrintWriter out = resp.getWriter();  
  86.             out.write(resultMsg);  
  87.             out.flush();  
  88.             out.close();  
  89.         }catch (Exception e) {  
  90.             e.printStackTrace();  
  91.         }  
  92.           
  93.     }  
  94.       
  95.   
  96. }  
验签方法, sign不参与签名

[java]  view plain  copy
  1. /** 
  2.      * 签名 
  3.      * 第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序), 
  4.      * 使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。  
  5.      * 特别注意以下重要规则:  
  6.      * ◆ 参数名ASCII码从小到大排序(字典序);  
  7.      * ◆ 如果参数的值为空不参与签名;  
  8.      * ◆ 参数名区分大小写;  
  9.      * ◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。  
  10.      * ◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段  
  11.      * 第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。 
  12.      * key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置 
  13.      * @param map 
  14.      * @return 
  15.      * @throws UnsupportedEncodingException  
  16.      */  
  17.     public static String getSign(Map<String,Object> map) throws UnsupportedEncodingException{  
  18.         ArrayList<String> list = new ArrayList<String>();  
  19.         for(Map.Entry<String,Object> entry:map.entrySet()){  
  20.             //sign不参与验签  
  21.             if(entry.getKey()=="sign"){  
  22.                 continue;  
  23.             }  
  24.             //参数为空不参与签名  
  25.             if(entry.getValue()!=""){  
  26.                 list.add(entry.getKey() + "=" + entry.getValue());  
  27.             }  
  28.         }  
  29.         int size = list.size();  
  30.         String [] arrayToSort = list.toArray(new String[size]);  
  31.         Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER);  
  32.         StringBuilder sb = new StringBuilder();  
  33.         for(int i = 0; i < size; i ++) {  
  34.             sb.append(arrayToSort[i]);  
  35.             if(i!=size-1){  
  36.                 sb.append("&");  
  37.             }  
  38.         }  
  39.         String result = sb.toString();  
  40.         result += "&key=" + WxUtil.key;  
  41.         //Util.log("Sign Before MD5:" + result);  
  42.         result = MD5.MD5Encode(result).toUpperCase();  
  43.         //Util.log("Sign Result:" + result);  
  44.         return result;  
  45.     }  




版权声明

猜你喜欢

转载自blog.csdn.net/yelin042/article/details/80636575