JAVAWEB进行PC支付宝支付、查询订单支付状态
官方文档:https://opendocs.alipay.com/open/270/105899
本地开发环境支付回调调试方法可以参考:https://www.cnblogs.com/pxblog/p/11623053.html
所需内容:
1、APPID(APPID) 即创建应用后生成 获取:https://opendocs.alipay.com/open/200/105310
2、APP_PRIVATE_KEY(开发者私钥) 获取:https://opendocs.alipay.com/open/291/105971
3、ALIPAY_PUBLIC_KEY(支付宝公钥) 获取: https://opendocs.alipay.com/open/291/105971
jar包下载:https://yvioo.lanzous.com/iGR8pe3qkha
配置类
AliPayConfig.java
package com.alipay;
public class AliPayConfig {
/*******支付宝支付参数*********/
// 商户appid 教程:https://opendocs.alipay.com/open/200/105310
public static String APPID = "";
// 私钥 pkcs8格式的 由开发者自己生成 教程:https://opendocs.alipay.com/open/291/105971
public static String RSA_PRIVATE_KEY = "";
// 支付宝公钥 由支付宝生成 教程:https://opendocs.alipay.com/open/291/105971
public static String ALIPAY_PUBLIC_KEY = "";
// 服务器异步通知路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String notify_url = "/alipay_notice";
// 页面跳转同步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 商户可以自定义同步跳转地址
public static String return_url = "/alipay_return";
// 请求网关地址
public static String URL = "https://openapi.alipay.com/gateway.do";
// 编码
public static String CHARSET = "UTF-8";
// 返回格式
public static String FORMAT = "json";
// 日志记录目录
public static String log_path = "/log";
// RSA2
public static String SIGNTYPE = "RSA2";
}
支付工具类
AliPay.java
package com.alipay; import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest; import javax.servlet.http.HttpServletResponse; public class AliPay { /**
* PC网站快速支付
*
* @param response
* @param orderNo 订单号
* @param totalAmount 支付金额
*/
public static void enterAlipayInPC(HttpServletResponse response,
String orderNo, Double totalAmount,String returnUrl,String notifyUrl) {
//获得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(AliPayConfig.URL, AliPayConfig.APPID, AliPayConfig.RSA_PRIVATE_KEY,AliPayConfig.FORMAT, AliPayConfig.CHARSET, AliPayConfig.ALIPAY_PUBLIC_KEY, AliPayConfig.SIGNTYPE);
//创建API对应的request
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
//在公共参数中设置回跳地址
//同步跳转链接
alipayRequest.setReturnUrl(returnUrl); //异步跳转链接
alipayRequest.setNotifyUrl(notifyUrl); //填充业务数据
alipayRequest.setBizContent( "{" +
" \"out_trade_no\":\""+orderNo+"\"," +
" \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," +
" \"total_amount\":"+totalAmount+"," +
" \"subject\":\"订单标题\"," +
" \"extend_params\":{" +
" \"sys_service_provider_id\":\"\"" +
" }" +
" }" );//填充业务参数
String form;
try {
//调用SDK生成表单
form = alipayClient.pageExecute(alipayRequest).getBody();
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write(form);//直接将完整的表单html输出到页面
response.getWriter().flush();
} catch (Exception e) {
e.printStackTrace();
}
} }
控制器调用方法
AliPayController.java
package com.alipay; import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import org.apache.commons.lang.StringUtils;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map; @Controller
public class AliPayController { /**
* 支付宝PC支付,
* 这只是简单的demo,需要自行完善逻辑
*/
@RequestMapping(value = "/aliPCPay")
public void aliPay(HttpServletResponse response) { //订单号
String orderNo = ""; //订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]。 可以参考:https://www.cnblogs.com/pxblog/p/13186037.html
Double totalAmount = 1.00; AliPay.enterAlipayInPC(response, orderNo, totalAmount,AliPayConfig.returnUrl,AliPayConfig.notifyUrl);
} /**
* 支付宝异步通知地址
*
* @return
* @throws IOException
* @throws AlipayApiException
*/
@RequestMapping(value = "/alipay_notice")
public String alipayNotice(HttpServletRequest request, HttpServletResponse response, ModelMap model) throws IOException, AlipayApiException {
PrintWriter out = response.getWriter();
//获取支付宝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);
} System.out.println(new JSONObject(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 sign = params.get("sign");
String content = AlipaySignature.getSignCheckContentV1(params);
boolean verify_result = AlipaySignature.rsaCheck(content,sign, AliPayConfig.ALIPAY_PUBLIC_KEY, AliPayConfig.CHARSET,AliPayConfig.SIGNTYPE); Order order = orderMng.findByOrderNo(out_trade_no);
//支付宝交易号
order.setTransactionId(trade_no);
String result = "success";
System.out.println("订单编号:" + order.getOrderNo());
System.out.println("验证结果:" + verify_result);
if (verify_result) {
//验证成功
//判断支付宝是否返回付款成功状态
if ("TRADE_SUCCESS".equalsIgnoreCase(trade_status)){
//判断订单状态是否是未支付状态
if (!order.getStatus().equals(PayEnums.PAY_SUCCESS.getCode())) {
order.setStatus(PayEnums.PAY_SUCCESS.getCode());
orderMng.update(order);
}
System.out.println("支付成功");
}
out.println(result); //请不要修改或删除
out.flush();
out.close();
} else {
//验证失败
order.setStatus(PayEnums.PAY_FAIL.getCode());
result = "fail";
orderMng.update(order);
System.out.println("支付失败");
out.println(result); //请不要修改或删除
out.flush();
out.close();
}
return null;
} /**
* 支付宝同步通知页面请求
*
* @return
*/
@RequestMapping(value = "/alipay_return")
public String alipayReturn(HttpServletRequest request, ModelMap model) {
//跳转到支付结果页
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] + ",";
}
//乱码解决,这段代码在出现乱码时使用
try {
valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
params.put(name, valueStr);
} boolean signVerified = false;
try {
//调用SDK验证签名 String sign = params.get("sign");
String content = AlipaySignature.getSignCheckContentV1(params);
signVerified = AlipaySignature.rsaCheck(content,sign, AliPayConfig.ALIPAY_PUBLIC_KEY, AliPayConfig.CHARSET,AliPayConfig.SIGNTYPE); } catch (Exception e) {
e.printStackTrace();
} String out_trade_no = null;
if (signVerified) {
//商户订单号
try {
out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} } else {
System.out.println("验签失败"); } Order order = new Order();if (StringUtils.isNotBlank(out_trade_no)) {
order = orderMng.findByOrderNo(out_trade_no);
if (order != null) {
return "成功页面";
}
} return "失败页面";
} @Autowired
private OrderMng orderMng; }
查询订单支付状态接口
官方文档地址:https://opendocs.alipay.com/apis/api_1/alipay.trade.query/

