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; }
-----------------------有任何问题可以在评论区评论,也可以私信我,我看到的话会进行回复,欢迎大家指教------------------------
(蓝奏云官网有些地址失效了,需要把请求地址lanzous改成lanzoux才可以)