pay.ftl

<span style="white-space:pre">  </span><div class="orderMes"><p>感谢您在本店购物!您的订单号已提交成功,请记住您的订单号:<span class="textRed">${order.orderno}</span></p><p>您选定的配送方式为:<span class="textRed">顺丰</span>;您选定的支付方式为:<span class="textRed">支付宝</span>;您的应付款金额为:<span class="textRed">¥${order.total}</span>;</p><span style="color:#ff0000;"> <a class="payBtn" href="${path}/alipay/gopay/${order.id}">立即支付 ></a></span><p>您可以返回<a class="textOrange" href="${path}/index">首页</a>或去<a class="textOrange" href="${path}/manage/order">用户中心</a></p></div>

AlipayApiController

@SuppressWarnings(value="all")
@Controller
@RequestMapping(value="/alipay")
public class AlipayApiController extends BaseController {Logger logger = Logger.getLogger(AlipayApiController.class);public static final String ALIPAY_GATEWAY_NEW = "https://mapi.alipay.com/gateway.do?";@Autowiredprivate IOrderService orderService;@Autowiredprivate ICorpPayaccountService accountService;@Autowiredprivate InitService initService;/*** 支付宝回调 url配置 */public String Alipay_URL = "";@ModelAttributepublic void init(ServletRequest req, ServletResponse resp) throws Exception{Alipay_URL = initService.getPcpath();HttpServletRequest request = (HttpServletRequest)req;   HttpServletResponse response = (HttpServletResponse) resp;  HttpSession session = request.getSession();Long storeId=(Long) session.getAttribute("storeId");
//          if(store.getPcurl().equals("rzh.ebiaoji.com")){
//              Alipay_URL="http://"+store.getPcurl()+"/shop-pc";
//          }else{
//              Alipay_URL="http://"+store.getPcurl();
//          }}<span style="color:#ff0000;">/** * 功能: 前往支付宝支付页面* 说明 : 订单创建后,生成支付链接,跳转到支付宝页面* 日期 : 2015-09-10 by chan*/@RequestMapping(value="/gopay/{orderid}")public String goodsid(ModelMap model,@PathVariable Long orderid)throws Exception{//获取商家账号信息(支付宝支付=1)</span><span style="color:#cc33cc;">PaymentAccount payaccount = accountService.findByCorpIdAndPaymode(corpid, PayTypeEnum.ALIPAY.getValue());Order order = orderService.getOrder(orderid);</span><span style="color:#ff0000;">if(null == payaccount){logger.info("商家没有设置支付账号");return "/system/500";}else{</span><span style="color:#cc33cc;">String sHtmlText = buildRequest(order, payaccount);model.addAttribute("sHtmlText", sHtmlText);//唤起收银支付页面</span><span style="color:#009900;">return "/alipay/pay";</span><span style="color:#ff0000;">}}</span><span style="color:#cc33cc;"> /***功能:即时到账交易接口接入页*版本:3.3*日期:2012-08-14*说明:*以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。*该代码仅供学习和研究支付宝接口使用,只是提供一个参考。*************************注意******************如果您在接口集成过程中遇到问题,可以按照下面的途径来解决*1、商户服务中心(https://b.alipay.com/support/helperApply.htm?action=consultationApply),提交申请集成协助,我们会有专业的技术工程师主动联系您协助解决*2、商户帮助中心(http://help.alipay.com/support/232511-16307/0-16307.htm?sh=Y&info_type=9)*3、支付宝论坛(http://club.alipay.com/read-htm-tid-8681712.html)*如果不想使用扩展功能请把扩展功能参数赋空值。***********************************************/private String buildRequest(Order order,PaymentAccount payaccount) throws Exception { // 支付类型  // 必填,不能修改  String payment_type = "1";  // 服务器异步通知页面路径  // 需http://格式的完整路径,不能加?id=123这类自定义参数  String notify_url =  Alipay_URL+"/alipay/notify_url/"+order.getId();// 页面跳转同步通知页面路径  // 需http://格式的完整路径,不能加?id=123这类自定义参数,不能写成http://localhost/  String return_url = Alipay_URL+"/alipay/return_url/"+order.getId();//商户订单号.商户网站订单系统中唯一订单号,必填  String out_trade_no = order.getOrderno() ;//订单名称   必填   String subject = "商城订单支付";  //订单金额String total_fee = order.getTotal().toString();//订单描述String body = "订单描述,共"+total_fee+"元";Map<String, String> sParaTemp = new HashMap<String, String>();sParaTemp.put("service", "create_direct_pay_by_user");//接口服务----即时到账sParaTemp.put("partner", payaccount.getPartnerid());//支付宝PIDsParaTemp.put("seller_email", payaccount.getSellerid());//卖家支付宝账号sParaTemp.put("_input_charset", AlipayConfig.input_charset);//统一编码sParaTemp.put("payment_type", payment_type);//支付类型sParaTemp.put("notify_url", notify_url);//异步通知页面sParaTemp.put("return_url", return_url);//页面跳转同步通知页面sParaTemp.put("out_trade_no", out_trade_no);//商品订单编号sParaTemp.put("subject", subject);//商品名称sParaTemp.put("total_fee", total_fee);//价格sParaTemp.put("body", body);//建立请求String sHtmlText = AlipaySubmit.buildRequest(ALIPAY_GATEWAY_NEW, sParaTemp, "get", "确认",payaccount.getPayservice());logger.info("生成链接"+sHtmlText);return sHtmlText;}  </span>/** * 功能 : 支付宝支付页面跳转异步通知页面路径     通知支付宝* 说明 : 修改订单状态,减少库存数量* 日期 : 2015-09-23 by chan*/@RequestMapping(value="/notify_url/{orderid}",method=RequestMethod.POST)public void alipaytoNotify(ModelMap model,@PathVariable java.lang.Long orderid,HttpServletRequest request,HttpServletResponse response)throws Exception{System.out.println("=============================alipay start notify..."+new Date());//获取商家账号信息(支付宝支付=1)PaymentAccount payaccount = accountService.findByCorpIdAndPaymode(corpid, PayTypeEnum.ALIPAY.getValue());if(null == payaccount){System.out.println("=============================商家没有设置支付账号...");logger.info("商家没有设置支付账号");}else{//获取支付宝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);}//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)////RSA签名解密if(AlipayConfig.sign_type.equals("0001")) {params = AlipayNotify.decrypt(params);}//System.out.println("支付宝支付 服务器异步通知页面路径:"+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");//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//String msg="";if(AlipayNotify.verifyNotify(params,payaccount.getPartnerid(),payaccount.getPayservice())){//验证成功////请在这里加上商户的业务逻辑程序代码//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——if(trade_status.equals("TRADE_FINISHED")){//判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//如果有做过处理,不执行商户的业务程序//注意://该种交易状态只在两种情况下出现//1、开通了普通即时到账,买家付款成功后。//2、开通了高级即时到账,从该笔交易成功时间算起,过了签约时的可退款时限(如:三个月以内可退款、一年以内可退款等)后。msg="success"; //请不要修改或删除} else if (trade_status.equals("TRADE_SUCCESS")){//判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//如果有做过处理,不执行商户的业务程序//注意://该种交易状态只在一种情况下出现——开通了高级即时到账,买家付款成功后。msg="success";    }//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——//}else{//验证失败msg="fail";   }//支付宝支付 服务器回调 服务器订单 查询if(msg.equals("success")){//支付宝支付 服务器回调 服务器订单 查询Order order = orderService.getOrder(orderid);//已经支付过的订单Order payOrder =  orderService.findByIdAndPaystatus(orderid, PayStatusEnum.YES.getValue());if(null!=order && payOrder == null){orderService.payOrder(order);}//请不要修改或删除response.getWriter().println("success");}else{response.getWriter().println("fail");}System.out.println("支付宝支付 服务器异步通知页面路径:"+params);System.out.println("支付宝支付 页面跳转异步通知页面路径:"+msg);}}/** * 功能 : 支付宝支付服务器同步通知页面路径 * 说明: 支付成功,返回本地订单列表* 日期 : 2015-09-23 by chan*/@RequestMapping(value="/return_url/{orderid}")public String alipaytoCallback(ModelMap model,@PathVariable java.lang.Long orderid,HttpServletRequest request)throws Exception{//获取商家账号信息(支付宝支付=1)PaymentAccount payaccount = accountService.findByCorpIdAndPaymode(corpid, PayTypeEnum.ALIPAY.getValue());if(null == payaccount){logger.info("商家没有设置支付账号");return "/system/500";}else{//获取支付宝GET过来反馈信息Map<String,String> params = new HashMap<String,String>();Map requestParams = request.getParameterMap();System.out.println("请求参数:"+requestParams);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);}System.out.println("支付参数:"+params);System.out.println("支付宝支付 服务器同步通知页面路径:"+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 result = new String(request.getParameter("result").getBytes("ISO-8859-1"),"UTF-8");//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)////计算得出通知验证结果boolean verify_result = AlipayNotify.verifyNotify(params,payaccount.getPartnerid(),payaccount.getPayservice());String msg="";if(verify_result){//验证成功////请在这里加上商户的业务逻辑程序代码//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——//该页面可做页面美工编辑msg="验证成功<br />";//——请根据您的业务逻辑来编写程序(以上代码仅作参考)—— //支付宝支付 服务器回调 服务器订单 查询Order order=orderService.getOrder(orderid);//已经支付过的订单Order payOrder =  orderService.findByIdAndPaystatus(orderid, PayStatusEnum.YES.getValue());if(null!=order && order.getStatus()!=1 && payOrder == null){orderService.payOrder(order);}return "redirect:/manage/order";}else{//该页面可做页面美工编辑msg="验证失败";}//支付宝支付 服务器异步通知页面路径model.addAttribute("errormsg", "支付宝支付 服务器同步通知页面路径:"+msg);return "/system/500";}}/** 2014-10-13  add by wayne* 支付宝支付 操作中断返回地址* @param model* @param request* @return* @throws Exception*/@RequestMapping(value="/error_url/{orderid}")public String alipayerror(ModelMap model,@PathVariable java.lang.Long orderid,HttpServletRequest request) throws Exception{System.out.println("支付宝支付操作中断返回地址:"+orderid);Order order=orderService.getOrder(orderid);if(null!=order){model.addAttribute("errormsg", "订单支付错误");return "redirect:"+Alipay_URL+"/manage/order/"+order.getId();}else{return "/system/500";}}}

CorpPayaccountServiceImpl

@Component
public class CorpPayaccountServiceImpl extends BaseServiceImpl<PaymentAccount> implements ICorpPayaccountService{@Autowiredprivate CorpPayaccountDao accountDao;/** ------------------------------- 扩展  ------------------------------*/<span style="color:#cc33cc;">/*** 查询当前企业下支付方式,1:支付宝,2:微信支付,3:其他(免费)*/@Overridepublic PaymentAccount findByCorpIdAndPaymode(Long corpid,Integer paymode) throws Exception {return accountDao.findByCorpIdAndPaymode(corpid,paymode);}</span>}

OrderServiceImpl

<pre name="code" class="java">@Component
public class OrderServiceImpl extends BaseServiceImpl<Order> implementsIOrderService {@Autowiredprivate OrderDao orderDao;@Autowiredprivate OrderHistoryDao orderHistoryDao;@Autowiredprivate OrderItemDao orderItemDao;@Autowiredprivate IGoodsService goodsService;@Autowiredprivate IMemberService memberService;@Autowiredprivate ICartService cartService;@Autowiredprivate IMessageChannelService messageChannelService;@Autowiredprivate IVoucherRecordService voucherRecordService;
/**
<span>    </span><span style="color:#cc33cc;"> * 查询订单 单一
<span>    </span> */
<span>    </span>@Override
<span>    </span>public Order getOrder(Long id) throws Exception {
<span>        </span>return orderDao.findOne(id);
<span>    </span>}</span>
}

pay.ftl

