个人学习总结,为java后台接口,不足之处请指教。
基于云通付实现的支付,所以先去云通付官网注册账号。得到相应的合作身份者PID、MD5密钥、商户号。(后面会用到)
下载相应jar包。将下载文件解压,把解压文件中的工具包拷贝到自己的项目中。
新建一个PayController类
先建立一个方法,是从用户点击“确认订单”的按钮后跳转到方法

@RequestMapping("page/{orderNo}")@IsLoginpublic String list(@PathVariable String orderNo, HttpServletRequest request, Model model)throws PayException {Integer loginUserId = LoginIdentityUtil.getFromLoginId(request);// 根据订单号去获取订单信息:PayRequestVo payRequestVo = orderService.buildPayRequestVo(orderNo, loginUserId);model.addAttribute("payRequestVo", payRequestVo);model.addAttribute("gateway", PayConstant.GATEWAY_NEW);return "pay/pay";}

该方法主要是生成签名,以及将支付请求的数据返回到页面,进行支付请求
页面主要Form表单如下,自动进行提交到“云通付”的支付网关

<!DOCTYPE html >
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>支付跳转中...</title>
</head>
<body style="background:#F3F3F4">
<br />
<br />
<div style="display: none"><form id='paysubmit' name='paysubmit' action='${gateway}' accept-charset='utf-8' method='post'><input type='text' name='sign' value='${payRequestVo.sign}'/><input type='text' name='body' value='${payRequestVo.body}'/><input type='text' name='user_seller' value='${payRequestVo.userSeller}'/><input type='text' name='total_fee' value='${payRequestVo.totalFee}'/><input type='text' name='subject' value='${payRequestVo.subject}'/><input type='text' name='notify_url' value='${payRequestVo.notifyUrl}'/><input type='text' name='out_order_no' value='${payRequestVo.outOrderNo}'/><input type='text' name='partner' value='${payRequestVo.partner}'/><input type='text' name='return_url' value='${payRequestVo.returnUrl}'/><input type='submit' value='支付进行中...' /></form>
</div>
<script type="text/javascript">document.forms['paysubmit'].submit();
</script>
</body>
</html>

跳转到付款页面
付款回调方法,同步和异步

@RequestMapping("notify_url")@IsLoginpublic String notifyUrl(HttpServletRequest request, Model model,PayCallbackDto payCallbackDto) {String result = commonHanlerCallback(request, model, payCallbackDto);return result;}@RequestMapping("return_url")@IsLoginpublic String returnUrl( HttpServletRequest request, Model model,PayCallbackDto payCallbackDto) {String result = commonHanlerCallback(request, model, payCallbackDto);return result;}private String commonHanlerCallback(HttpServletRequest request, Model model,PayCallbackDto payCallbackDto) {Integer loginUserId = LoginIdentityUtil.getFromLoginId(request);Integer resultCode = Constant.SUCCESS_CODE;String resultMessage = "支付成功";try {Map<String, Object> result = orderService.handlerPayCallback(loginUserId, payCallbackDto);model.addAllAttributes(result);} catch (Exception e) {resultCode = Constant.ERROR_CODE;resultMessage = e.getMessage();}model.addAttribute("resultCode", resultCode);model.addAttribute("resultMessage", resultMessage);return "pay/success";}

Controller层接受云通付返回的数据,用PayCallbackDto类接收

public class PayCallbackDto {private BigDecimal total_fee; // 交易金额private String out_order_no; // 商户订单号private String sign; // 服务端校验码private String trade_no; // 云通付交易订单号private String trade_status; // 交易结果(TRADE_SUCCESS说明支付成功)
}

Service要走如下流程
1) 回调参数验证
2) 签名认证:将out_order_no、total_fee、trade_status、云通付PID、云通付KEY的值连接起来,进行md5加密,而后与sign进行对比
3) 支付状态验证trade_status= TRADE_SUCCESS
4) 订单验证
5) 订单金额比对
6) 更新订单状态