/**
* 交易查询
* @param out_trade_no 订单号
*/
public static AlipayTradeQueryResponse query(String out_trade_no) {
//获得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(AliPayConfig.URL, AliPayConfig.APPID, AliPayConfig.RSA_PRIVATE_KEY,AliPayConfig.FORMAT, AliPayConfig.CHARSET, AliPayConfig.ALIPAY_PUBLIC_KEY, AliPayConfig.SIGNTYPE);
AlipayTradeQueryRequest alipayQueryRequest = new AlipayTradeQueryRequest();
String biz_content = "{\"out_trade_no\":\"" + out_trade_no + "\"}";
alipayQueryRequest.setBizContent(biz_content);
AlipayTradeQueryResponse alipayQueryResponse = null;
try {
alipayQueryResponse = alipayClient.execute(alipayQueryRequest); if (null != alipayQueryResponse && alipayQueryResponse.isSuccess()) {
if (alipayQueryResponse.getCode().equals("10000")) {
if ("TRADE_SUCCESS".equalsIgnoreCase(alipayQueryResponse
.getTradeStatus())) { //表示支付成功
} else if ("TRADE_CLOSED".equalsIgnoreCase(alipayQueryResponse
.getTradeStatus())) {
// 表示未付款关闭,或已付款的订单全额退款后关闭
} else if ("TRADE_FINISHED".equalsIgnoreCase(alipayQueryResponse
.getTradeStatus())) {
// 此状态,订单不可退款或撤销
}
} else {
// 如果请求未成功,请重试 }
}
} catch (AlipayApiException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return alipayQueryResponse;
}
JAVAWEB进行PC支付宝支付、查询订单支付状态的更多相关文章
- app微信支付-java服务端接口 支付-查询-退款
个人不怎么看得懂微信的文档,看了很多前辈的写法,终于调通了,在这里做一下记录. 首先来定义各种处理类(微信支付不需要特殊jar包,很多处理需要自己封装,当然也可以自己写完打个jar包) 参数要用jdo ...
- 利用微信支付的订单查询接口可以在APP 中提高支付的可靠性
最近公司有一个应用,用户可以在微信公众号上面下单,也可以在APP 中下单. 当用户在公共号上面下单时,微信支付成功可以返回微信支付单号,但是在APP 中用户微信支付时,个别时候会出现用户已经付款成功, ...
- 【zhifu】web开发中的支付宝支付和微信支付
一.支付类型: 支付宝支付: 支付宝app内的网页支付: app外(即普通浏览器)网页支付: 微信支付: 微信app内的支付(在这里叫公众号支付) app外的支付(微信H5支付): 微信公众号的支付宝 ...
- laravel5集成支付宝alipay扫码支付流程(Laravel 支付解决方案)
首先我们来探讨如何在Laravel应用中使用支付宝进行支付,对此,GitHub上有很多相关的包,其中最流行的两个包:Omnipay For Laravel 5 & Lumen 和 Larave ...
- 支付宝支付之App支付
与微信支付对比,支付宝支付就没有那么多坑了,毕竟支付宝开放平台的文档还是描述的很详细的. 支付宝开放平台地址:https://docs.open.alipay.com/204/105297/ 支付宝支 ...
- Django实现支付宝付款和微信支付
支付宝支付和微信支付是当今互联网产品常用的功能,我使用Django Rest Framework实现了网页上支付宝支付和微信支付的一个通用服务,提供rpc接口给其他服务,包括获取支付宝支付页面url的 ...
- 微信公众号中的支付宝支付与微信支付 && 支付宝支付问题(微信bug)
一般,在微信公众号中的商城都是需要支持微信支付和支付宝支付的,当然,较大的公司对于鹅厂和阿里的站队就不说了,所以这里简单记录一下支付宝支付和微信支付的主要流程.说是简单介绍,这是因为确实不难,因为前端 ...
- 支付宝H5、APP支付服务端的区别(php)
php支付宝H5和APP支付1.准备工作需要前往 蚂蚁金服开放平台申请https://openhome.alipay.com/developmentDocument.htm 2.大致流程1.用户添加商 ...
- pay-spring-boot 开箱即用的Java支付模块,整合支付宝支付、微信支付
关于 使用本模块,可轻松实现支付宝支付.微信支付对接,从而专注于业务,无需关心第三方逻辑. 模块完全独立,无支付宝.微信SDK依赖. 基于Spring Boot. 依赖Redis. 我能做什么 支付宝 ...
随机推荐
- 洛谷 P6624 - [省选联考 2020 A 卷] 作业题(矩阵树定理+简单数论)
题面传送门 u1s1 这种题目还是相当套路的罢 首先看到 \(\gcd\) 可以套路地往数论方向想,我们记 \(f_i\) 为满足边权的 \(\gcd\) 为 \(i\) 的倍数的所有生成树的权值之和 ...
- Codeforces 295D - Greg and Caves(dp)
题意: 给出一个 \(n \times m\) 的矩阵,需对其进行黑白染色,使得以下条件成立: 存在区间 \([l,r]\)(\(1\leq l\leq r\leq n\)),使得第 \(l,l+1, ...
- 自定义 Word 模板
自定义 Word 模板 目录 必要设置 样式设置 标题样式 多级列表 封面 正文 引用目录 页码 页眉 图标 自定义模板保存 样式导入和导出 批量删除多余空白段落 必要设置 显示所有格式标记 选择&q ...
- Godunov's 定理
Godunov's theorem 转自Wiki 目录 Godunov's theorem 简介 定理 定理1. 单调保持性(Monotonicity preserving) 定理2. Godunov ...
- DNS域名解析全过程
一张图看懂DNS域名解析全过程 DNS域名解析是互联网上非常重要的一项服务,上网冲浪(还有人在用这个词吗?)伴随着大量DNS服务来支撑,而对于网站运营来说,DNS域名解析的稳定可靠,意味着更多用户 ...
- Linux文件系统属性和权限概念详解(包含inode、block、文件权限、文件软硬链接等)
Linux中的文件属性 ls -lih 包括:索引节点(inode),文件类型,权限属性,硬链接数,所归属的用户和用户组,文件大小,最近修改时间,文件名等等 索引节点:相当于身份证号,系统唯一,系统读 ...
- Selenium的安装和使用
一.Selenium的安装,Selenium是一个自动化测试工具,利用它我们可以驱动浏览器执行特定的动作,如点击.下拉等操作.对于一些JavaScript渲染的页面来说,这种抓取方式非常有效.1.pi ...
- 在Telegraf上报的监控数据中添加固定的标签列
Telegraf作为InfluxData提供的TICK工具栈(由Telegraf, InfluxDB, Chronograf, Kapacitor四个工具的首字母组成)中收集监控数据的一环,功能非常强 ...
- SimpleNVR如何把安防监控画面推流到微信公众号直播
背景需求 进入移动互联网时代以来,微信已成为许多企业除官网以外必备的宣传渠道,当3.2亿直播用户与九亿微信用户的势能增加,在微信上开启直播已成为越来越多企业的不二选择. 需求分析 微信公众号作为平台来 ...
- Hadoop入门 常见错误及解决方案
常见错误及解决方案 目录 常见错误及解决方案 ResourceManager连接失败 root用户和ranan用户两个用户启动集群不统一 不识别主机名 DataNode和NameNode进程同时只能工 ...