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. 我能做什么 支付宝 ...
随机推荐
- CF1555F Good Graph
有以下引理: 不存在两个合法环,他们存在公共边. 证明:公共边边权为 \(z\),第一个环除去公共边为 \(x\),第二个环除去公共边为 \(y\). 则有 \(x \oplus z = 1\) \( ...
- Codeforces 671C - Ultimate Weirdness of an Array(线段树维护+找性质)
Codeforces 题目传送门 & 洛谷题目传送门 *2800 的 DS,不过还是被我自己想出来了 u1s1 这个 D1C 比某些 D1D 不知道难到什么地方去了 首先碰到这类问题我们肯定考 ...
- 实现一个简单的类似不蒜子的PV统计器
内部的放到gitlab pages的博客,需要统计PV,不蒜子不能准确统计,原因在于gitlab的host设置了strict-origin-when-cross-origin, 导致不蒜子不能正确获取 ...
- Java培训班学员如何找工作?如何过试用期?
在本文里,首先将结合我了解的多家培训班辅导学员就业的情况,来讲讲培训班学员如何高效找工作.由于本人在周末会兼职在培训班讲课,也帮助过不少学员成功入职,所以下文还会给出"培训班学员如何快速适应 ...
- (转载)Java里新建数组及ArrayList java不允许泛型数组
java中新建数组: String[] s;//定义的时候不需要设置大小 s = new String[5];//为数组分配空间时就要设置大小 对于ArrayList, ArrayList< ...
- Hi3516开发笔记(六):通过HiTools使用USB/串口将uboot、kernel、roofts和userdata按照分区表烧写镜像
若该文为原创文章,转载请注明原文出处本文章博客地址:https://hpzwl.blog.csdn.net/article/details/121706033红胖子(红模仿)的博文大全:开发技术集合( ...
- 7个连环问揭开java多线程背后的弯弯绕
摘要:很多java入门新人一想到java多线程, 就会觉得很晕很绕,什么可见不可见的,也不了解为什么sync怎么就锁住了代码. 本文分享自华为云社区<java多线程背后的弯弯绕绕到底是什么? 7 ...
- Jenkins:参数化构建:分支|模块|回滚|打印日志
@ 目录 多分支 安装Git Parameter Plug-In 配置参数 选择构建分支 分模块 前提 分模块build 参数配置 分模块shell脚本 mvn 的基本用法 分模块运行 Jenkins ...
- 零基础学习java------34---------登录案例,域,jsp(不太懂),查询商品列表案例(jstl标签)
一. 简单登录案例 流程图: 项目结构图 前端代码: <!DOCTYPE html> <html> <head> <meta charset="UT ...
- Gradle—Android配置详解
参考[1]彻底弄明白Gradle相关配置 [2]Android Studio gradle配置详解