java ali支付服务端对接
引入SDK:
<!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-core -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-green</artifactId>
<version>3.2.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.0.0</version>
</dependency>
预支付订单:
public Map<String,Object> alipay(NyOrder order) {
//实例化客户端
AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);//此处的SIGN_TYPE是"RSA2"算法
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody("xxxxx"); //商品描述
model.setSubject("xxxxx"); // 商品标题
// 雪花算法生成订单号
String tradeNo = String.valueOf(SnowFlake.getSnowFlake().nextId());
model.setOutTradeNo(tradeNo); //订单号
model.setTimeoutExpress("30m");// 该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。 该参数数值不接受小数点, 如 1.5h,可转换为 90m。注:若为空,则默认为15d。
model.setTotalAmount(order.getAmount().toString());//订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]
/*model.setProductCode("xxxxxx");*///销售产品码,商家和支付宝签约的产品码,为固定值QUICK_MSECURITY_PAY
model.setSellerId(SELLER_ID);
request.setBizModel(model);
request.setNotifyUrl(NOTIFY_URL);//支付宝异步调用后台的url
// 创建订单
NyOrder nyOrder = new NyOrder();
// 雪花算法生成订单号
//生成订单部分
LOGGER.info("开始生成订单...");
nyOrderService.addUserOrder(nyOrder);
LOGGER.info("生成订单完成!");
try {
//这里和普通的接口调用不同,使用的是sdkExecute
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
// System.out.println(response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。
Map<String,Object> map=new HashMap<>();
map.put("alisign",response.getBody());//前端是拿到此数据唤起支付
map.put("tradeNo",tradeNo); //此处将订单返回给前端,前端拿到此订单号再进行查一遍
return map;
} catch (AlipayApiException e) {
e.printStackTrace();
PayCommonUtil.saveLog("/opt/ny/logs/aliay.txt", e.getErrMsg());
return null;
}
}
回调
@PostMapping(value = "/alipayNotify")
@ResponseBody
public String AlipayCallBack(HttpServletRequest request) throws Exception {
LOGGER.info("开始回调...");
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);
}
String notify_id = request.getParameter("notify_id");
String notify_type = request.getParameter("notify_type");
// 商户订单号
String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");
String trade_status = request.getParameter("trade_status");
// 支付宝交易号
String out_trade_no = request.getParameter("out_trade_no");
if (notify_id != "" && notify_id != null) {
if (notify_type.equals("trade_status_sync")) {
int exeCount = 0;
// 验签
boolean flag = AlipaySignature.rsaCheckV1(params, AliPayServiceImpl.ALIPAY_PUBLIC_KEY, "UTF-8", "RSA2");
if (true == flag && trade_status.equals("TRADE_SUCCESS")) {
LOGGER.info("TRADE_SUCCESS进入业务执行代码");
exeCount = aliPayService.notifyExe(trade_no, out_trade_no);
LOGGER.info("TRADE_SUCCESS执行结果:" + exeCount);
if (exeCount > 0) {
return "success";
} else {
return "fail";
}
} else {
return "sign fail";
} } } else {
return "fail";
}
return "fail";
}
主要的部分:
阿里验签参数配置:

配置按照支付宝管理后台申请的 配置就可
但是有点区别也是 比较坑的一点是:其中绿色框是 验签 工具生成的私钥 紫色框 是 支付宝管理平台的 支付宝公钥(不是应用公钥哦!!!!!切记) 如下图

应该公钥是 验签 工具生成的对应的 商户应用公钥 (开放平台秘钥 查看支付宝公钥 貌似是不能修改的)

