This commit is contained in:
sxu 2025-04-06 12:02:06 +08:00
parent eee195daa7
commit 9c829617a3
4 changed files with 290 additions and 0 deletions

View File

@ -0,0 +1,29 @@
package com.bonus.canteen.core.pay.config;
import lombok.Data;
@Data
public class AlipayConfig {
// 应用ID,您的APPID收款账号既是您的APPID对应支付宝账号
public static String APPID = "2016092700611035";
// 商户私钥您的PKCS8格式RSA2私钥
public static String RSA_PRIVATE_KEY = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDP1hzPIGDA7XHmPpSIwvZVBGU1wsVYKactul5v4bJSV3Le0zGhV82GIP0ByX9tNzU+//kaxFgRsdZyPvR28iDbf9IaVZ+n+cZHA2rvevmntzoi3wMSEhfi8gHmY3+FuUALmICcK8a8rNV5qjpzRAyOb0IRLh1OxtCb64caKQivIt6OTEmLvyJ9BFdYbOSxHWpaOd6UMoXzG9gUzoRkMQiv9bGPkbOjxSXvYZXIXMF9OH+aHQ0oB94Od/Y/uc1xav23hPEq7HfaEMdNc3ZeRxC2JRGZm0HEn360hQ5fduE5QHnC0havpecvPNmmJv18KmYPICvK0WEONXQzZkd7ieWZAgMBAAECggEAPCPk6jqgRLNwxgNNz9U6mpdPAiN+H2jOK3lGYnGYvCL55miOb/WMT0e0bpPz/5J+IeDIIGq4YUZom16ENvcRcvKlxWEJdf3c1iezBeE75MAsXnLR3KTHrLACxLv95qAYXEKg1JAGTgplK3OKvlfumjivkXEaofT94GBjE7rT/HlBDUQd7fofu337fkVlzaluL9n6KwPyFoOhEoXz/ESANlcAzFxEdrHJ+41ywfivpCmPYipJ5RlPcvrxYPQVVcID9yxJmYl+yT+5zq+RENQw9UErKwufO27wMmlk8h9qnJ353Q5qzlI1XuziW27e+WcuCKA5KjPQDTW0FQX46+auAQKBgQDsM2A34G4bxF4FrKQMXYK+9AeN7jnOiObVigJWDQJdDmE6ajFJyjywSMJdJHFkt093jq1Q7GbFQratvXnsKw808gBqlUDHruHfQyAjB7Euwo/uj+Rf64wFSYeNyPz5Y4ZzTW/egp0+fNlwdQueF/ZxTix3Kveopju05OdP5LsDKQKBgQDhQhFWfLdhrzsmCbo1+FwI9XLQcijrwkDJcDCwjSw77Utdc7ZB9b47Qw8gPdGHsHUNST2SO0MUolxpcslhK0LCp2JH+jmyLvutCwJHge2ajEHr9UQNwqNT0VjfvLOCsqy1XjcT4UMkVbLuZfQVkuGeQMlZAz7vMwjnLHM5OWYM8QKBgQCx7+YtUfJBEsZt6efPtOZZKgdC4dNEhxe2iHhIERbVuY5/bh5hY2witT1O47RU1k+UVrS0QNMPCboK2rGtu6aCEUlFAdlCVLmt8qiUGyhcfI/nfRjjNdRO61yl8GK7EUHpPM3ox2bj+zPnJxWwbIboRqbywzi9ITXbiZHEOyCzOQKBgERWMMBWMaP27zDI/q7k27b0D5LhLzzmv5Tc7kiBa4v6n0SImCBGlyGPZIVZe7l4dOpE7+LvC5i08OgkpKdP4n7/HLfNV7eQvVVv448iAZ1DM7SLwcuS4s3I0vd9XdAmuHKFVJw5WI8rWI8uavAokT3bVbolW/BhQTAwsfwIR8dhAoGAOnxoALzuKX647N6k8AQEdNGr6CsDfwVR050vJHDbYVAxocGifiNE64/LJyzG0lO3mj4eiVwpikwPMx1oDhPuDURXrLK0TNzBV8LsGQvf+mTDgabAo8Jf/fYY3Ea8NOnE4Zrg6mEC93C0rUHEfsO8g+B2Skvw+8p6M6SHsmNsthw=";
// 支付宝公钥,查看地址https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥
public static String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz9YczyBgwO1x5j6UiML2VQRlNcLFWCmnLbpeb+GyUldy3tMxoVfNhiD9Acl/bTc1Pv/5GsRYEbHWcj70dvIg23/SGlWfp/nGRwNq73r5p7c6It8DEhIX4vIB5mN/hblAC5iAnCvGvKzVeao6c0QMjm9CES4dTsbQm+uHGikIryLejkxJi78ifQRXWGzksR1qWjnelDKF8xvYFM6EZDEIr/Wxj5Gzo8Ul72GVyFzBfTh/mh0NKAfeDnf2P7nNcWr9t4TxKux32hDHTXN2XkcQtiURmZtBxJ9+tIUOX3bhOUB5wtIWr6XnLzzZpib9fCpmDyArytFhDjV0M2ZHe4nlmQIDAQAB";
// 服务器异步通知页面路径 需http://格式的完整路径不能加?id=123这类自定义参数必须外网可以正常访问
public static String notify_url = "http://d9tc3e.natappfree.cc/alipay/notify_url";
// 页面跳转同步通知页面路径 需http://格式的完整路径不能加?id=123这类自定义参数必须外网可以正常访问//标红的域名为内网穿透工具生成的域名没启动一次穿透工具生成的域名都不一样所有启动一次都需要进行修改
public static String return_url = "http://aa7xmz.natappfree.cc/alipay/return_url";
//请求网关地址
public static String URL = "http://aa7xmz.natappfree.cc/gateway.do";
// 签名方式
public static String SIGNTYPE = "RSA2";
// 字符编码格式
public static String CHARSET = "utf-8";
//返回格式
public static String FORMAT_JSON = "json";
// 支付宝网关
public static String gatewayUrl = "https://openapi.alipay.com/gateway.do";
// 支付宝网关
public static String log_path = "/log";
}