/*** 支付回调处理* @param loginUserId* @param payCallbackDto*/public Map<String, Object> handlerPayCallback(Integer loginUserId, PayCallbackDto payCallbackDto) {
//      1)  回调参数验证
//      2)  签名认证:将out_order_no、total_fee、trade_status、云通付KEY、云通付PID 的值连接起来,进行md5加密,而后与sign进行对比
//      3)  支付状态验证trade_status= TRADE_SUCCESS
//      4)  订单验证
//      5)  订单金额比对
//      6)  更新订单状态AssertUtil.isTrue(loginUserId == null || loginUserId < 1, "请登录");String total_fee = payCallbackDto.getTotal_fee(); //    交易金额AssertUtil.isTrue(total_fee == null, PayConstant.CALLBACK_FAILURE);String out_order_no = payCallbackDto.getOut_order_no(); // 商户订单号AssertUtil.isTrue(StringUtils.isBlank(out_order_no), PayConstant.CALLBACK_FAILURE);String sign = payCallbackDto.getSign(); // 服务端校验码AssertUtil.isTrue(StringUtils.isBlank(sign), PayConstant.CALLBACK_FAILURE);String trade_no = payCallbackDto.getTrade_no(); // 云通付交易订单号AssertUtil.isTrue(StringUtils.isBlank(trade_no), PayConstant.CALLBACK_FAILURE);String trade_status = payCallbackDto.getTrade_status(); // 交易结果(TRADE_SUCCESS说明支付成功)AssertUtil.isTrue(StringUtils.isBlank(trade_status), PayConstant.CALLBACK_FAILURE);// 签名认证Md5Util md5Util = new Md5Util();//      String key = PayConstant.KEY;
//      String pid = PayConstant.PARTNER;
//      String signMd5 = md5Util.encode(out_order_no + total_fee + trade_status + pid + key, null);String preStr = out_order_no + total_fee + trade_status + PayConstant.PARTNER + PayConstant.KEY;String signNew = md5Util.encode(preStr, null);AssertUtil.isTrue(!signNew.equals(sign), "签名验证失败,请联系客服");// 回调状态验证AssertUtil.isTrue(!trade_status.equals(PayConstant.TRADE_SUCCESS), PayConstant.CALLBACK_FAILURE);// 订单验证Order order = orderDao.findOrderByOrderNo(out_order_no, loginUserId);AssertUtil.isTrue(order == null, "订单异常,请联系客服");AssertUtil.isTrue(order.getStatus() != OrderStatus.pendingPayment.getStatus(), "订单状态异常,请联系客服");// 支付金额验证BigDecimal amount = order.getAmount();// 将金额精度精确到2位 四舍五入在转化为字符串String priceStr = MathUtil.setScale(amount).toString();AssertUtil.isTrue(!total_fee.equals(priceStr), "订单金额不准备去,请联系客服");//      更新订单状态orderDao.updateStatus(out_order_no, OrderStatus.pendingShipment.getStatus());Map<String, Object> result = new HashMap<>();result.put("orderNo", out_order_no);result.put("money", priceStr);return  result;}

注意
集成到项目是,发起支付请求时需要配置一个本地的hosts, 将云通付上绑定的域名配置到本地,因为第三方网关请求的都是访问域名, 以win7为例

a) 找到hosts的文件目录在C:\Windows\System32\drivers\etc
b) 以超级管理员的身份用记事本打开hosts

c) 配置一个host, 输入127.0.0.1 www.XXXX.com
d) 这样你访问项目的时候就可以用www.XXXX.com:8080访问了
验证签名时,要注意金额的小数点位数, 不然会提示签名失败
记得如果是拷贝到本地项目的话,要根据自己的项目情况修改PayConstant里面的回调url的路径

