微信公众号配置共五个地方:
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> Author Description</p>
- *<p>------------------------------------------------------------------</p>
- *<p>muyunfei 牟云飞 新建</p>
- */
- public class WxNotifyAction extends HttpServlet {
- private static final long serialVersionUID = 1L;
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- // TODO Auto-generated method stub
- this.doPost(req, resp);
- }
- @Override
- protected 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();
- }
- }
- }
- /**
- * 签名
- * 第一步,设所有发送或者接收到的数据为集合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;
- }