View File

@ -0,0 +1,226 @@
package com.bonus.canteen.core.pay.controller;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.response.AlipayTradePagePayResponse;
import com.bonus.canteen.core.pay.config.AlipayConfig;
import com.bonus.canteen.core.pay.dto.AliOrderDTO;
import com.bonus.canteen.core.pay.dto.UPOrder;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
@Slf4j
@Api(tags = "支付接口")
@RestController
@RequestMapping("/alipay")
public class payCotroller {
/**
*@description: 生成充值余额订单支付宝充值
* https://www.cnblogs.com/chenyuanbo/p/10523835.html
* https://www.cnblogs.com/chenyuanbo/p/10524268.html
*@author:cyb
*@date: 2019-03-11 10:12
*@param:
*@return: net.sf.json.JSONArray
*/
@RequestMapping("topUpBalance")
public void topUpBalance(UPOrder order, HttpServletResponse response) {
//获得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID,
AlipayConfig.RSA_PRIVATE_KEY, "json", AlipayConfig.CHARSET,
AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGNTYPE);
//设置请求参数
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(AlipayConfig.return_url);
alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
//商户订单号商户网站订单系统中唯一订单号必填
String out_trade_no = new String(order.getCode());
//付款金额必填
String total_amount = new String(order.getPaymentAmount().toString());
//订单名称必填
String subject = new String(order.getOrderName());
//商品描述可空
String body = new String(order.getProductDesc());
alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
+ "\"total_amount\":\""+ total_amount +"\","
+ "\"subject\":\""+ subject +"\","
+ "\"body\":\""+ body +"\","
+ "\"timeout_express\":\"10m\","
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
try {
AlipayTradePagePayResponse alipayResponse = alipayClient.pageExecute(alipayRequest);
log.info("alipay body = " + alipayResponse.getBody());
log.info("alipay msg = " + alipayResponse.getMsg());
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write(alipayResponse.getBody());
response.getWriter().flush();
} catch (Exception e) {
log.error("充值异常, ", e.getMessage());
response.setContentType("text/html;charset=utf-8");
try {
response.getWriter().write("1");// 直接将完整的表单html输出到页面
response.getWriter().flush();
} catch (IOException e1) {
log.error("输出异常, ", e1.getMessage());
}
}
}
@WebServlet("/order/confirm")
public class OrderServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("开始处理OrderServlet的服务");
String title = "杨先生";
String total = "6";
String message = "如有什么建议欢迎留言评论";
//生成订单号
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
String orderSn = simpleDateFormat.format(Calendar.getInstance().getTime());
//向支付宝发送请求
//获得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.APPID,
AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT_JSON, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,
AlipayConfig.SIGNTYPE);
//设置请求参数
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(AlipayConfig.return_url);
alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
//商户订单号商户网站订单系统中唯一订单号必填
String out_trade_no = orderSn;
//付款金额必填
String total_amount = total;
//订单名称必填
String subject = title;
//商品描述可空
String body = message;
alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no
+ "\"," + "\"total_amount\":\"" + total_amount
+ "\"," + "\"subject\":\"" + subject
+ "\"," + "\"body\":\"" + body + "\","
// + "\"timeout_express\":\"10m\","
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
AlipayTradePagePayResponse alipayResponse = null;
try {
alipayResponse=alipayClient.pageExecute(alipayRequest);
System.out.println(alipayResponse.getBody());
System.out.println(alipayResponse.getMsg());
} catch (AlipayApiException e) {
e.printStackTrace();
}
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write(alipayResponse.getBody());
}
}
@WebServlet("/notify_url")
public class NotifyServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("接收到支付宝的异步通知请求——");
Map<String,String[]> parameterMap = request.getParameterMap();
System.out.println(parameterMap);
//成功处理后返回success
response.getWriter().write("success");
}
}
/**
*@description:支付宝退款
*@author:cyb
*@date: 2019-03-13 10:48
*@param: response
*@param: aliOrderDTO
*@return: void
*/
@RequestMapping("aliRefund")
public void aliRefund(HttpServletResponse response, AliOrderDTO aliOrderDTO){
try {
//获得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID,
AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT_JSON, AlipayConfig.CHARSET,
AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGNTYPE);
//设置请求参数
AlipayTradeRefundRequest alipayRequest = new AlipayTradeRefundRequest();
//商户订单号商户网站订单系统中唯一订单号
String out_trade_no = aliOrderDTO.getCode();
//支付宝交易号
String trade_no =aliOrderDTO.getAliTransactionNum();
//请二选一设置
//需要退款的金额该金额不能大于订单金额必填
String refund_amount = aliOrderDTO.getPaymentAmount().toString();
//退款的原因说明
String refund_reason = aliOrderDTO.getRefundCause();
//标识一次退款请求同一笔交易多次退款需要保证唯一如需部分退款则此参数必传
String out_request_no = aliOrderDTO.getRefundNum();
alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
+ "\"trade_no\":\""+ trade_no +"\","
+ "\"refund_amount\":\""+ refund_amount +"\","
+ "\"refund_reason\":\""+ refund_reason +"\","
+ "\"out_request_no\":\""+ out_request_no +"\"}");
//请求
String result = alipayClient.execute(alipayRequest).getBody();
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(result); //直接将完整的表单html输出到页面
response.getWriter().flush();
} catch (Exception e){
e.printStackTrace();
String result="1";
response.setContentType("text/html;charset=utf-8");
try {
response.getWriter().write(result);// 直接将完整的表单html输出到页面
response.getWriter().flush();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
/**
*@description: 异步支付的回调
*@author:cyb
*@date: 2019-03-12 14:24
*@param: request
*@return: void
*/
// @RequestMapping("notify_url")
// @ResponseBody
// public JSONArray notify_url(HttpServletRequest request){
// System.out.println("异步回调");
// return msg200();
// }
/**
*@description:同步的回调方法
*@author:cyb
*@date: 2019-03-12 14:23
*@param: request
*@return: void
*/
// @RequestMapping("return_url")
// @ResponseBody
// public JSONArray return_url(HttpServletRequest request){
// System.out.println("同步回调");
// return msg200();
// }
}

View File

@ -0,0 +1,14 @@
package com.bonus.canteen.core.pay.dto;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class AliOrderDTO {
private String code;//商户订单号
private String aliTransactionNum;//支付宝交易号
private BigDecimal paymentAmount;//退款金额
private String refundCause;//退款原因
private String refundNum;//退款请求号
}

View File

@ -0,0 +1,21 @@
package com.bonus.canteen.core.pay.dto;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class UPOrder {
//get/set自己操作
private String code;//商户订单号
private String orderName;//订单名称
private BigDecimal paymentAmount;//付款金额
private String productDesc;//商品描述
private String createBy;//创建人Code
private Long createTime;//创建时间时间戳
private Integer createByType;//创建人类型 1-专家 2-企业用户
private Boolean status;//是否付款 true - 已付 false-未付
private Long payTime;//订单支付时间-支付后才存在 时间戳
public String getCode() {
return code;
}
}