java支付宝实例

来源:互联网 发布:九仙图翅膀进阶数据 编辑:程序博客网 时间:2024/06/14 09:33

最近,支付这块要做支付宝,微信,银联支付,以前都是别人做。这次轮到自己做了。经过自己的研究和思考,终究是弄好了支付宝,写此博客仅作保存,有什么问题可以共同探讨一下。

如果想要看如何申请应用和获取appid和私匙推荐去看这篇博客,介绍的相当详细

http://blog.csdn.net/rongbinjava/article/details/51790241

首先,上一张支付宝的流程图。


可以看到,支付宝理论是先执行同步通知,再执行异步通知的,开始在项目中同步和异步都做了逻辑处理,出了大问题,支付宝那边同步异步一起回来,导致钱数加了2次,故同步只做验证,异步处理数据。需谨记;


下面上代码:

package com.rsxxjs.site.person.controller;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import javax.annotation.Resource;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import org.apache.commons.validator.GenericValidator;import org.json.JSONObject;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Controller;import org.springframework.ui.ModelMap;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import com.alipay.api.AlipayApiException;import com.alipay.api.AlipayClient;import com.alipay.api.DefaultAlipayClient;import com.alipay.api.domain.AlipayTradePagePayModel;import com.alipay.api.domain.AlipayTradeWapPayModel;import com.alipay.api.internal.util.AlipaySignature;import com.alipay.api.request.AlipayTradePagePayRequest;import com.alipay.api.request.AlipayTradeRefundRequest;import com.alipay.api.request.AlipayTradeWapPayRequest;import com.rsxxjs.dto.RechargeDTO;import com.rsxxjs.dto.SessionDTO;import com.rsxxjs.platform.service.LogbackService;import com.rsxxjs.platform.service.RechargeService;import com.rsxxjs.util.alipay.AlipayConfig;import com.rsxxjs.util.common.Constant;import com.rsxxjs.util.date.DateUtil;import com.rsxxjs.util.math.MathUtil;import com.rsxxjs.util.order.OrderNumberUtil;/** * @TitleAlipayController * @Description 支付宝支付控制类 * @date 2017年5月17日  */@Controller@RequestMapping("/alipay")public class AlipayController{@Resourceprivate RechargeService rechargeService;@Resourceprivate LogbackService logbackService;private static final Logger logger = LoggerFactory.getLogger(AlipayController.class);/** 跳转到手机网站支付宝支付页面  * @Description AlipayController.java  * @param map  * @param request  * @return  * @date 2017年6月26日上午11:58:09 */@RequestMapping(value="/goMobilePay", method={RequestMethod.POST})public String goMobilePay(ModelMap map, HttpServletRequest request, HttpServletResponse response,HttpSession session,String rechargeMon){try {logger.info("跳转到手机网站支付宝支付页面......rechargeMon="+rechargeMon);if(GenericValidator.isBlankOrNull(rechargeMon)){throw new Exception("请填写充值金额");}else{SessionDTO sessionDTO = (SessionDTO)session.getAttribute("sessionDTO");if(null==sessionDTO){logger.error("=========================调准支付宝时session为空跳转到登录页面=========================");throw new Exception("session为空!");}rechargeMon=MathUtil.changeMoney(Double.parseDouble(rechargeMon), 2);// 商户订单号,商户网站订单系统中唯一订单号,必填    String out_trade_no = OrderNumberUtil.getOrderNumber(sessionDTO.getInvitationCode());// 订单名称,必填    String subject = "中意通充值金额"+rechargeMon;    // 付款金额,必填    String total_amount=rechargeMon;    // 商品描述,可空    String body = "用户["+sessionDTO.getPersonName()+"]中意通充值¥:"+rechargeMon;    // 超时时间 可空   String timeout_express="";    // 销售产品码 必填    String product_code=sessionDTO.getPersonInfoId()+"";    /**********************/    // SDK 公共请求类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签         //调用RSA签名方式    AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID, AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,AlipayConfig.SIGNTYPE);    AlipayTradeWapPayRequest alipay_request=new AlipayTradeWapPayRequest();        // 封装请求支付信息    AlipayTradeWapPayModel model=new AlipayTradeWapPayModel();    model.setOutTradeNo(out_trade_no);    model.setSubject(subject);    model.setTotalAmount(total_amount);    model.setBody(body);    model.setTimeoutExpress(timeout_express);    model.setProductCode(product_code);    alipay_request.setBizModel(model);    // 设置异步通知地址    alipay_request.setNotifyUrl(AlipayConfig.notify_url);    // 设置同步地址    alipay_request.setReturnUrl(AlipayConfig.return_url);       RechargeDTO rechargeDTO = new RechargeDTO();    rechargeDTO.setRechargeAccount(sessionDTO.getTelEmail());//种子账户    rechargeDTO.setRechargeTime(DateUtil.now());//充值时间    rechargeDTO.setRechargeNo(out_trade_no);//充值单号    rechargeDTO.setRechargeType(Constant.T_RECHARGE_RECHARGETYPE_ALIPAY);//支付宝    rechargeDTO.setRechargeMoney(rechargeMon);//充值金额    rechargeDTO.setRechargeState(Constant.T_RECHARGE_RECHARGESTATE_FAIL);//未支付    rechargeDTO.setOperationState(Constant.T_RECHARGE_OPERATIONSTATE_COMMON);//操作状态正常    rechargeDTO.setPersonId(sessionDTO.getPersonInfoId());//充值人    rechargeService.insertRechargeForAlipay(rechargeDTO);    //添加日志    logbackService.addLogApp(sessionDTO.getPersonInfoId(), "wap端支付宝充值开始,订单号为:"+out_trade_no, request,3);    // form表单生产    String form = "";// 调用SDK生成表单form = client.pageExecute(alipay_request).getBody();response.setContentType("text/html;charset=" + AlipayConfig.CHARSET);     response.getWriter().write(form);//直接将完整的表单html输出到页面     response.getWriter().flush();     response.getWriter().close();}} catch (Exception e) {logger.info("跳转到手机网站支付宝支付页面......");e.printStackTrace();map.addAttribute("errorMsg", "跳转到支付宝充值页面出错!");return "web/base/error";}return null;}/** 跳到支付宝同步通知页面  * @Description AlipayController.java  * @param map  * @param request  * @param response  * @param session  * @return  * @date 2017年6月26日下午6:28:50 */@RequestMapping(value="/returnUrl")public String returnUrl(ModelMap map, HttpServletRequest request, HttpServletResponse response,HttpSession session){try {logger.info("跳转到手机网站支付宝支付-同步通知-页面");//获取支付宝GET过来反馈信息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"), "utf-8");params.put(name, valueStr);}//logger.info("---------------------------------------------------------------params=========="+params);//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)////商户订单号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");//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)////计算得出通知验证结果//boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, "RSA2");logger.info("------------------------------------------支付宝同步通知页面验证成功------------------------------verify_result="+verify_result);map.addAttribute("money", params.get("total_amount")+"元");if(verify_result){//验证成功logger.info("------------------------------------------支付宝同步通知页面验证成功------------------------------");//RechargeDTO dto = rechargeService.selecctFromRechargeNo(out_trade_no);//如果该订单还没有处理//if(null!=dto &&  Constant.T_RECHARGE_RECHARGESTATE_FAIL==dto.getRechargeState()){//rechargeService.updateStateFormRechargeNo(trade_no, out_trade_no,params);//}return "wap/person/reChargeSuccess";}else{return "wap/person/reChargeFail";}} catch (Exception e) {logger.info("跳转到手机网站支付宝支付-同步不通知-页面-error");e.printStackTrace();map.addAttribute("errorMsg", "跳转到支付宝-同步通知页面-出错!");return "web/base/error";}}/** 跳到支付宝异步通知页面  * @Description AlipayController.java  * @param map  * @param request  * @param response  * @param session  * @return  * @date 2017年6月26日下午6:36:39 */@RequestMapping(value="/notifyUrl")public String notifyUrl(ModelMap map, HttpServletRequest request, HttpServletResponse response,HttpSession session){try {logger.info("跳转到手机网站支付宝支付-异步通知-页面");//获取支付宝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);}//logger.info("---------------------------------------------------------------params=========="+params);//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)////商户订单号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");//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)////计算得出通知验证结果//boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, "RSA2");logger.info("------------------------------------------支付宝异步通知页面验证成功:trade_finished------------------------------verify_result="+verify_result);if(verify_result){//验证成功////////////////////////////////////////////////////////////////////////////////////////////请在这里加上商户的业务逻辑程序代码//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——if(trade_status.equals("TRADE_FINISHED")){//判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的//如果有做过处理,不执行商户的业务程序logger.info("------------------------------------------支付宝异步通知页面验证成功:trade_finished------------------------------");rechargeService.updateStateFormRechargeNo(trade_no, out_trade_no,params);//注意://如果签约的是可退款协议,退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知//如果没有签约可退款协议,那么付款完成后,支付宝系统发送该交易状态通知。} else if (trade_status.equals("TRADE_SUCCESS")){//判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的//如果有做过处理,不执行商户的业务程序logger.info("------------------------------------------支付宝异步通知页面验证成功:trade_success------------------------------");rechargeService.updateStateFormRechargeNo(trade_no, out_trade_no,params);//注意://如果签约的是可退款协议,那么付款完成后,支付宝系统发送该交易状态通知。}//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——response.getWriter().println("success");response.getWriter().close();//////////////////////////////////////////////////////////////////////////////////////////}else{//验证失败response.getWriter().println("fail");response.getWriter().close();}//添加日志/*SessionDTO sessionDTO = (SessionDTO) request.getSession().getAttribute("sessionDTO");    logbackService.addLogApp(sessionDTO.getUserId(), "wap端支付宝充值结束,订单号为:"+out_trade_no, request,3);*/} catch (Exception e) {logger.info("跳转到手机网站支付宝支付-同步不通知-页面-error");e.printStackTrace();map.addAttribute("errorMsg", "跳转到支付宝-同步通知页面-出错!");return "web/base/error";}return null;}/** * pc端跳转支付 * @param * @return  String * @throws  Exception * @date    2017年6月29日 下午9:45:47 */@RequestMapping(value="/goPcPay", method={RequestMethod.POST})public String goPcPay(ModelMap map, HttpServletRequest request, HttpServletResponse response,HttpSession session,@RequestParam(value="rechargeMon",required=true)String rechargeMon) throws Exception{logger.info("------------------------------------------------进入到pc端支付宝充值------------------------------------------------");try {if(rechargeMon==null||rechargeMon.equals("")){logger.info("-----------------------------充值金额为空-------------------------------");map.addAttribute("errorMsg", "充值金额为空");return "web/base/error";}else if(Double.valueOf(rechargeMon)<Constant.MINRECHARGEMONEY){logger.info("-----------------------------充值金额小于"+Constant.MINRECHARGEMONEY+"元-------------------------------");map.addAttribute("errorMsg", "充值金额小于"+Constant.MINRECHARGEMONEY+"元");return "web/base/error";}SessionDTO sessionDTO = (SessionDTO)session.getAttribute("sessionDTO");//获得初始化的AlipayClientAlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID, AlipayConfig.RSA_PRIVATE_KEY, "json", AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGNTYPE);//设置请求参数AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();alipayRequest.setReturnUrl(AlipayConfig.return_url_pc);alipayRequest.setNotifyUrl(AlipayConfig.notify_url_pc);//商户订单号,商户网站订单系统中唯一订单号,必填String out_trade_no = OrderNumberUtil.getOrderNumber(sessionDTO.getInvitationCode());// 订单名称,必填String subject = "中意通充值金额"+rechargeMon;// 付款金额,必填String total_amount=rechargeMon;// 商品描述,可空String body = "用户["+sessionDTO.getPersonName()+"]中意通充值¥:"+rechargeMon; // 销售产品码 必填   // String product_code=sessionDTO.getPersonInfoId()+"";// 封装请求支付信息AlipayTradePagePayModel model=new AlipayTradePagePayModel();model.setOutTradeNo(out_trade_no);model.setSubject(subject);model.setTotalAmount(total_amount);model.setBody(body);model.setTimeoutExpress("");model.setProductCode("FAST_INSTANT_TRADE_PAY");  //  model.setProductCode(product_code);alipayRequest.setBizModel(model);RechargeDTO rechargeDTO = new RechargeDTO();rechargeDTO.setRechargeAccount(sessionDTO.getTelEmail());//种子账户rechargeDTO.setRechargeTime(DateUtil.now());//充值时间rechargeDTO.setRechargeNo(out_trade_no);//充值单号rechargeDTO.setRechargeType(Constant.T_RECHARGE_RECHARGETYPE_ALIPAY);//支付宝rechargeDTO.setRechargeMoney(rechargeMon);//充值金额rechargeDTO.setRechargeState(Constant.T_RECHARGE_RECHARGESTATE_FAIL);//未支付rechargeDTO.setOperationState(Constant.T_RECHARGE_OPERATIONSTATE_COMMON);//操作状态正常rechargeDTO.setPersonId(sessionDTO.getPersonInfoId());//充值人rechargeService.insertRechargeForAlipay(rechargeDTO);//添加日志logbackService.addLogApp(sessionDTO.getPersonInfoId(), "pc端支付宝充值开始,订单号为:"+out_trade_no, request,3);// 调用SDK生成表单String form = alipayClient.pageExecute(alipayRequest).getBody();map.put("result",form);} catch (Exception e) {logger.info("-----------------------------跳转到pc端支付宝支付页面出错-------------------------------");e.printStackTrace();map.addAttribute("errorMsg", "跳转到pc端支付宝支付页面出错");return "web/base/error";}    logger.info("------------------------------------------------返回pc端支付宝充值界面------------------------------------------------");    return "web/person/alipayPc";}/** * pc端同步通知 * @param * @return  String * @date    2017年6月29日 下午9:45:30 */@RequestMapping(value="/returnUrlPc")public String returnUrlPc(ModelMap map, HttpServletRequest request, HttpServletResponse response,HttpSession session) throws Exception{logger.info("------------------------------------pc同步通知-------------------------------------------");//获取支付宝GET过来反馈信息try {Map<String,String> params = new HashMap<String,String>();Map<String,String[]> requestParams = request.getParameterMap();for (Iterator<String> 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] + ",";}//乱码解决,这段代码在出现乱码时使用//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");params.put(name, valueStr);}boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, AlipayConfig.SIGNTYPE); //调用SDK验证签名String total_amount = new String(params.get("total_amount").getBytes("ISO-8859-1"),"UTF-8");//——请在这里编写您的程序(以下代码仅作参考)——if(signVerified) {//商户订单号String out_trade_no = new String(params.get("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");//支付宝交易号String trade_no = new String(params.get("trade_no").getBytes("ISO-8859-1"),"UTF-8");//付款金额response.setContentType("text/html;charset=" + AlipayConfig.CHARSET);     logger.info("-----------------out_trade_no:"+out_trade_no+"trade_no:"+trade_no+"total_amount:"+total_amount+"---------------------");map.put("success", total_amount);//添加日志SessionDTO sessionDTO = (SessionDTO) request.getSession().getAttribute("sessionDTO");    logbackService.addLogApp(sessionDTO.getPersonInfoId(), "pc端支付宝充值同步通知结束,订单号为:"+out_trade_no, request,3);}else {response.setContentType("text/html;charset=" + AlipayConfig.CHARSET); map.put("failure", total_amount);}} catch (Exception e) {logger.info("-----------------------------pc端支付宝同步通知出错-------------------------------");e.printStackTrace();map.addAttribute("errorMsg", "pc端支付宝同步通知出错");return "web/base/error";}//——请在这里编写您的程序(以上代码仅作参考)—— return "redirect:/finance/jumpWebRecharge";}/** * pc端异步通知 * @param * @return  String * @throws  * @date    2017年6月29日 下午9:45:17 */@RequestMapping(value = "/notifyUrlPc", method = RequestMethod.POST)public void notifyUrlPc(ModelMap map, HttpServletRequest request, HttpServletResponse response) throws Exception {String out_trade_no = null;String trade_no = null;String total_amount = null;try {logger.info("------------------------------------pc异步通知-------------------------------------------");// 获取支付宝POST过来反馈信息Map<String, String> params = new HashMap<String, String>();Map<String, String[]> requestParams = request.getParameterMap();for (Iterator<String> 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不相等也可以使用这段代码转化。请不要随意处理,支付宝返回的编码是GB2312// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "UTF-8");// testEncode(valueStr);params.put(name, valueStr);}// logger.info("---------------------------------------------------------------params=========="+params);// 获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//// 总金额total_amount = new String(params.get("total_amount").getBytes("ISO-8859-1"), "UTF-8");// 商户订单号out_trade_no = new String(params.get("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");// 支付宝交易号trade_no = new String(params.get("trade_no").getBytes("ISO-8859-1"), "UTF-8");// 交易状态String trade_status = new String(params.get("trade_status").getBytes("ISO-8859-1"), "UTF-8");// 获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//// 计算得出通知验证结果// boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY,AlipayConfig.CHARSET, "RSA2");logger.info("------------------------------------------支付宝异步通知页面验证成功:trade_finished------------------------------verify_result="+ verify_result);if (verify_result) {// 验证成功//////////////////////////////////////////////////////////////////////////////////////////// 请在这里加上商户的业务逻辑程序代码// ——请根据您的业务逻辑来编写程序(以下代码仅作参考)——if (trade_status.equals("TRADE_FINISHED")) {// 判断该笔订单是否在商户网站中已经做过处理// 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序// 请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的// 如果有做过处理,不执行商户的业务程序logger.info("------------------------------------------支付宝异步通知页面验证成功:trade_finished------------------------------");rechargeService.updateStateFormRechargeNo(trade_no, out_trade_no, params);// 注意:// 如果签约的是可退款协议,退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知// 如果没有签约可退款协议,那么付款完成后,支付宝系统发送该交易状态通知。} else if (trade_status.equals("TRADE_SUCCESS")) {// 判断该笔订单是否在商户网站中已经做过处理// 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序// 请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的// 如果有做过处理,不执行商户的业务程序logger.info("------------------------------------------支付宝异步通知页面验证成功:trade_success------------------------------");rechargeService.updateStateFormRechargeNo(trade_no, out_trade_no, params);// 注意:// 如果签约的是可退款协议,那么付款完成后,支付宝系统发送该交易状态通知。}// ——请根据您的业务逻辑来编写程序(以上代码仅作参考)——response.getWriter().println("success");response.getWriter().close();//////////////////////////////////////////////////////////////////////////////////////////} else {// 验证失败response.getWriter().println("fail");response.getWriter().close();logger.info("-------------------------------fail-------------------------------");}} catch (Exception e) {logger.info("跳转到pc网站支付宝支付-同步不通知-页面-error");e.printStackTrace();logger.info("-------------------------------正在调用pc端退款接口-------------------------------");alipayRefund(out_trade_no, trade_no, total_amount, "pc端更新账户余额失败","");}}/** * 退款支付宝.请保证每次付款失败对应调用一次退款,退款金额为付款全部金额 * @param out_trade_no 商户订单号 * @param trade_no 支付宝交易号 * @param out_request_no 商户订单号 * @param refund_amount 退款金额(此方法是全部金额)该金额不能大于订单金额,单位为元,支持两位小数 * @param refund_reason 退款原因,可空串 * @param out_request_no 标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传 * @return  boolean * @throws  Exception * @date    2017年7月4日 下午5:01:41 */private boolean alipayRefund(String out_trade_no,String trade_no,String refund_amount,String refund_reason,String out_request_no){AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID, AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGNTYPE);//设置请求参数AlipayTradeRefundRequest alipayRequest = new AlipayTradeRefundRequest();alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\"," + "\"trade_no\":\""+ trade_no +"\"," + "\"refund_amount\":\""+ refund_amount +"\"," + "\"refund_reason\":\""+ refund_reason +"\","+ "\"out_request_no\":\""+ out_request_no +"\"}");try {//请求String result = alipayClient.execute(alipayRequest).getBody();JSONObject json=new JSONObject(new String(result));JSONObject jsonsub = (JSONObject) json.get("alipay_trade_refund_response");String msg = jsonsub.getString("msg");if(msg.equals("Success")){logger.info("-----------------------------------支付宝退款成功\r\nout_trade_no:"+out_trade_no+"\r\ntrade_no:"+trade_no+"\r\nrefund_amount:"+refund_amount+"\r\nrefund_reason:"+refund_reason+"----------------------------------------------");return true;}else{logger.info("-----------------------------------支付宝退款异常\r\nout_trade_no:"+out_trade_no+"\r\ntrade_no:"+trade_no+"\r\nrefund_amount:"+refund_amount+"\r\nrefund_reason:"+refund_reason+"----------------------------------------------");return false;}} catch (AlipayApiException e) {logger.info("-----------------------------------支付宝退款异常\r\nout_trade_no:"+out_trade_no+"\r\ntrade_no:"+trade_no+"\r\nrefund_amount:"+refund_amount+"\r\nrefund_reason:"+refund_reason+"----------------------------------------------");e.printStackTrace();return false;}}}

下面是配置文件


原创粉丝点击