微信公众号配置共五个地方:
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
*
*
Modification History:
*
AuthorDescription
*
------------------------------------------------------------------
*
muyunfei牟云飞新建
*/
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 params = new HashMap();
// 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 map = WxPayUtil.getMapFromXML(sReqData);
打印接收信息
//Iterator iterator = map.entrySet().iterator();
// while (iterator.hasNext()) {
// Map.Entry entry = (Entry) 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=" ";
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 map) throws UnsupportedEncodingException{
ArrayList list = new ArrayList();
for(Map.Entry 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;
}