微信,支付宝,支付异步通知验签,notify_url
在支付接口开发中
,当用户支付完成之后,阿里或者微信会向我们服务器发送一个支付结果的通知,里边带有一系列参数;其中特殊的是签名类型,和签名(他们根据这些参数做出来的签名)。
我们的得到这些参数之后要去除签名类型和签名(他们根据这些参数做出来的签名);之后我们再用这些参数做好排序生成一个签名,与他们返回来的这个签名做比较。
支付宝SDK里边有一套验签工具,微信方面可以自行做一个验签。
1、支付宝验签文档:https://help.alipay.com/lab/help_detail.htm?help_id=243094
支付宝的验签:AlipaySignature.rsaCheckV1();这个方法是支付宝sdk里自带的。alipay-sdk-java20170725114550版本的
https://docs.open.alipay.com/54/103419这个地址可以下载支付宝给出的SDK。
2、下单之后支付宝和微信都会在下单返回的数据中放置一个支付二维码内容的链接,我们可以用这个链接自行生成一个二维码供用户支付。
3、接收微信服务器发送过来的通知数据:
// 读取参数
Map<String, Object> items = HttpUtil.convertModel(request);
InputStream inputStream;
StringBuffer sb = new StringBuffer();
inputStream = request.getInputStream();
String s;
BufferedReader in = new BufferedReader(new InputStreamReader(
inputStream, "UTF-8"));
while ((s = in.readLine()) != null) {
sb.append(s);
}
in.close();
inputStream.close();
其中的sb即是接收过来的xml数据;后续我们可以通过自己工程里的xml解析工具即可解析得到map格式的数据或者json格式的数据,以供之后的验签,存储等业务操作。
4、接收阿里返回通知的数据
Map<String, String> params = new HashMap<String, String>();
Map requestParams = request.getParameterMap();
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
}
// 乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
params.put(name, valueStr);
}
// 获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
// 商户订单号
String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
可以通过这块代码得到通知的数据,转换之后的map数据在params 里边,也可以直接从request里读取数据如上的订单号。
之后我们就可以根据这些参数做验签,存储,更新等的操作了。