官方文档: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支付宝支付、查询订单支付状态的更多相关文章

  1. app微信支付-java服务端接口 支付-查询-退款

    个人不怎么看得懂微信的文档,看了很多前辈的写法,终于调通了,在这里做一下记录. 首先来定义各种处理类(微信支付不需要特殊jar包,很多处理需要自己封装,当然也可以自己写完打个jar包) 参数要用jdo ...

  2. 利用微信支付的订单查询接口可以在APP 中提高支付的可靠性

    最近公司有一个应用,用户可以在微信公众号上面下单,也可以在APP 中下单. 当用户在公共号上面下单时,微信支付成功可以返回微信支付单号,但是在APP 中用户微信支付时,个别时候会出现用户已经付款成功, ...

  3. 【zhifu】web开发中的支付宝支付和微信支付

    一.支付类型: 支付宝支付: 支付宝app内的网页支付: app外(即普通浏览器)网页支付: 微信支付: 微信app内的支付(在这里叫公众号支付) app外的支付(微信H5支付): 微信公众号的支付宝 ...

  4. laravel5集成支付宝alipay扫码支付流程(Laravel 支付解决方案)

    首先我们来探讨如何在Laravel应用中使用支付宝进行支付,对此,GitHub上有很多相关的包,其中最流行的两个包:Omnipay For Laravel 5 & Lumen 和 Larave ...

  5. 支付宝支付之App支付

    与微信支付对比,支付宝支付就没有那么多坑了,毕竟支付宝开放平台的文档还是描述的很详细的. 支付宝开放平台地址:https://docs.open.alipay.com/204/105297/ 支付宝支 ...

  6. Django实现支付宝付款和微信支付

    支付宝支付和微信支付是当今互联网产品常用的功能,我使用Django Rest Framework实现了网页上支付宝支付和微信支付的一个通用服务,提供rpc接口给其他服务,包括获取支付宝支付页面url的 ...

  7. 微信公众号中的支付宝支付与微信支付 && 支付宝支付问题(微信bug)

    一般,在微信公众号中的商城都是需要支持微信支付和支付宝支付的,当然,较大的公司对于鹅厂和阿里的站队就不说了,所以这里简单记录一下支付宝支付和微信支付的主要流程.说是简单介绍,这是因为确实不难,因为前端 ...

  8. 支付宝H5、APP支付服务端的区别(php)

    php支付宝H5和APP支付1.准备工作需要前往 蚂蚁金服开放平台申请https://openhome.alipay.com/developmentDocument.htm 2.大致流程1.用户添加商 ...

  9. pay-spring-boot 开箱即用的Java支付模块,整合支付宝支付、微信支付

    关于 使用本模块,可轻松实现支付宝支付.微信支付对接,从而专注于业务,无需关心第三方逻辑. 模块完全独立,无支付宝.微信SDK依赖. 基于Spring Boot. 依赖Redis. 我能做什么 支付宝 ...

随机推荐

  1. Atcoder Grand Contest 032 E - Modulo Pairing(乱搞+二分)

    Atcoder 题面传送门 & 洛谷题面传送门 神仙调整+乱搞题. 首先某些人(including me)一看到最大值最小就二分答案,事实上二分答案对这题正解没有任何启发. 首先将 \(a_i ...

  2. logname

    logname命令用来显示用户名称. 语法 logname(选项) 选项 --help:在线帮助: --vesion:显示版本信息.

  3. STM32驱动直流电机的程序与电路设计(IR2110S自举电路+H桥+高级定时器和死区PWM)

    https://blog.csdn.net/geek_monkey/article/details/82079435

  4. Python基础之流程控制for循环

    目录 1. 语法 2. for+break 3. for+continue 4. for循环嵌套 1. 语法 while循环可以对任何内容循环,但循环次数不可控 for循环基于容器类型的长度,循环次数 ...

  5. RabbitMQ消息中介之Python使用

    本文介绍RabbitMQ在python下的基本使用 1. RabbitMQ安装,安装RabbitMQ需要预安装erlang语言,Windows直接下载双击安装即可 RabbitMQ下载地址:http: ...

  6. 简易kmeans-c++版本

    typedef double dtype; 主要接口: void Kmeans(const vector<vector<dtype> > &d,int k,string ...

  7. Spark3学习【基于Java】3. Spark-Sql常用API

    学习一门开源技术一般有两种入门方法,一种是去看官网文档,比如Getting Started - Spark 3.2.0 Documentation (apache.org),另一种是去看官网的例子,也 ...

  8. 学习java的第二十五天

    一.今日收获 1.java完全学习手册第三章算法的3.2排序,比较了跟c语言排序上的不同 2.观看哔哩哔哩上的教学视频 二.今日问题 1.快速排序法的运行调试多次 2.哔哩哔哩教学视频的一些术语不太理 ...

  9. 『学了就忘』Linux启动引导与修复 — 68、Linux系统运行级别

    目录 1.Linux系统运行级别介绍 2.查看运行级别 3.修改当前系统的运行级别 4.系统默认运行级别 5./etc/rc.d/rc.local文件说明 1.Linux系统运行级别介绍 Linux默 ...

  10. Flume(四)【配置文件总结】

    目录 一.Agent 二.Source taildir arvo netstat exec spooldir 三.Sink hdfs kafka(待续) hbase(待续) arvo logger 本 ...