 <!DOCTYPE html><html lang="zh"><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"><meta charset="utf-8"><title></title><meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"><meta content="yes" name="apple-mobile-web-app-capable"><meta content="black" name="apple-mobile-web-app-status-bar-style"><meta name="format-detection" content="telephone=no"></head><body><span style="color:#009900;">${sHtmlText}</span></body>
</html>

Javaweb支付宝支付相关推荐

  1. JavaWEB后端支付银联,支付宝,微信对接

    注:本文来源于:<  JavaWEB后端支付银联,支付宝,微信对接  > JavaWEB后端支付银联,支付宝,微信对接 标签(空格分隔): java 项目概述 最近项目需要后端打通支付,所 ...

  2. 2021-02-11-JavaWeb网站接入支付宝支付

    JavaWeb网站接入支付宝支付 前言 前序步骤 接入 pom.xml 在沙箱环境获取测试账号,以及付钱的账号 公钥私钥的生成可以下面这个工具 Controller层 模拟付款 前言 今天给大家分享一 ...

  3. AndroidSDK结合SpringBoot实现支付宝支付功能

    开发者注册: 1. 创建应用,获取AppID:开发者可在沙箱中完成. 沙箱应用网址:https://openhome.alipay.com/platform/appDaily.htm 2. 在支付宝助 ...

