1.支付宝网页支付java
String goodsAmount = request.getParameter(); String subject = "童装"; //把请求参数打包 Map<String, String> sParaTemp = new HashMap<String, String>(); sParaTemp.put("service", "alipay.wap.create.direct.pay.by.user");//手机网页支付 sParaTemp.put("partner", AlipayConfig.partner); sParaTemp.put("seller_id", AlipayConfig.seller_id); sParaTemp.put("_input_charset", AlipayConfig.input_charset); sParaTemp.put("payment_type", AlipayConfig.payment_type); sParaTemp.put("notify_url", AlipayConfig.notify_url); sParaTemp.put("return_url", AlipayConfig.return_url); sParaTemp.put("anti_phishing_key", AlipayConfig.anti_phishing_key); sParaTemp.put("exter_invoke_ip", AlipayConfig.exter_invoke_ip); sParaTemp.put("show_url", "www.abc.com"); sParaTemp.put("out_trade_no", recharge.getOrderNo());//调用支付宝以前生成的商品订单号 sParaTemp.put("subject", subject); sParaTemp.put("total_fee", goodsAmount);//金额 //sParaTemp.put("body", body); /*其余业务参数根据在线开发文档,添加参数.文档地址:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.O9yorI&treeId=62&articleId=103740&docType=1 //如sParaTemp.put("参数名","参数值");*/ //创建请求,请求成功支付宝服务器返回一段网页代码 String sHtmlText = AlipaySubmit.buildRequest(sParaTemp, "get", "确认"); //将这段代码以网页形式返回给用户便可进行支付
配置文件web
package alipay.config; /* * *类名:AlipayConfigApp *功能:基础配置类 *详细:设置账户有关信息及返回路径 *版本:3.4 *修改日期:2016-03-08 *说明: *如下代码只是为了方便商户测试而提供的样例代码,商户能够根据本身网站的须要,按照技术文档编写,并不是必定要使用该代码。 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。 */ public class AlipayConfig { //↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ // 合做身份者ID,签约帐号,以2088开头由16位纯数字组成的字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm public static String partner = "2088************"; // 收款支付宝帐号,以2088开头由16位纯数字组成的字符串,通常状况下收款帐号就是签约帐号 public static String seller_id = partner; // MD5密钥,安全检验码,由数字和字母组成的32位字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm public static String key = "****h2lh2g847h****kuu6fu8cl0****"; // 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网能够正常访问 public static String notify_url = "http://abc.def.com/"; // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网能够正常访问 public static String return_url = "http://abc.def.com/"; // 签名方式 public static String sign_type = "MD5"; // 调试用,建立TXT日志文件夹路径,见AlipayCore.java类中的logResult(String sWord)打印方法。 public static String log_path = "C:\\"; // 字符编码格式 目前支持 gbk 或 utf-8 public static String input_charset = "utf-8"; // 支付类型 ,无需修改 public static String payment_type = "1"; // 调用的接口名,无需修改,即时到帐 public static String service = "create_direct_pay_by_user"; //↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ //↓↓↓↓↓↓↓↓↓↓ 请在这里配置防钓鱼信息,若是没开通防钓鱼功能,为空便可 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ // 防钓鱼时间戳 若要使用请调用类文件submit中的query_timestamp函数 public static String anti_phishing_key = ""; // 客户端的IP地址 非局域网的外网IP地址,如:221.0.0.1 public static String exter_invoke_ip = ""; //↑↑↑↑↑↑↑↑↑↑请在这里配置防钓鱼信息,若是没开通防钓鱼功能,为空便可 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ }
notify_url不能带端口号和参数数组
支付成功后异步回调商家服务器安全
/** * 支付宝异步通知网页版 */ @RequestMapping("paymentNotifyCallBack") public void paymentNotifyCallBack() { PrintWriter out = null; try { out = response.getWriter(); //获取支付宝POST过来反馈信息 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] + ","; } params.put(name, valueStr); } //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(如下仅供参考)// //商户订单号 String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8"); //支付宝交易号 String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8"); //交易状态 String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8"); //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)// if (AlipayNotify.verify(params)) {//验证成功 if (trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")) { logger.info("支付宝web回调后台成功......"); Recharge recharge = rechargeService.getRechargeByOrderNo(out_trade_no); recharge.setUpdateDate(new Date()); recharge.setTradeNo(trade_no);//交易号 recharge.setPayTime(new Date());//付款时间 recharge.setPayStatus(1); recharge.setPayType(1); int flag = rechargeService.update(recharge); if (flag > 0) { logger.info("订单状态修改为功........."); } else { logger.info("订单状态修改失败.........."); } AlipayCore.logResult("notify_url success!"); } } else {//验证失败 out.print("fail"); } } catch (Exception e) { logger.info("接收支付宝异步通知出错:" + e); e.printStackTrace(); } }
同步通知服务器
2.支付宝app支付app
//将参数打包成数组 String[] parameters = { "partner=\"" + AlipayConfigApp.partner + "\"", "seller_id=\"" + AlipayConfigApp.partner + "\"", "out_trade_no=\"" + recharge.getOrderNo() + "\"", "subject=\"童装\"", "body=\"童装\"", "total_fee=\"" + String.valueOf(recharge.getRechargeAmount()) + "\"", "notify_url=\"http://zhaopincmbs.fangshangqu.com/recruitcmbs/alipay/notifyCallBackApp.htm\"", "service=\"mobile.securitypay.pay\"", "payment_type=\"1\"", "input_charset=\"utf-8\"" }; //调用支付宝接口 String result = AlipayCoreApp.signAllString(parameters); //将结果返回给客户端 resultMap.put("data1", result); outJson(resultMap);
异步回调异步
//获取支付宝POST过来反馈信息 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); } //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(如下仅供参考)// try { //商户订单号 String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8"); //支付宝交易号 String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8"); //交易状态 String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8"); //异步通知ID String notify_id = request.getParameter("notify_id"); //sign String sign = request.getParameter("sign"); //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)// if (notify_id != "" && notify_id != null) {////判断接受的post通知中有无notify_id,若是有则是异步通知。 if (AlipayNotifyApp.verifyResponse(notify_id).equals("true"))//判断成功以后使用getResponse方法判断是不是支付宝发来的异步通知。 { if (AlipayNotifyApp.getSignVeryfy(params, sign))//使用支付宝公钥验签 { if (trade_status.equals("TRADE_SUCCESS")) { logger.info("支付宝成功......"); //String ... = ... //商户能够从params中获取通知中的数据 //而后进行支付成功后的业务逻辑处理 System.out.println("订单" + out_trade_no + "支付成功"); logger.info("支付回调后台成功......"); Recharge recharge = rechargeService.getRechargeByOrderNo(out_trade_no); recharge.setUpdateDate(new Date()); recharge.setTradeNo(trade_no);//交易号 recharge.setPayTime(new Date());//付款时间 recharge.setPayStatus(1); recharge.setPayType(1); int flag = rechargeService.update(recharge); if (flag > 0) { logger.info("订单状态修改为功........."); } else { logger.info("订单状态修改失败.........."); } //调试打印log AlipayCoreApp.logResult("notify_url success!", "notify_url"); } } else//验证签名失败 { out.print("sign fail"); } } else//验证是否来自支付宝的通知失败 { out.print("response fail"); } } else { out.print("no notify message"); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); }