mark Pay http://git.oschina.net/littleCrazy/dianshangpingtai-zhifu/blob/master/OrderPayController
@Controller@RequestMapping("/api/pay/")public class OrderPayController extends BaseController{@Autowiredprivate OrderManager orderManager;@Autowiredprivate ProductByIdCacheManager productByIdCacheManager;@AutowiredOrderPaymentTypeRecordManager orderPaymentTypeRecordManager;/*** 订单支付支付* @param request* @return*/@LoginInterceptor(value=LoginInterceptor.LOGIN, contType=LoginInterceptor.CONT_JOSN_TYPE)@RequestMapping(value="/orderPay")public @ResponseBody Map<String, Object> orderPay(final HttpServletRequest request ,final HttpServletResponse response) {Map<String, Object> resultMap = new HashMap<String, Object> ();Long orderId = StringUtil.nullToLong(request.getParameter("orderId"));String payType = StringUtil.null2Str(request.getParameter("payType"));response.setHeader("Access-Control-Allow-Origin", "*");try{String body = "订单支付";String outTradeNo = "";String clientIp = RequestUtil.getClientIp(request);// 是否微信请求boolean isWebRequest = RequestUtil.isWeixin(request);Integer paymentType = 0;Long weChatConfigId = null;if(StringUtil.compareObject(payType, "weixin")){// 微信支付int orderTotal = 0;String notifyURL = RequestUtil.getRequestURL(request) + "/api/order/wxpayNotify.msp";String openId = StringUtil.null2Str(request.getSession().getAttribute(PortalConstants.SESSION_CURRENT_OPEN_ID));Map<String, String> orderPayInfoMap = new HashMap<String, String>();WeChatAppConfig weChatAppConfig = null;if(isWebRequest){//微页面-微信公众号支付weChatAppConfig = Constants.WECHAT_APP_CONFIG_MAP.get(StringUtil.null2Str("test"));orderPayInfoMap = WeiXinPayUtil.getWeixinH5PayInfo(weChatAppConfig, outTradeNo, openId, notifyURL, orderTotal, body, clientIp);if(orderPayInfoMap != null && !StringUtil.isNull(orderPayInfoMap.get("code_url"))){//跨号支付String codeUrl = StringUtil.null2Str(orderPayInfoMap.get("code_url"));if(StringUtil.isNull(codeUrl)){resultMap.put(PortalConstants.CODE, PortalConstants.CODE_ERROR);resultMap.put(PortalConstants.MSG, "支付失败");resultMap.put(PortalConstants.SYSTEMTIME, DateUtil.getCurrentTime());return resultMap;}//生成二维码图片,并返回地址String filePath = MatrixToImageWriterUtil.saveMatrixImage(codeUrl);if(StringUtil.isNull(filePath)){resultMap.put(PortalConstants.CODE, PortalConstants.CODE_ERROR);resultMap.put(PortalConstants.MSG, "支付失败");resultMap.put(PortalConstants.SYSTEMTIME, DateUtil.getCurrentTime());return resultMap;}String requestURL = RequestUtil.getRequestURL(request);filePath = requestURL + filePath;Map<String, String> paramMap = new HashMap<String, String>();paramMap.put("imagePath", filePath);paramMap.put("isOther", "1"); //是否跨号支付resultMap.put("orderPayInfo", paramMap);resultMap.put(PortalConstants.CODE, PortalConstants.CODE_SUCCESS);resultMap.put(PortalConstants.MSG, "拉取支付信息成功");resultMap.put(PortalConstants.SYSTEMTIME, DateUtil.getCurrentTime());return resultMap;}else{orderPayInfoMap.put("isOther", "0"); //是否跨号支付}}else{weChatAppConfig = Constants.WECHAT_APP_CONFIG_MAP.get(StringUtil.null2Str("app_client"));orderPayInfoMap = WeiXinPayUtil.getWeixinAppPayInfo(weChatAppConfig, outTradeNo, openId, notifyURL, orderTotal, body, clientIp);}resultMap.put("orderPayInfo", orderPayInfoMap);paymentType = PaymentType.PAYMENT_TYPE_WECHAT;weChatConfigId = weChatAppConfig.getConfigId();}else{String orderTotal = "";String notifyURL = RequestUtil.getRequestURL(request) + "/api/order/alipayNotify.msp";String returnURL = RequestUtil.getRequestURL(request) + "/api/order/alipayNotify.msp";if(isWebRequest){//浏览器支付宝支付String orderPayURL = RequestUtil.getRequestURL(request) + "/wap/pay.html?orderNo=" + outTradeNo;resultMap.put("orderPayInfo", orderPayURL);}else{//客户端支付宝支付String orderPayInfo = AliPayUtil.getAliPayAppInfo(AliPayUtil.ALI_PAY_CLT_APP_TYPE, outTradeNo, orderTotal, body, notifyURL, returnURL);resultMap.put("orderPayInfo", orderPayInfo);}paymentType = PaymentType.PAYMENT_TYPE_ALIPAY;}//记录客户端调用支付方式OrderPaymentTypeRecord record = new OrderPaymentTypeRecord();record.setOrderId(orderId);record.setPaymentType(paymentType);record.setWeChatConfigId(weChatConfigId);record.setCreateTime(new Date());record.setUpdateTime(new Date());record.setSyncNumber(0);orderPaymentTypeRecordManager.save(record);resultMap.put(PortalConstants.CODE, PortalConstants.CODE_SUCCESS);resultMap.put(PortalConstants.MSG, "拉取支付信息成功");resultMap.put(PortalConstants.SYSTEMTIME, DateUtil.getCurrentTime());return resultMap;}catch(Exception e){e.printStackTrace();}resultMap.put(PortalConstants.CODE, PortalConstants.CODE_ERROR);resultMap.put(PortalConstants.MSG, this.getText("获取支付失败"));resultMap.put(PortalConstants.SYSTEMTIME, DateUtil.getCurrentTime());return resultMap;}}@Controller@RequestMapping("/api/order/")public class OrderPayNotifyController extends BaseController{// 定义锁对象private static Lock lock = new ReentrantLock();@Autowiredprivate OrderManager orderManager;@Autowiredprivate OrderByIdCacheManager orderByIdCacheManager;@AutowiredOrderPaymentTypeRecordManager orderPaymentTypeRecordManager;/*** 更新订单支付成功信息* @param orderId* @param outTradeNo* @param transactionId* @param typeCode* @return*/public static void updateOrderPaymentSuccStatus(Long orderId, String outTradeNo, String transactionId, Integer paymentType, Long weChatConfigId){}/*** 微信支付回调通知* @param request* @param response*/@RequestMapping(value="/wxpayNotify")public void wxpayNotify(final HttpServletRequest request, HttpServletResponse response) {try{String resultXML = FileIO.inputStream2String(request.getInputStream());log.info(String.format("weChatPayNotify[XML]==>[%s]", resultXML));Map<String, Object> notifyObjectMap = XmlParseUtil.xmlCont2Map(resultXML);if(notifyObjectMap != null&& notifyObjectMap.size() > 0&& notifyObjectMap.containsKey("return_code")&& StringUtil.compareObject("SUCCESS", StringUtil.null2Str(notifyObjectMap.get("return_code")))){String appid = StringUtil.null2Str(notifyObjectMap.get("appid"));String transactionId = StringUtil.null2Str(notifyObjectMap.get("transaction_id"));String outTradeNo = StringUtil.null2Str(notifyObjectMap.get("out_trade_no"));String sign = StringUtil.null2Str(notifyObjectMap.get("sign"));//标识微信支付 1 或者 微信公众号支付 5WeChatAppConfig weChatAppConfig = Constants.WECHAT_APP_ID_MAP.get(appid);if(weChatAppConfig == null || weChatAppConfig.getAppId() == null){this.writeTextResponse(response, "<xml><return_code><![CDATA[FAIL]]></return_code></xml>");return;}notifyObjectMap.remove("sign");String notifySign = WeiXinPayUtil.getNotifySignString(notifyObjectMap, weChatAppConfig.getSecretKey());// 验证签名是否正确if(StringUtil.compareObject(notifySign, sign)){Order order = this.orderManager.getOrderByOrderNo(outTradeNo);if(order != null && order.getOrderId() != null){//根据支付流水号获取支付信息MsgModel<String> msModel = WeiXinPayUtil.getQueryPayInfo(weChatAppConfig, transactionId, null);int orderTotal = WeiXinPayUtil.orderAmountToBranch(order.getOrderAmount());if(StringUtil.nullToBoolean(msModel.getIsSucc()) && StringUtil.compareObject(msModel.getData(), orderTotal)){OrderPayNotifyController.updateOrderPaymentSuccStatus(order.getOrderId(), outTradeNo, transactionId, PaymentType.PAYMENT_TYPE_WECHAT, weChatAppConfig.getConfigId());//删除订单对应的支付方式记录orderPaymentTypeRecordManager.deleteByOrderId(order.getOrderId());this.writeTextResponse(response, "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>");return;}}}}}catch(Exception e){e.printStackTrace();}this.writeTextResponse(response, "<xml><return_code><![CDATA[FAIL]]></return_code></xml>");}/*** 支付宝支付回调通知* @param request* @param response*/@RequestMapping(value="/alipayNotify")public void alipayNotify(final HttpServletRequest request, HttpServletResponse response) {Map<String, String> params = new HashMap<String, String>(); //将异步通知中收到的待验证所有参数都存放到map中Map<String, String[]> requestParams = request.getParameterMap();StringBuffer paramBuffer = new StringBuffer();if(requestParams != null && requestParams.size() > 0){for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) {String name = iter.next();String[] values = (String[])requestParams.get(name);String valueStr = "";for (int i = 0; i < values.length; i++) {valueStr = i == values.length - 1 ? new StringBuilder().append(valueStr).append(values[i]).toString() : new StringBuilder().append(valueStr).append(values[i]).append(",").toString();}params.put(name, valueStr);paramBuffer.append(new StringBuilder().append(StringUtil.null2Str(name)).append("=").append(StringUtil.null2Str(valueStr)).append(",").toString());}}String out_trade_no = StringUtil.null2Str(params.get("out_trade_no"));String trade_no = StringUtil.null2Str(params.get("trade_no"));String trade_status = StringUtil.null2Str(params.get("trade_status"));log.info(String.format("quickPayment[record]==>[%s]", paramBuffer.toString()));boolean verify = AliPayUtil.verify(params);if(verify){try{if(trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")){Order order = this.orderManager.getOrderByOrderNo(out_trade_no);if(order != null && order.getOrderId() != null){//根据支付流水号获取支付信息MsgModel<String> msModel = AliPayUtil.getQueryAliPayInfo(out_trade_no, trade_no);if(StringUtil.nullToBoolean(msModel.getIsSucc()) && StringUtil.compareObject(msModel.getData(), StringUtil.formatDouble2Str(order.getOrderAmount()))){OrderPayNotifyController.updateOrderPaymentSuccStatus(order.getOrderId(), out_trade_no, trade_no, PaymentType.PAYMENT_TYPE_ALIPAY, null);//删除订单对应的支付方式记录orderPaymentTypeRecordManager.deleteByOrderId(order.getOrderId());this.writeTextResponse(response, "success");return;}}}}catch(Exception ex){ex.printStackTrace();}}this.writeTextResponse(response, "fail");}}
mark Pay http://git.oschina.net/littleCrazy/dianshangpingtai-zhifu/blob/master/OrderPayController的更多相关文章
- 在Ubuntu 16.10 安装 git 并上传代码至 git.oschina.net
1. 注册一个账号和创建项目 先在git.oschina.net上注册一个账号和新建一个project ,如project name 是"myTest". 2.安装git sudo ...
- Git(远程仓库:git@oschina)-V2.0
1.注册git@osc(也就是“码云”) 这里会提示注册密码==push密码,反正一定要记住的东西. 2.安装git 这里要设置个人信息 git config --list //查看git信息 g ...
- 使用GIT@OSChina 实现协同工作的方法。
由于我新建了一个团队,团队里的人对于GIT都不太熟悉,所以才有了这篇文章.我用的是git-1.9.4的版本,所以我建议团队里面的成员也使用这个版本.首先是下载git,这个自己去网上找吧,一大堆,记得是 ...
- 4.代码同时托管到github和git.oschina.net
我的开源项目托管在Github,同时在Git@OSC也有备份,有两个地方,是不是很麻烦呢?非也非也,下面介绍一下我是怎么做的. 1.先在Github新建一个项目,点击Github主页右上角的加号 -& ...
- Windows 下使用git 将代码托管到开源中国-(http://git.oschina.net/)
一.准备工作 当然是准备在windows 下使用需要的环境,和工具. msysgit 下载地址:http://msysgit.github.io/ TortoiseGit 下载地址:https:// ...
- vs2015使用GIt连接git.oschina.net/
本文转自:http://www.bubuko.com/infodetail-1066588.html.谢谢作者 先安装Git命令行,下载地址:https://github.com/git-for-wi ...
- git@oschina.net源代码管理使用日记
git的优势: 1 可以创建分支: 2 版本控制是基于每一次提交的,而不需要考虑每次提交了多少个文件. 下载: 下载网址为:http://git-scm.com/download,根据您的操作系统选择 ...
- git 教程 git.oschina.net
官方说明:http://git.oschina.net/oschina/git-osc/wikis/%E5%B8%AE%E5%8A%A9#ssh-keys 安装完成后,在开始菜单里找到"Gi ...
- 第一次在gitHub上传项目到git.oschina的方法
首先在Git@osChina创建一个项目仓库 1.创建sshKey公钥 ssh-keygen -t rsa -C "ty635725964@qq.com" 之后连续三个空格,默认无 ...
随机推荐
- 实战:INNOBACKUPEX for mysql 5.6自己主动还原脚本-v2
脚本再次更新,共享一下! #!/bin/sh # # 用法: # ./restore.sh /你备份文件的全路径 #ocpyang@126.com INNOBACKUPEX=innobackupex ...
- svn自助改动password(PHP脚本实现)
#创建脚本文件夹 mkdir -p /var/www/svn/svntools #创建apache配置文件 touch /etc/httpd/conf.d/alias.conf #输入下面内容: Al ...
- 在Fedora8上安装使用ActiveMQ5.8
[ActiveMQ安装] ActiveMQ在win平台的安装简单,在Linux Fedora上安装也不难,解压就可以了.以下是我总结的步骤: 第一步,从以下地址下载apache-activemq-5. ...
- 几种流行Webservice框架性能对比(转载)
1摘要 开发webservice应用程序中离不开框架的支持,当open-open网站列举的就有很多种,这对于开发者如何选择带来一定的疑惑.性能Webservice的关键要素,不同的框架性能上存在较大差 ...
- STL - 容器 - Map(二)
把Map用作关联式数组 MapAdvanceTest.cpp #include <map> #include <string> #include <iostream> ...
- MVC 之 <%%>相关内联代码块用法
1.<%@ ... %> 添加引用; 2.<% ... %> <%%>之间可以执行服务端代码,如<% foreach (DataRow dataRow in ...
- mac 终端 使用 gnu coreutils 工具 ls 颜色显示
mac 终端默认 ls 命令无颜色显示: 1: 使用 ls -G 可以显示基本颜色 2:使用 gnu coreutils 工具 mac 终端 使用 gnu coreutils 工具 ls 颜色显示 以 ...
- [Done]mysql in (#{list}) 只能查询/删除第一条的问题
数据如下(注意age是int类型): sql如下(注意是#不是$): java代码: Mybatis日志(只返回一笔记录): 直接在mysql中执行(age是int类型,注意参数带引号,确认jdbc是 ...
- python之函数用法iter()
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法iter() #iter() #说明:对一个对象调用 iter() 就可以得到它的迭代 ...
- HTTP报文01
#xiaodeng #HTTP报文01 #HTTP权威指南 45 报文向下游流动- 不管是请求报文还是响应报文,所有报文都会向下游流动. 所有报文的发送者都在接收者的上游. 报文的组成部分 对报文进行 ...