Просмотр исходного кода

通联 支付 退款 回调方法 2023年5月17日13:50:10

纪新园 2 лет назад
Родитель
Сommit
9e4bc44f9f

+ 18 - 0
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/entity/PjOrder.java

@@ -311,4 +311,22 @@ public class PjOrder implements Serializable {
 	 */
 	@TableField(exist = false)
 	private String goodsNameJoin;
+
+	/**
+	 * 实际支付状态
+	 */
+	@ApiModelProperty(value = "实际支付状态")
+	private int actualPaymentStatus;
+
+	/**
+	 * 通联支付金额
+	 */
+	@ApiModelProperty(value = "通联支付金额")
+	private BigDecimal paymentAmountTl;
+
+	/**
+	 * 收银宝平台流水号
+	 */
+	@ApiModelProperty(value = "收银宝平台流水号")
+	private String oldTrxId;
 }

+ 41 - 0
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/feign/IPJOrderClient.java

@@ -0,0 +1,41 @@
+package org.springblade.salesPart.feign;
+
+import org.springblade.core.tool.api.R;
+import org.springblade.salesPart.entity.PjOrder;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+
+/**
+ * @author caifc
+ * @date 2021-10-21 22:28
+ */
+@FeignClient(
+	value = "blade-sales-part"
+)
+public interface IPJOrderClient {
+	String API_PREFIX = "/blade-sales-part";
+	String UPDATE_ORDER = API_PREFIX + "/updateOrder";
+	String GET_BY_ORDER = API_PREFIX + "/getByOrder";
+
+
+	/**
+	 * 修改订单
+	 *
+	 * @param order
+	 * @return
+	 */
+	@PostMapping(UPDATE_ORDER)
+	void updateOrder(@RequestBody PjOrder order);
+
+	/**
+	 * 查询订单
+	 *
+	 * @param order
+	 * @return
+	 */
+	@PostMapping(GET_BY_ORDER)
+	R<PjOrder> getByOrder(@RequestBody PjOrder order);
+
+}

+ 1 - 1
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/service/impl/TransportServiceImpl.java

@@ -432,7 +432,7 @@ public class TransportServiceImpl extends ServiceImpl<TransportMapper, Transport
 			archives.setAddressId(Long.parseLong(addressId));
 			archives.setNewDate(newDate);
 			archives.setBoxAccessStatus(type);
-			archives.setStatus("待使用");
+//			archives.setStatus("待使用");
 			archivesMapper.updateCode(archives);
 
 			//添加箱轨迹信息

+ 6 - 0
blade-service/blade-pay/pom.xml

@@ -59,6 +59,12 @@
             <version>RELEASE</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-sales-part-api</artifactId>
+            <version>2.8.2.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
 

+ 10 - 1
blade-service/blade-pay/src/main/java/org/springblade/pay/tonglianPayment/controller/TongLianPaymentController.java

@@ -96,7 +96,7 @@ public class TongLianPaymentController extends BladeController {
 	}
 
 	/**
-	 * 微信订单回调接口
+	 * 微信订单回调接口 (翼车配)
 	 */
 	@ApiIgnore
 	@RequestMapping(value = "/notify", method = RequestMethod.POST, produces = "text/html;charset=UTF-8")
@@ -393,5 +393,14 @@ public class TongLianPaymentController extends BladeController {
 		}*/
 	}
 
+	/**
+	 * 微信订单回调接口 (配件-新)
+	 */
+	@ApiIgnore
+	@RequestMapping(value = "/callbackNotify", method = RequestMethod.POST, produces = "text/html;charset=UTF-8")
+	public void callbackNotify(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response) {
+		paymentService.callbackNnotifyMethod(request,response);
+	}
+
 
 }

+ 2 - 0
blade-service/blade-pay/src/main/java/org/springblade/pay/tonglianPayment/service/IPaymentService.java