  4. php yii2支付宝开发,yii2 支付宝支付教程 [ 2.0 版本 ]

    yii2 支付宝支付教程 [ 2.0 版本 ] 支付宝支付流程个人理解大致就这三步 1.前台页面将支付信息数据通过立即支付按钮 ajax提交到订单处理层 2.在订单处理层引用支付宝的接口 将支付数据写 ...

  5. Spring MVC+Spring+Mybatis实现支付宝支付功能(附完整代码)

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:https://urlify.cn/aYrmIr 前言 本教 ...

  6. Spring MVC+Spring+Mybatis实现支付宝支付功能(图文详解+完整代码)

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:欧阳思海 github.com/OUYANGSIHAI/si ...

  7. 刚刚!美团取消支付宝支付

    昨晚,有用户在使用美团支付时发现,美团月付和银行卡支付占据优先位置,而不再显示支付宝支付了,而微信支付处于友好位置. 素材来源于网络侵删 针对"美团正式取消支付宝支付",美团创始人 ...

  8. php 支付宝支付 简书,支付宝支付接口

    1. 申请支付宝应用(这个要一定时间,先去申请好) 应用ID在支付宝商户界面->开发者中心->我的应用 里找到要使用的应用,如果没有就要新建支付应用,在创建界面选择'自用型应用'然后创建, ...