java第三方支付接口(云通付)相关推荐

  1. java云闪付,第三方支付-银联云闪付开发教程

    最近项目中,新增了一种第三方支付方式--云闪付,特总结了一下开发流程. 一.准备工作 云闪付支付流程图 a.客户选择云闪付支付,提交订单给商户后端,后端向银联后端请求tn(流水号): b.商户后端请求 ...

  2. 云闪付怎么对接三方php,第三方支付-银联云闪付开发教程

    最近项目中,新增了一种第三方支付方式--云闪付,特总结了一下开发流程. 一.准备工作 云闪付支付流程图 a.客户选择云闪付支付,提交订单给商户后端,后端向银联后端请求tn(流水号): b.商户后端请求 ...

  3. java民生银行支付接口_民生付商户端开发手册和接口规范V1.0.0.doc

    民生付商户端开发手册和接口规范V1.0.0 中 国 民 生 银 行 民生付商户端开发手册 及接口规范 版本V1.0.0 2015年 06月24日 文档修订记录 版本号*变化状态简要说明日期变更人批准人 ...

  4. java第三方支付接口,附详细答案

    前言 看日期,今天都是4月了,这春招也差不多进入尾声了. 近期任有不少朋友都在找工作,很多人开始抱怨,工作可真难找啊!身边不少朋友问我咋搞呀,秋招都要结束了,工作还没着落呢-额-这个-今年是有点难啊. ...

  5. 第三方移动支付类产品竞品分析:支付宝VS微信支付VS云闪付

    第三方移动支付类产品竞品分析:支付宝VS微信支付VS云闪付 文章目录 第三方移动支付类产品竞品分析:支付宝VS微信支付VS云闪付 一.分析背景与竞品选择 1.竞品分析目的 2.行业研究与市场趋势分析 ...

  6. [Java基础]-- 调用第三方支付接口

    1.调用第三方支付接口参考 http://blog.csdn.net/saindy5828/article/details/6800331点击打开链接 2.举例 一般情况下,各个支付平台都会给我们一个 ...

  7. 第三方支付接口的技术比较研究

    发表期数:2011年第11期 所在版块:实践与应用 作者:李安渝 孙秋雯 摘 要:第三方支付市场的发展前景乐观,但同时市场竞争也越来越激烈.随着第三方支付业务许可牌照的发放,第三方支付将很可能打破大型 ...

  8. 第三方支付接口示例代码

    第三方支付接口 1.       快钱支付 2.       支付宝 3.       YeePay易宝 4.       邮局支付(网汇通) 5.       安付通 6.       网银(chi ...

  9. 第三方支付接口,银行接口(附下载),third party bank interface

    English Friend See This Information:http://www.tcpj.com/Options/interface_with_3rd_party_credit_or_b ...

最新文章

  1. MongDB与Spring整合及操作
  2. scala_until
  3. Apache solr(二).
  4. 谁是卧底的Android应用 (原型源码)
  5. boost::math::catmull_rom用法的测试程序
  6. 看动画学算法之:doublyLinkedList
  7. springboot微信支付pc页面生成二维码
  8. mysql grant查看用户权限命令
  9. [数据库] ------ mysql 执行计划
  10. Win10系统如何查看电脑是否是UEFI启动模式
  11. linux 取消nologin_Linux中nologin的应用 转
  12. css3动画与@keyframes关键帧
  13. 让媳妇瞬间搞懂Spring 多数据源操作(SpringBoot + Durid)
  14. Linux(CentOS6.4、CentOS6.3)下安装、配置PostgreSQL9.2
  15. 一个优秀的 Node.js 开发者
  16. [WebAPI] - 使用 Ajax 提交 HTML Form Data 到 WebAPI 的方法
  17. 数据结构---哈希表的认识
  18. 计算机与科学a,[第一单元] 计算机与计算机科学-课文A参考译文
  19. java 时分秒 转换 秒_java实现时间格式转换(int整数类型的秒/毫秒---时分秒毫秒)...
  20. AutoCAD坐标与图像坐标

热门文章

  1. Stduino学习(二十七)3A降压MP1584en模块
  2. 第三方支付接口示例代码
  3. html同一段文字设置不同颜色字体,CSS设置一个文字两种颜色
  4. 俄罗斯互联网的冰山一角
  5. 逗留汉城 (9/12)
  6. python原生爬虫爬取熊猫TV LOL主播人气排行
  7. 20210316_23期_心跳检测_Task01
  8. Excel中如何用身份证号提取计算年龄?
  9. 38. DDR2内存初始化代码分析-1
  10. uuid获取java_JAVA代码获取UUID