package com.mzl.flower.web.v2.pay; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; import com.alipay.api.domain.AlipayTradeAppPayModel; import com.alipay.api.internal.util.AlipaySignature; import com.alipay.api.request.AlipayTradeAppPayRequest; import com.alipay.api.response.AlipayTradeAppPayResponse; import com.alipay.api.response.AlipayTradeQueryResponse; import com.mzl.flower.base.BaseController; import com.mzl.flower.base.R; import com.mzl.flower.config.pay.AlipayProperties; import com.mzl.flower.dto.request.pay.PayQueryDTO; import com.mzl.flower.dto.request.productOrders.ProductOrdersCreateDTO; import com.mzl.flower.entity.productOrders.ProductOrdersDO; import com.mzl.flower.enums.PayTypeEnum; import com.mzl.flower.service.pay.AlipayService; import com.mzl.flower.service.productOrders.ProductOrdersService; import com.mzl.flower.utils.alipay.OrderInfoUtil2_0; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import java.util.*; /** * @author taojie 20250321 */ @RestController @RequestMapping(value = "/v2/alipay") @Api(tags = {"支付宝支付相关"}) public class AlipayController extends BaseController { private Logger logger = LoggerFactory.getLogger(AlipayController.class); @Autowired private AlipayProperties alipayProperties; @Autowired AlipayClient alipayClient; @Autowired private ProductOrdersService productOrdersService; @Autowired private AlipayService alipayService; /** * 获取订单支付请求参数 * @param * @return * @throws Exception */ @PostMapping(value = "/pay-order-info") @ApiOperation(value = "获取订单支付请求参数") public ResponseEntity getPayOrderInfo(@Validated @RequestBody ProductOrdersCreateDTO productOrdersCreateDTO) throws Exception { // 创建订单 // 当前的支付类型是微信支付 ProductOrdersDO productOrdersDTO=new ProductOrdersDO(); BeanUtils.copyProperties(productOrdersCreateDTO,productOrdersDTO); productOrdersDTO.setPaymentMethod(PayTypeEnum.ALIPAY.getName()); ProductOrdersDO productOrdersDO=productOrdersService.createProductOrders(productOrdersDTO); //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest(); //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。 AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); model.setBody(productOrdersDO.getOrderType()+"_"+productOrdersDO.getCurrentPrice()); model.setSubject(productOrdersDO.getOrderName()); model.setOutTradeNo(productOrdersDO.getOrderNo()); model.setTotalAmount(productOrdersDO.getCurrentPrice()+""); model.setTimeoutExpress("30m"); model.setProductCode("QUICK_MSECURITY_PAY"); request.setBizModel(model); request.setNotifyUrl(alipayProperties.getNotifyUrl()); try { //这里和普通的接口调用不同,使用的是sdkExecute AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); System.out.println(response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。 String result=response.getBody(); return returnData(R.SUCCESS.getCode(), result); } catch (AlipayApiException e) { e.printStackTrace(); logger.error(e.getMessage(), e); return returnData(R.RUNTIME_EXCEPTION.getCode(), "",e.getMessage()); } } /** * 支付宝回调url * @param request * @return * @throws Exception */ @PostMapping(value = "/order/status") @ApiOperation(value = "订单状态") public AlipayTradeQueryResponse queryOrderByOutOrderNo(@Validated @RequestBody PayQueryDTO payQueryDTO, HttpServletRequest request) throws Exception{ AlipayTradeQueryResponse response=alipayService.queryOrderByOutOrderNo(payQueryDTO.getOuterOrderNo()); return response; } /** * 支付宝回调url * @param request * @return * @throws Exception */ @PostMapping(value = "/notify") @ApiOperation(value = "支付宝回调url") public String notify(HttpServletRequest request) throws Exception{ //获取支付宝POST过来反馈信息 Map params = new HashMap(); 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] + ","; } //乱码解决,这段代码在出现乱码时使用。没有乱码不要用,否则验签失败 // valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8"); params.put(name,valueStr); } boolean rsa2 = AlipaySignature.rsaCheckV1(params, alipayProperties.getPublicKey(), alipayProperties.getCharset(), alipayProperties.getSignType()); // 查看验签结果 System.out.println(rsa2); if(rsa2){ // 更新支付状态 productOrdersService.updateProductOrderStatus(params); return "success"; } return "fail"; } private void createAlipayOrder(String orderId,String totalAmount,String subject) throws AlipayApiException { // 初始化SDK // 构造请求参数以调用接口 AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest(); AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); // 设置商户订单号 model.setOutTradeNo(orderId); // 设置订单总金额 model.setTotalAmount(totalAmount); // 设置订单标题 model.setSubject(subject); // 设置产品码 model.setProductCode("QUICK_MSECURITY_PAY"); // 设置订单包含的商品列表信息 // List goodsDetail = new ArrayList(); // GoodsDetail goodsDetail0 = new GoodsDetail(); // goodsDetail0.setGoodsName("ipad"); // goodsDetail0.setAlipayGoodsId("20010001"); // goodsDetail0.setQuantity(1L); // goodsDetail0.setPrice("2000"); // goodsDetail0.setGoodsId("apple-01"); // goodsDetail0.setGoodsCategory("34543238"); // goodsDetail0.setCategoriesTree("124868003|126232002|126252004"); // goodsDetail0.setShowUrl("http://www.alipay.com/xxx.jpg"); // goodsDetail.add(goodsDetail0); // model.setGoodsDetail(goodsDetail); // 设置订单绝对超时时间 // model.setTimeExpire("2016-12-31 10:05:00"); // // 设置业务扩展参数 // ExtendParams extendParams = new ExtendParams(); // extendParams.setSysServiceProviderId("2088511833207846"); // extendParams.setHbFqSellerPercent("100"); // extendParams.setHbFqNum("3"); // extendParams.setIndustryRefluxInfo("{\"scene_code\":\"metro_tradeorder\",\"channel\":\"xxxx\",\"scene_data\":{\"asset_name\":\"ALIPAY\"}}"); // extendParams.setRoyaltyFreeze("true"); // extendParams.setCardType("S0JP0000"); // model.setExtendParams(extendParams); // 设置公用回传参数 // model.setPassbackParams("merchantBizType%3d3C%26merchantBizNo%3d2016010101111"); // 设置商户的原始订单号 // model.setMerchantOrderNo("20161008001"); // 设置外部指定买家 // ExtUserInfo extUserInfo = new ExtUserInfo(); // extUserInfo.setCertType("IDENTITY_CARD"); // extUserInfo.setCertNo("362334768769238881"); // extUserInfo.setName("李明"); // extUserInfo.setMobile("16587658765"); // extUserInfo.setMinAge("18"); // extUserInfo.setNeedCheckInfo("F"); // extUserInfo.setIdentityHash("27bfcd1dee4f22c8fe8a2374af9b660419d1361b1c207e9b41a754a113f38fcc"); // model.setExtUserInfo(extUserInfo); // 设置通知参数选项 List queryOptions = new ArrayList(); queryOptions.add("hyb_amount"); queryOptions.add("enterprise_pay_info"); model.setQueryOptions(queryOptions); request.setBizModel(model); // 第三方代调用模式下请设置app_auth_token // request.putOtherTextParam("app_auth_token", "<-- 请填写应用授权令牌 -->"); AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); String orderStr = response.getBody(); System.out.println(orderStr); if (response.isSuccess()) { System.out.println("调用成功"); } else { System.out.println("调用失败"); // sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接 // String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response); // System.out.println(diagnosisUrl); } } }