微信支付,异步通知

来源:互联网 发布:求二叉树的深度java 编辑:程序博客网 时间:2024/05/22 14:01

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

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

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

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

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

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

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

package com.wxpay.servlet;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.util.Date;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Map.Entry;import javax.servlet.ServletException;import javax.servlet.ServletInputStream;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.wxpay.WxPayUtil;/** * 微信支付,工具类 * * @author muyunfei * *<p>Modification History:</p> *<p>AuthorDescription</p> *<p>------------------------------------------------------------------</p> *<p>muyunfei牟云飞新建</p> */public class WxNotifyAction extends HttpServlet  {private static final long serialVersionUID = 1L;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {// TODO Auto-generated method stubthis.doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {try{//获取支付宝POST过来反馈信息Map<String,String> params = new HashMap<String,String>();// post请求的密文数据// sReqData = HttpUtils.PostData();ServletInputStream in = req.getInputStream();BufferedReader reader =new BufferedReader(new InputStreamReader(in));String sReqData="";String itemStr="";//作为输出字符串的临时串,用于判断是否读取完毕while(null!=(itemStr=reader.readLine())){sReqData+=itemStr;}//----  待修改,可以在这里写一个log日志文件,记录相应信息System.out.println(sReqData);//----  待修改,结束//解析数据Map<String, Object> map = WxPayUtil.getMapFromXML(sReqData);////打印接收信息//Iterator iterator = map.entrySet().iterator();  //    while (iterator.hasNext()) {  //        Map.Entry<String, String> entry = (Entry<String, String>) iterator.next();  //        System.out.println("key:" + entry.getKey() + " value:"+ entry.getValue());  //    }    //判断支付结果,return_code通信标识,非交易标识,交易是否成功需要查看result_code来判断    String return_code=map.get("return_code")+"";    String result_code=map.get("result_code")+"";    if("SUCCESS".equals(return_code)&&"SUCCESS".equals(result_code)){    //表示支付成功    //sign进行验签,确保消息的真伪    String sign = map.get("sign")+"";//sign不参与验签    String reSign = WxPayUtil.getSign(map);    if(sign.equals(reSign)){    //验签成功,进行结算    System.out.println("验签成功");        //----待修改,结算时,加锁加事务,验证订单是否有效,判断金额是否正确    }    }    //返回消息    String resultMsg="<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml> ";    PrintWriter out = resp.getWriter();    out.write(resultMsg);    out.flush();    out.close();}catch (Exception e) {e.printStackTrace();}}}
验签方法,sign不参与签名

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




0 0
原创粉丝点击