package com.muyu.system.controller; import com.alibaba.fastjson.JSONObject; 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.response.AlipayTradePagePayResponse; import com.alipay.easysdk.factory.Factory; import com.muyu.common.core.domain.Result; import com.muyu.common.system.domain.PaymentParam; import com.muyu.config.util.SfUtil; import com.muyu.config.util.StandingRes; import com.muyu.system.service.SysUserService; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.HashMap; import java.util.Map; /** * @Author: wangxinyuan * @Date: 2024/8/25 下午3:21 */ @RestController @Tag(name = "PaymentController", description = "支付接口") @RequestMapping("/aliyun/pay") public class PaymentController { //appid private final String APP_ID = "9021000139609995"; //应用私钥 private final String APP_PRIVATE_KEY = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDMbBAf8yRmFvLx2SEfhdjdidpqWzfeRkL8d3K0Sz9DC5xxnrrUujwQF7FfbmwR43oJy1mIrMffc2Fp3vpSjWgdOMfAJy5N0GlrDb4o/3mN3pH3xElfdz7VEw9jcIhLDEsV2LP3nnrbkEKoj93gnZsuMkTnO4yfsEyCZVL6rkK01R9Pcu3tKKLrY5n30U7aE1WOuKvE3pTmxkpdXaX3Q46npP8wHOY1x6kUzyFgjFip/E4HEE91OzqaVnirt6GkWm9m0VAiUOENthEbnSzKagoVuTV0lXoX0hzTJ4H/4Ees2wOE4pZzeK2xqrolD3/EIR31I1ztyz4hXJG3sBC3v7gFAgMBAAECggEAQP9jKSWAP02wtaFaXNGMIPTCE+spGm2wwuGgAR+j38eDWMUllpoYmu1NopBToGR52z9jGogFjVD8elNBuJnprtDtAnXyzR8lRbq66gJBPhC0zNkGk2ow+kLzM6UGUQZ5oVqj7mnfmoyGBV6pJ9A1FT06l2Nh1SyTRyq8daSO5TwE5wUl040YT5pFIy4TCL1NhJVqDU61kNZCzVrUN4Lorkvv4gAeYZGY0cX0QMWXxwq5N7dOAn1tbwuo3WHnJbva3KBOVCtkldZ7Z0iwFQsniZXuXk7NmpNKFuZiQArlR8pTqDJB1dUwua9Nw1c9T+0CvpGRUH2u3wFIWK/RYyh0gQKBgQDxZaam5Z4irNdlxv9ypwQiiSsar745cDsmKv7oE4mUkxQzcR1segK+og0aX2s6Oa25Cj64jSXqbY/Y2DsoIEFFDe9z2E52QEOsZcN51edLc88YsopSSSIgobA8/+hB+AHjlILNhrtghwbKBOxNR5vBM/QGmfWaGPqtA8HsD3DQcQKBgQDYyc56eLOPWLuREu1aFrNs4viJ8r4v+pZmLFrXHojPF3teQr6z+CnrnF7vKYAmnOVxD2M44LgRr7LYnswzDWLLvrAkhUCYiaTL+6dvgy0okkUGE5QjGPP889yiHef8b1fRKNaVM+hXkt452oqhh95ZMnN4/ugZ3Uiq3UF8Q4vq1QKBgEV/cn9SVDi/cjQHGrwzgWk//HzuY+G9ggn3DvRZy55Oyd4VjtcQOYIQvZz+I6zbtjwzyuLvIB9h86wGdOGUh7YN0QaVG+HHlrQniCOnhbOfX9xIarJOA9lJM6gcNQ3pDQIsW4w4YfHkbfvzduS43Qq+nl7YLHF1B5aQImCIAX7BAoGBAK135iG33a6RiR0P8R8KVS6G++uecrL/qEM/sLy78SsNFimZ7PEjXZ/rs0dahPHgz/PFJVdI8eEtH0YY4zritjBkeJvwiHzGfzi+OP+RDpyNVnADUKE5AVtiYyTSG2SyT6nNLM+dBoi0u9+9UPrqNnBXX3DtQBoaKGCYxSLDBf21AoGANG5wAjV+ME7uAYEvW9GlrvGmNmzyUuiZrYuYHCf76CTa+q0+P7o0WgKcWEXUSah08qF4EItUQuuw+PtFTFs/sorqa9QrZs/ozTt8Q4ms/tahFPkZOTJ8s1Az2jY3C9ERwS8ab3Q+kbLiXDTnWo4s7YqwpwMZd/abhs3SwCjzLDI="; private final String CHARSET = "UTF-8"; // 支付宝公钥 private final String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnOq1vdnkd83CnZUWZVka7EWT0YgiGX8io6ul4GThlue66YNKoS/rKT1rHzyZqBwNG1qgeU7eH+UazuFK2GsxrDI1rSqzljkgQnkmwtjEsJYpXzFF5PTuW8bsDNHoXr5LsEyMaljyiNtBO3uc+Zbb0D6GcbnQUFGorMi9tKR28XjNJkvamohMhh+V5cb1FJtybliNoGAjA+Nh+aQVAXqFEPj3FX0qhPi4gRXniYL0o9ePaRtNg5pJ/uJ3G6llRi3+uZleD7XBSQCSf8ZZJfH8Bvr3mTQ/ObpyDub8VYnIkOgld4OAJRzqXJAyPFo0mRGhaeuSqviyRYGQK8/U8CrLkQIDAQAB"; //这是沙箱接口路径 private final String GATEWAY_URL ="https://openapi-sandbox.dl.alipaydev.com/gateway.do"; private final String FORMAT = "JSON"; //签名方式 private final String SIGN_TYPE = "RSA2"; //支付宝异步通知路径,付款完毕后会异步调用本项目的方法,必须为公网地址 private final String NOTIFY_URL = "http://IP/aliyun/pay/yibu"; //支付宝同步通知路径,也就是当付款完毕后跳转本项目的页面,可以不是公网地址 private final String RETURN_URL = "http://IP/entertainment/payment"; @RequestMapping(value = "/payZFB", method = RequestMethod.POST) @ResponseBody public Result payZFB(@RequestBody PaymentParam paymentParam) throws AlipayApiException { AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY_URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE); AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); //异步接收地址,仅支持http/https,公网可访问 request.setNotifyUrl(""); //同步跳转地址,仅支持http/https request.setReturnUrl(paymentParam.getReturnUrl()); JSONObject json = new JSONObject(); json.put("outTradeNo", paymentParam.getOutTradeNo()); String params = json.toString(); /******必传参数******/ JSONObject bizContent = new JSONObject(); //商户订单号,商家自定义,保持唯一性 bizContent.put("out_trade_no", paymentParam.getOutTradeNo()); //支付金额,最小值0.01元 bizContent.put("total_amount", paymentParam.getTotalAmount()); //订单标题,不可使用特殊符号 bizContent.put("subject", paymentParam.getSubject()); //电脑网站支付场景固定传值FAST_INSTANT_TRADE_PAY bizContent.put("product_code", paymentParam.getProductCode()); //支付宝请求的传值 可以在req中获取 bizContent.put("body", params); /******可选参数******/ request.setBizContent(bizContent.toString()); AlipayTradePagePayResponse response = alipayClient.pageExecute(request); return Result.success(response.getBody()); } @PostMapping("/notify") // 注意这里必须是POST接口 public String payNotify(HttpServletRequest request) throws Exception { if (request.getParameter("trade_status").equals("TRADE_SUCCESS")) { System.out.println("=========支付宝异步回调========"); Map params = new HashMap<>(); Map requestParams = request.getParameterMap(); for (String name : requestParams.keySet()) { params.put(name, request.getParameter(name)); // System.out.println(name + " = " + request.getParameter(name)); } String tradeNo = params.get("out_trade_no"); String gmtPayment = params.get("gmt_payment"); String alipayTradeNo = params.get("trade_no"); // 支付宝验签 if (Factory.Payment.Common().verifyNotify(params)) { // 验签通过 System.out.println("交易名称: " + params.get("subject")); System.out.println("交易状态: " + params.get("trade_status")); System.out.println("支付宝交易凭证号: " + params.get("trade_no")); System.out.println("商户订单号: " + params.get("out_trade_no")); System.out.println("交易金额: " + params.get("total_amount")); System.out.println("买家在支付宝唯一id: " + params.get("buyer_id")); System.out.println("买家付款时间: " + params.get("gmt_payment")); System.out.println("买家付款金额: " + params.get("buyer_pay_amount")); } } return "success"; } @Autowired private SysUserService userService; //TODO 充值记录添加 @PostMapping("/records") public Result records(@RequestBody PaymentParam paymentParam) throws AlipayApiException { return Result.success(userService.addRecords(paymentParam)); } //TODO 身份认证 @PostMapping("/doPost") public Result doPost(@RequestBody @Valid StandingRes standingRes) { return SfUtil.query(standingRes); } //TODO 发送验证码 @PostMapping("/sendCode/{phonenumber}") public Result sendCode(@PathVariable("phonenumber")String phonenumber){ return Result.success(null,userService.sendCode(phonenumber)); } //TODO 验证验证码 @PostMapping("/checkCode/{phonenumber}/{code}") public Result checkCode(@PathVariable("phonenumber")String phonenumber,@PathVariable("code")String code){ return Result.success(null,userService.checkCode(phonenumber,code)); } }