支付宝管理后台 的开放平台秘钥--》RSA(SHA256)-->查看应用公钥就是上图验签工具的 商户应用公钥
PS:(支付宝配置 私钥 公钥 使用验签工具生成 同时 公钥要在支付宝管理后台设置 其余的不用操作引入支付宝SDK 在配置AliConfig的时候 其中里面的私钥是 验签工具生成的私钥 公钥是支付宝公钥(切忌不是应用公钥))
坑: 就是验签部分
具体:
1.下载验签工具
2.生成秘钥(如上图商户应用私钥,商户应用公钥)
3.商户应用私钥复制黏贴在AlipayConfig的app_private_key字段,商户应用公钥复制黏贴在 支付宝管理平台--》开放平台秘钥--》RSA(SHA256)查看应用公钥中
4.复制黏贴 支付宝管理平台--》开放平台秘钥==》查看支付宝公钥 放在AlipayConfig的alipay_public_key 字段
5.预支付的时候 需要加签
AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE); 其中SIGN_TYPE为RSA2 其余的参数 按照申请的管理平台自行配置
6.回调的时候验签
AlipaySignature.rsaCheckV1(params, AliPayServiceImpl.ALIPAY_PUBLIC_KEY, "UTF-8", "RSA2");
7.回调的内容返回为success 否则阿里会间歇性回调 (或者用字节流打印success)
java ali支付服务端对接的更多相关文章
- java客户端与服务端交互通用处理 框架解析
一.综述 java 客户端与服务端交互过程中,采用NIO通讯是异步的,客户端基本采用同一处理范式,来进行同异步的调用处理. 处理模型有以下几个要素: 1. NIO发送消息后返回的Future 2. 每 ...
- Java实现:服务端登录系统并跳转到系统内的指定页面(不调用浏览器)
Java实现:服务端登录系统并跳转到系统内的指定页面(不调用浏览器) 1,思路:根据爬虫思想: 2,代码: /** * ClassName:AuthFr * Function: TODO * Reas ...
- 支付宝app支付服务端流程
支付宝APP支付服务端详解 前面接了微信支付,相比微信支付,支付宝APP支付提供了支付封装类,下面将实现支付宝APP支付.订单查询.支付结果异步通知.APP支付申请参数说明,以及服务端返回APP端发起 ...
- Java Se : Java NIO(服务端)与BIO(客户端)通信
Java目前有三种IO相关的API了,下面简单的说一下: BIO,阻塞IO,最常用的Java IO API,提供一般的流的读写功能.相信学习Java的人,都用过. NIO,非阻塞IO,在JDK1.4中 ...
- Ali OSS服务端签名直传并设置上传回调
服务端签名直传并设置上传回调 背景 请参考 Web端直传实践 里的背景介绍. 当采用服务端签名后直传方案后,问题来了,用户上传数据后,很多场景下,应用服务器都要知道用户上传了哪些文件,文件名字,甚至如 ...
- 如何实现从Java入门到服务端项目开发的进阶?
对于打算入门或者刚刚入门学习Java的人来说,刚开始接触这门学科,往往会觉得不知所措,也会觉得很迷茫.结合前人经验,就从入门到进阶对于Java的学习而言,应该对于学习时间.目标和内容规划有一个清晰的定 ...
- 基于java NIO 的服务端与客户端代码
在对java NIO selector 与 Buffer Channel 有一定的了解之后,我们进行编写java nio 实现的 客户端与服务端例子: 服务端: public class NIOC ...
- WebSocket集成XMPP网页即时通讯1:Java Web Project服务端/客户端Jetty9开发初探
Web 应用的信息交互过程通常是客户端通过浏览器发出一个请求,服务器端接收和审核完请求后进行处理并返回结果给客户端,然后客户端浏览器将信息呈现出来,这种机制对于信息变化不是特别频繁的应用尚能相安无事, ...
- java实现从服务端下载文件
这边用一个简单的servlet实现java从服务端下载文件的操作 写一个servlet: <servlet> <servlet-name>DownloadServlet< ...
随机推荐
- android中listview滑动卡顿的原因
导致Android界面滑动卡顿主要有两个原因: 1.UI线程(main)有耗时操作 2.视图渲染时间过长,导致卡顿 http://www.tuicool.com/articles/fm2IFfU
- Hadoop的伪分布式的安装
查看下载地址:http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.4.0-src.tar.gz 解压hadoop-2.6.0-cdh5.4 ...
- MongoDB的集群模式--Replica Set
一.Replica Set 集群分为两种架构: 奇数个节点构成Replica Set,所有节点拥有数据集.最小架构: 1个Primary节点,2个Secondary节点 偶数个节点 + 一个仲裁节点 ...
- Pandas 之 描述性统计案例
认识 jupyter地址: https://nbviewer.jupyter.org/github/chenjieyouge/jupyter_share/blob/master/share/panda ...
- Laravel实现用户的注册、登录
一.安装 Laravel(使用 Laravel5.5) 通过 Composer 创建项目 composer create-project --prefer-dist laravel/laravel s ...
- 记录SQLAlchemy的基本使用
代码 # -*- coding: utf-8 -*- from sqlalchemy import Column, String, create_engine from sqlalchemy.orm ...
- Ubuntu中wine程序安装windows软件中文乱码如何解决
1.安装wine sudo apt install wine 2.安装中文程序方法 下载exe文件 在命令行执行 wine 文件名.exe 3.中文乱码原因分析 查看/home/用户名/.wine/d ...
- K-th Path CodeForces - 1196F
题目链接:https://vjudge.net/problem/CodeForces-1196F 题意:从图中找出第K短的最短路,最短路:从一个点到另一个的最短距离. 思路:题目说了,每两个点之间的边 ...
- Codeforces 1187E - Tree Painting(树上所有节点的儿子数量和最大)
乍一看题意比较麻烦,好像要删点求联通性,但其实是相当于求以某一个节点为根时,他的所有后代(儿子,儿子的儿子等等)的儿子的总和最大. 两边dfs即可,第一遍dfs随便找一个点为根,求出每个节点的儿子数s ...
- 《MVC架构下网站的设计与实现》论文笔记(十八)
标题:MVC架构下网站的设计与实现 一.基本信息 时间:2017 来源:广东海洋大学数学与计算机学院 关键词:网站设计:MVC 框架:数据库:网络安全 二.研究内容 1.系统的整体架构设计(以广东海洋 ...