java支付异步通知设计_微信支付,异步通知

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

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值