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<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] + ",";
|
}
|
//乱码解决,这段代码在出现乱码时使用。没有乱码不要用,否则验签失败
|
// 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> goodsDetail = new ArrayList<GoodsDetail>();
|
// 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<String> queryOptions = new ArrayList<String>();
|
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);
|
}
|
}
|
|
|
}
|