@@ -20,4 +20,6 @@ public interface IPaymentService {
 	R getWeChatPayment(Order order);
 
 	void notifyMethod(HttpServletRequest request, HttpServletResponse response);
+
+    void callbackNnotifyMethod(HttpServletRequest request, HttpServletResponse response);
 }

+ 126 - 5
blade-service/blade-pay/src/main/java/org/springblade/pay/tonglianPayment/service/impl/PaymentServiceImpl.java

@@ -10,7 +10,6 @@ import org.springblade.client.entity.GoodsDesc;
 import org.springblade.client.feign.ICorpsDescClient;
 import org.springblade.client.feign.IFeesDescClient;
 import org.springblade.client.feign.IGoodsDescClient;
-import org.springblade.client.feign.ISerialClient;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.finance.dto.ApplyDTO;
@@ -29,6 +28,8 @@ import org.springblade.purchase.sales.entity.Order;
 import org.springblade.purchase.sales.entity.OrderItems;
 import org.springblade.purchase.sales.feign.IOrderDescClient;
 import org.springblade.purchase.sales.feign.IOrderItemsClient;
+import org.springblade.salesPart.entity.PjOrder;
+import org.springblade.salesPart.feign.IPJOrderClient;
 import org.springblade.stock.entity.StockGoods;
 import org.springblade.stock.feign.IStockGoodsClient;
 import org.springblade.stock.vo.StockGoodsVO;
