支付宝支付接口之异步回调
来源:互联网 发布:浙江教育网络电视 编辑:程序博客网 时间:2024/04/24 16:26
近期写了一个微信支付的异步回调,现在就把支付宝的也写了吧。
@Before(Tx.class)public void asynchronous_notify() throws UnsupportedEncodingException {try {Uransaction Uransaction = common_notify();renderText("success");} catch (ServiceException ex) {logger.error(ex.getMessage());if (ex.getCode() == 33) {renderText("success");} else {renderText("fail");}}}
private Transaction common_notify() throws UnsupportedEncodingException {// 获取支付宝POST过来反馈信息Map<String, String> params = new HashMap<String, String>();Map<String, String[]> requestParams = getRequest().getParameterMap();for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {String name = iter.next();String[] values = requestParams.get(name);String valueStr = "";for (int i = 0; i < values.length; i++) {valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";}params.put(name, valueStr);}logger.info("收到支付宝异步回调:");logger.info(getRequest().getParameterMap().toString());// 交易状态String trade_status = new String(getRequest().getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");// 获取支付宝的通知返回参数if (!AlipayNotify.verify(params)) {throw new ServiceException(30, "不是支付宝发出的合法消息");}if (!"TRADE_FINISHED".equals(trade_status) && !"TRADE_SUCCESS".equals(trade_status)) {throw new ServiceException(31, "支付宝返回的交易状态不正确(trade_status=" + trade_status + ")");}return "Ok" ;}
package com.alipay.util;import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;import java.util.Map;import com.alipay.config.AlipayConfig;import com.alipay.sign.RSA;/* * *类名:AlipayNotify *功能:支付宝通知处理类 *详细:处理支付宝各接口通知返回 *版本:3.3 *日期:2012-08-17 *说明: *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考 *************************注意************************* *调试通知返回时,可查看或改写log日志的写入TXT里的数据,来检查通知返回是否正常 */public class AlipayNotify { /** * 支付宝消息验证地址 */ private static final String HTTPS_VERIFY_URL = "https://mapi.alipay.com/gateway.do?service=notify_verify&"; /** * 验证消息是否是支付宝发出的合法消息 * @param params 通知返回来的参数数组 * @return 验证结果 */ public static boolean verify(Map<String, String> params) { //判断responsetTxt是否为true,isSign是否为true //responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关 //isSign不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关 String responseTxt = "false";if(params.get("notify_id") != null) {String notify_id = params.get("notify_id");responseTxt = verifyResponse(notify_id);} String sign = ""; if(params.get("sign") != null) {sign = params.get("sign");} boolean isSign = getSignVeryfy(params, sign); //写日志记录(若要调试,请取消下面两行注释) //String sWord = "responseTxt=" + responseTxt + "\n isSign=" + isSign + "\n 返回回来的参数:" + AlipayCore.createLinkString(params); //AlipayCore.logResult(sWord); if (isSign && responseTxt.equals("true")) { return true; } else { return false; } } /** * 根据反馈回来的信息,生成签名结果 * @param Params 通知返回来的参数数组 * @param sign 比对的签名结果 * @return 生成的签名结果 */private static boolean getSignVeryfy(Map<String, String> Params, String sign) { //过滤空值、sign与sign_type参数 Map<String, String> sParaNew = AlipayCore.paraFilter(Params); //获取待签名字符串 String preSignStr = AlipayCore.createLinkString(sParaNew); //获得签名验证结果 boolean isSign = false; if(AlipayConfig.sign_type.equals("RSA")){ isSign = RSA.verify(preSignStr, sign, AlipayConfig.ali_public_key, AlipayConfig.input_charset); } return isSign; } /** * 获取远程服务器ATN结果,验证返回URL * @param notify_id 通知校验ID * @return 服务器ATN结果 * 验证结果集: * invalid命令参数不对 出现这个错误,请检测返回处理中partner和key是否为空 * true 返回正确信息 * false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟 */ private static String verifyResponse(String notify_id) { //获取远程服务器ATN结果,验证是否是支付宝服务器发来的请求 String partner = AlipayConfig.partner; String veryfy_url = HTTPS_VERIFY_URL + "partner=" + partner + "¬ify_id=" + notify_id; return checkUrl(veryfy_url); } /** * 获取远程服务器ATN结果 * @param urlvalue 指定URL路径地址 * @return 服务器ATN结果 * 验证结果集: * invalid命令参数不对 出现这个错误,请检测返回处理中partner和key是否为空 * true 返回正确信息 * false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟 */ private static String checkUrl(String urlvalue) { String inputLine = ""; try { URL url = new URL(urlvalue); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection .getInputStream())); inputLine = in.readLine().toString(); } catch (Exception e) { e.printStackTrace(); inputLine = ""; } return inputLine; }}
0 0
- 支付宝支付接口之异步回调
- 支付宝异步回调
- 支付宝异步回调
- 支付宝支付接口
- 支付宝支付之APP支付接口 服务器端
- 支付宝接口使用文档说明 支付宝异步通知
- 支付宝接口使用文档说明 支付宝异步通知
- 支付宝接口使用文档说明 支付宝异步通知
- 支付宝接口使用文档说明 支付宝异步通知
- 支付宝、微信异步接口
- 支付宝支付完成后用户关闭支付页面,异步回调失败
- 支付宝支付和微信支付异步回调一直调用
- 支付宝在线支付接口
- 连接支付宝支付接口
- 支付宝支付接口详解
- 支付宝支付接口流程
- 对接支付宝支付接口
- 支付宝支付接口 APP
- Win8无法升级.NET Framework 3.5.1的解决办法
- 用友T1-商贸宝库存商品明细账
- 我要的幸福
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
- 报表勾稽关系问题
- 支付宝支付接口之异步回调
- 图论总结
- 用友备份/恢复临时路径修改
- 「企业上云」系列之开源数据库的现状
- Mysql命令
- 软件测试从业者 - 向戚继光学管理
- UFO报表另存为Excel提示:可能没有正确安装Excel
- Android CoordinatorLayout使用 标题由图片变纯色
- SQL 2008 SP3 Express Edition