官方文档: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. 【BZOJ 4668 冷战】

    题目: [BZOJ 4668 冷战] 思路: 因为考虑强制在线,我们是肯定要维护形状的 我们发现如果\((u,v)\)这条边如果\(u,v\)已经连上,那么对于最终答案这条边是没有贡献的 所以我们发现 ...

  2. 洛谷 P4497 - [WC2011]拼点游戏(数据结构综合)

    题面传送门 神仙 DS. 首先关于第一问可以轻松想到一个 DP,\(dp_{i,j}\) 表示考虑到第 \(i\) 位,这一位奇偶性为 \(j\) 的最大权值,时间复杂度 \(n^2q\),可以拿到 ...

  3. CMSIS-RTOS 信号量Semaphores

    信号量Semaphores 和信号类似,信号量也是一种同步多个线程的方式,简单来讲,信号量就是装有一些令牌的容器.当一个线程在执行过程中,就可能遇到一个系统调用来获取信号量令牌,如果这个信号量包含多个 ...

  4. 作为Java技术面试官,我如何深挖候选人的技能

    作为Java资深技术面试官,首先我感觉有必要讲解"面试官深挖问题"的动机,在了解动机的前提下,大家才能更好地准备面试.面试官为什么要在一个点上深挖?两大目的.   1 首先是通过深 ...

  5. C++中的排序

    下面网站解释比较好 http://www.cnblogs.com/heyonggang/archive/2013/11/03/3404371.html 1. qsort(C中的函数加上stdlib.h ...

  6. IPFS是什么?IPFS原理、IPFS存储

    以下内容调研截止到2021/11/5日 IPFS简介 IPFS是一种内容可寻址.点对点.分布式文件系统.IPFS采用内容-地址寻址技术,即通过文件内容进行检索而不是通过文件的网络地址.简单来说,就是对 ...

  7. day06 python代码操作MySQL

    day06 python代码操作MySQL 今日内容 python代码操作MySQL 基于python与MySQL实现用户注册登录 python操作MySQL python 胶水语言.调包侠(贬义词& ...

  8. 零基础学习java------day2------关键字、标志符、常量、进制键的转换、java中的数据类型、强制类型转换的格式

    今日内容要求: 1. 了解关键字的概念及特点,了解保留字 2. 熟练掌握标识符的含义,特点,可使用字符及注意事项 3. 了解常量的概念,进制,进制之间相互转换,了解有符号标识法的运算方式 4. 掌握变 ...

  9. css相关,position定位详解

    CSS 有两个最重要的基本属性,前端开发必须掌握:display 和 position. display属性指定网页的布局.两个重要的布局,弹性布局flex和网格布局grid. 本文介绍非常有用的po ...

  10. E面波导和H面波导的问题

    我感觉与窄壁平行是E面,反之为H面.通常E面(窄面)是指与电场方向平行的方向图切面(窄面):H面(宽面)是指与磁场方向平行的方向图切面(宽面).E面的意思是... ElevationH面的意思是... ...