@@ -81,10 +82,7 @@ public class PaymentServiceImpl implements IPaymentService {
 	//财务
 	private final @NotNull IFinanceClient financeClient;
 
-	/**
-	 * 生成系统编号
-	 */
-	private final @NotNull ISerialClient serialClient;
+	private final @NotNull IPJOrderClient ipjOrderClient;
 
 	private final @NotNull IStockGoodsClient stockGoodsClient;
 
@@ -215,6 +213,12 @@ public class PaymentServiceImpl implements IPaymentService {
 		return R.data("下单失败");
 	}
 
+	/**
+	 * 微信订单回调接口 (翼车配)
+	 *
+	 * @param request
+	 * @param response
+	 */
 	@Override
 	public void notifyMethod(HttpServletRequest request, HttpServletResponse response) {
 		try {
@@ -235,6 +239,123 @@ public class PaymentServiceImpl implements IPaymentService {
 		}
 	}
 
+	/**
+	 * 微信订单回调接口 (配件-新)
+	 */
+	@Override
+	public void callbackNnotifyMethod(HttpServletRequest request, HttpServletResponse response) {
+		try {
+			//通知传输的编码为GBK
+			request.setCharacterEncoding("UTF-8");
+		} catch (UnsupportedEncodingException e) {
+			e.printStackTrace();
+		}
+		response.setCharacterEncoding("UTF-8");
+		TreeMap<String, String> params = NotifyServlet.getParams(request);
+
+		String trxstatus = AnalysisMapUtils.getString("trxstatus", params);
+		logicMethodNew(request, response);
+		if (Objects.equals(trxstatus, "0000")) {
+			returnMethod(response, AnalysisMapUtils.setXML("SUCCESS", "OK"));
+		} else {
+			returnMethod(response, AnalysisMapUtils.setXML("error", "OK"));
+		}
+	}
+
+	/**
+	 * 微信订单回调接口 (配件-新)
+	 *
+	 * @param request
+	 * @param response
+	 */
+	private void logicMethodNew(HttpServletRequest request, HttpServletResponse response) {
+		try {
+			//通知传输的编码为GBK
+			request.setCharacterEncoding("UTF-8");
+			response.setCharacterEncoding("UTF-8");
+			TreeMap<String, String> params = NotifyServlet.getParams(request);
+			System.out.println("回调函数数据======》" + params.toString());
+			String appKey;
+
+			WechatMark wechatMark = new WechatMark();
+
+			Parameters parameters = new Parameters();
+			parameters.setAppId(AnalysisMapUtils.getString("appid", params));
+			parameters.setCusId(AnalysisMapUtils.getString("cusid", params));
+			Parameters parametersDetails = tongLianPaymentClient.getParametersDetails(parameters);
+			if (ObjectUtils.isNull(parametersDetails)) {
+				wechatMark.setRemark("未找到租户,异常支付");
+			}
+
+			if ("RSA".equals(params.get("signtype"))) {
+				appKey = parametersDetails.getSybRsacusprikey();
+			} else if ("SM2".equals(params.get("signtype"))) {
+				appKey = parametersDetails.getSybSmtlpubkey();
+			} else {
+				appKey = parametersDetails.getSybMdAppkey();
+			}
+			// 接受到推送通知,首先验签
+			boolean isSign = SybUtil.validSign(params, appKey, params.get("signtype"));
+			System.out.println("验签结果:" + isSign);
+
+			wechatMark.setCreateTime(new Date());
+			wechatMark.setType("支付");
+			if (isSign) {
+				String trxstatus = AnalysisMapUtils.getString("trxstatus", params);
+				if (Objects.equals(trxstatus, "0000")) {
+					wechatMark.setSrcBillNo(AnalysisMapUtils.getString("cusorderid", params));
+					wechatMark.setSerialNumber(AnalysisMapUtils.getString("trxid", params));
+					wechatMark.setAmount(new BigDecimal(Objects.requireNonNull(AnalysisMapUtils.getString("trxamt", params))).divide(new BigDecimal(100), MathContext.DECIMAL32).setScale(2, BigDecimal.ROUND_HALF_UP));
+
+					//支付成功业务处理
+					PjOrder order = new PjOrder();
+					order.setSrcOrdNo(AnalysisMapUtils.getString("cusorderid", params));
+
+					if (ObjectUtils.isNotNull(parametersDetails)) {
+						wechatMark.setTenantId(parametersDetails.getTenantId());
+						order.setTenantId(parametersDetails.getTenantId());
+					} else {
+						wechatMark.setTenantId("000000");
+						order.setTenantId("000000");
+						wechatMark.setRemark("未找到租户,异常支付");
+					}
+
+					R<PjOrder> re = ipjOrderClient.getByOrder(order);
+					if (re.isSuccess() && ObjectUtils.isNotNull(re.getData())) {
+						PjOrder selectOrder = re.getData();
+						selectOrder.setStatus("待确认");
+						selectOrder.setActualPaymentStatus(2);
+						ipjOrderClient.updateOrder(selectOrder);
+						wechatMark.setCause("订单" + AnalysisMapUtils.getString("cusorderid", params) + "支付成功");
+						wechatMark.setStatus(1);
+					} else {
+						wechatMark.setCause(AnalysisMapUtils.getString("cusorderid", params) + "单号支付成功,系统未查到单据信息,账单结算失败!");
+						wechatMark.setStatus(2);
+					}
+					wechatMarkService.save(wechatMark);
+				} else {
+					//订单编号
+					wechatMark.setCause("订单" + AnalysisMapUtils.getString("cusorderid", params) + "支付失败!" + "原因:" + AnalysisMapUtils.getString("errmsg", params));
+					wechatMark.setStatus(2);
+					wechatMarkService.save(wechatMark);
+				}
+			} else {
+				wechatMark.setCause("签名验证失败");
+				wechatMark.setStatus(2);
+				wechatMarkService.save(wechatMark);
+				throw new RuntimeException("签名验证失败");
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * 微信订单回调接口 (翼车配)
+	 *
+	 * @param request
+	 * @param response
+	 */
 	private void logicMethod(HttpServletRequest request, HttpServletResponse response) {
 		try {
 			//通知传输的编码为GBK

+ 6 - 1
blade-service/blade-sales-part/pom.xml

@@ -47,7 +47,12 @@
             <version>2.8.2.RELEASE</version>
             <scope>compile</scope>
         </dependency>
-
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-payment-api</artifactId>
+            <version>2.8.2.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
 
 
     </dependencies>

+ 38 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/payMethod/PayService.java

@@ -0,0 +1,38 @@
+package org.springblade.salesPart.payMethod;
+
+import org.springblade.core.tool.api.R;
+
+import java.math.BigDecimal;
+import java.util.Map;
+
+/**
+ * @author :jixinyuan
+ * @date : 2023/5/17
+ */
+public interface PayService {
+
+	/**
+	 * 通联支付方法
+	 *
+	 * @param id           业务表主键id
+	 * @param amount       支付金额
+	 * @param serialNumber 订单流水号
+	 * @param status       订单状态
+	 * @param goodsNames   商品名称(多个用逗号拼接)
+	 * @return 支付信息
+	 */
+	R<Map<Object, Object>> payPrepay(Long id, BigDecimal amount, String serialNumber, int status, String goodsNames);
+
+	/**
+	 * 退款
+	 *
+	 * @param id                 业务表主键id
+	 * @param amount             退款金额
+	 * @param refundSerialNumber 退款流水号
+	 * @param paySerialNumber    支付流水号
+	 * @param trxId              收银宝平台流水号
+	 * @return 退款信息
+	 */
+	R<Map<String, String>> refund(Long id, BigDecimal amount, String refundSerialNumber, String paySerialNumber, String trxId);
+
+}

+ 168 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/payMethod/PayServiceImpl.java

@@ -0,0 +1,168 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.salesPart.payMethod;
+
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.pay.tonglianPayment.dto.PaymentDTO;
+import org.springblade.pay.tonglianPayment.entity.Parameters;
+import org.springblade.pay.tonglianPayment.fegin.IPaymentClient;
+import org.springblade.pay.tonglianPayment.fegin.ITongLianPaymentClient;
+import org.springblade.salesPart.entity.PjOrder;
+import org.springblade.salesPart.order.service.IOrderService;
+import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * 通联支付实现类
+ *
+ * @author jixinyuan
+ * @since 2023-05-17
+ */
+@Service
+@AllArgsConstructor
+@Slf4j
+public class PayServiceImpl implements PayService {
+
+	private final ITongLianPaymentClient tongLianPaymentClient;
+
+	private final IPaymentClient paymentClient;
+
+	private final IOrderService orderService;
+
+	/**
+	 * 获取用户信息
+	 */
+	private IUserClient userClient;
+
+	@Override
+	public R<Map<Object, Object>> payPrepay(Long id, BigDecimal amount, String serialNumber, int status, String goodsNames) {
+		if (null == id) {
+			throw new RuntimeException("未找到订单信息,订单已取消");
+		}
+
+		if (status > 1) {
+			throw new RuntimeException("订单已支付,请不要重复操作");
+		}
+
+		Parameters parameters = tongLianPaymentClient.getParametersOne();
+
+		if (ObjectUtils.isNull(parameters)) {
+			throw new RuntimeException("未找到支付信息");
+		}
+
+		R<User> r = userClient.userInfoById(AuthUtil.getUserId());
+		if (r.isSuccess() && ObjectUtils.isNull(r.getData())) {
+			throw new RuntimeException("未找到用户信息");
+		}
+		try {
+			PaymentDTO paymentDTO = new PaymentDTO();
+			paymentDTO.setTrxamt(amount.multiply(new BigDecimal(100)).intValue());
+			paymentDTO.setReqsn(serialNumber);
+			paymentDTO.setPaytype(parameters.getPayType());
+			paymentDTO.setBody("商品-" + goodsNames);
+			paymentDTO.setRemark("");
+			paymentDTO.setAcct(r.getData().getOpenId());
+			paymentDTO.setValidtime(parameters.getValidtime());
+			paymentDTO.setNotify_url(parameters.getNotifyUrl() + "/api/blade-pay/tongLianPayment/callbackNotify");
+			paymentDTO.setLimit_pay("");
+			paymentDTO.setIdno("");
+			paymentDTO.setTruename("");
+			paymentDTO.setAsinfo("");
+			paymentDTO.setSub_appid(parameters.getSubAppid());
+			paymentDTO.setGoods_tag("");
+			paymentDTO.setBenefitdetail("");
+			paymentDTO.setChnlstoreid("");
+			paymentDTO.setSubbranch("");
+			paymentDTO.setExtendparams("");
+			paymentDTO.setCusip(parameters.getCusIp());
+			paymentDTO.setFqnum("");
+			paymentDTO.setCusId(parameters.getCusId());
+			paymentDTO.setAppId(parameters.getAppId());
+			if (ObjectUtils.isEmpty(parameters.getOrgid())) {
+				paymentDTO.setOrgid("");
+			} else {
+				paymentDTO.setOrgid(parameters.getOrgid());
+			}
+			//交易类型
+			paymentDTO.setTransactionType(parameters.getTransactionType());
+			//MD5交易密钥
+			paymentDTO.setSybMdAppkey(parameters.getSybMdAppkey());
+			//RSA公钥
+			paymentDTO.setSybRsacusprikey(parameters.getSybRsacusprikey());
+			//RSA2公钥
+			paymentDTO.setSybRsatlpubkey(parameters.getSybRsatlpubkey());
+			//商户sm2私钥
+			paymentDTO.setSybSmpprivatekey(parameters.getSybSmpprivatekey());
+			//通联平台sm2公钥
+			paymentDTO.setSybSmtlpubkey(parameters.getSybSmtlpubkey());
+			//支付
+			R<Map<Object, Object>> res = paymentClient.payPrepay(paymentDTO);
+			if (res.isSuccess() && ObjectUtils.isNotNull(res.getData())) {
+				PjOrder order = new PjOrder();
+				// 付款
+				order.setActualPaymentStatus(1);
+				order.setPaymentAmountTl(amount.multiply(new BigDecimal(100)));
+				order.setOldTrxId(res.getData().get("trxid").toString());
+				//更新订单表
+				orderService.updateById(order);
+				res.getData().put("id", id);
+				return R.data(res.getData());
+			} else {
+				throw new RuntimeException("下单失败");
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new RuntimeException("下单失败,error=" + e.getMessage());
+		}
+	}
+
+	@Override
+	public R<Map<String, String>> refund(Long id, BigDecimal amount, String refundSerialNumber, String paySerialNumber, String trxId) {
+		if (null == id) {
+			throw new RuntimeException("未找到订单信息,订单已取消");
+		}
+		Parameters parameters = tongLianPaymentClient.getParametersOne();
+		if (ObjectUtils.isNull(parameters)) {
+			throw new RuntimeException("未找到支付信息");
+		}
+		//微信退款
+		PaymentDTO paymentDTO = new PaymentDTO();
+		paymentDTO.setTrxamt(amount.multiply(new BigDecimal(100)).intValue());
+		paymentDTO.setReqsn(paySerialNumber);
+		paymentDTO.setOldreqsn(refundSerialNumber);
+		paymentDTO.setOldtrxid(trxId);
+		paymentDTO.setCusId(parameters.getCusId());
+		paymentDTO.setAppId(parameters.getAppId());
+		paymentDTO.setOrgid(parameters.getOrgid());
+		paymentDTO.setTransactionType(parameters.getTransactionType());
+		paymentDTO.setSybMdAppkey(parameters.getSybMdAppkey());
+		paymentDTO.setSybRsacusprikey(parameters.getSybRsacusprikey());
+		paymentDTO.setSybRsatlpubkey(parameters.getSybRsatlpubkey());
+		paymentDTO.setSybSmpprivatekey(parameters.getSybSmpprivatekey());
+		paymentDTO.setSybSmtlpubkey(parameters.getSybSmtlpubkey());
+		return paymentClient.refund(paymentDTO);
+	}
+}