  9. android支付宝插件,GitHub - DmcSDK/cordova.plugin.alipay: cordova 支付宝支付插件,支持IOS Android。...

    cordova.plugin.alipay cordova 支付宝支付插件 cordova plugin add https://github.com/DmcSDK/cordova.plugin.al ...

最新文章

  1. Asp.net MVC2.0系列文章-添加操作
  2. python类中self是什么
  3. 用于弹出ModalDialog进行数据选择的控件
  4. php跨域请求解决方案_swoft2 -跨域与中间件详解
  5. redis学习与入门~~~
  6. qt输出中文乱码处理(解决方法)
  7. 电子商务计算机网络的分类可分为,电子商务员基础知识:计算机网络的分类与拓扑结构...
  8. 最简单的基于FFmpeg的libswscale的示例(YUV转RGB)
  9. 44膜型键盘_小学四年级数学上册考试必考题型:判断题练习题
  10. Virtual Studio 2010介绍及下载
  11. Kafka从上手到实践 - 实践真知:Kafka Java Producer | 凌云时刻
  12. Java 实验五 王奕开
  13. linux 动态加载日志,Linux动态显示文件内容-linux tailf命令详解-Linux tailf命令退出-嗨客网...
  14. 联想服务器加装显卡无显示,标配11201355主板的启天M4330在 Win8系统加装独立显卡“无显无报警”...
  15. [渝粤教育] 晋中学院 晋商大院三雕艺术 参考 资料
  16. 安装arcgis api for python步骤、以及注意事项
  17. 电视盒子做文件共享服务器,【当贝市场】智能电视盒子和PC电脑文件共享教程...
  18. 计算机备注用if函数怎么算,excel SUMIF函数按条件求和的使用详解
  19. beautify插件实现.wxml文件属性自动换行
  20. 云服务器中的mac地址是什么?

热门文章

  1. 样本量对差异性分析(Anova)或者T 检验的影响
  2. Makefile wildcard
  3. 推荐丨全球主要城市TOD数据
  4. CentOS 8: No URLs in mirrorlist error
  5. 随机生成10位数QQ号.c
  6. SQL优化:Hive---distribute by 防止数据倾斜
  7. 配合理lcd的c语言小游戏,51单片机+LCD12864做的贪食蛇和俄罗斯方块小游戏分享
  8. 缺失值处理(Imputation)
  9. 搜狗浏览器屏蔽广告插件_搜狗浏览器屏蔽芒果TV视频广告:被判不正当竞争,赔了12万...
  10. AC/DC 电源适配器拆解