From 74f666605450658b86e1b5ca076500aa341b6f49 Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期二, 22 七月 2025 13:59:09 +0800
Subject: [PATCH] yml活动管理代码

---
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/PaymentUtil.java |  158 +++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 143 insertions(+), 15 deletions(-)

diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/PaymentUtil.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/PaymentUtil.java
index 8c9a7e7..a24fe8f 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/PaymentUtil.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/PaymentUtil.java
@@ -7,9 +7,13 @@
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
 import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.other.util.UUIDUtil;
 import com.ruoyi.other.util.payment.model.*;
 import lombok.extern.slf4j.Slf4j;
 
+import java.math.BigDecimal;
+import java.net.InetAddress;
+import java.text.SimpleDateFormat;
 import java.util.*;
 
 /**
@@ -19,25 +23,25 @@
  */
 @Slf4j
 public class PaymentUtil {
-	
+
 	//微信公众号、微信小程序、微信 APP+/H5、云微小程序支付
-	private static final String appId = "wxdeed472c98e42a54";
+	private static final String appId = "wx049faf9c5234f31c";
 	/**
 	 * 商户密钥
 	 */
-	private static final String key = "925899fcc374430f9e4b4ba3db05b448";
+	private static final String key = "ss369875124965782f148539657826321";
 	/**
 	 * 商户号
 	 */
-	private static final String merchantNo = "888122600004175";
+	private static final String merchantNo = "1717539630";
 	/**
 	 * 平台-报备商户号
 	 */
-	private static final String sysTradeMerchantNo = "777168500885852";
+	private static final String sysTradeMerchantNo = "";
 	/**
 	 * 支付回调地址
 	 */
-	private static final String callbackUrl = "https://www.qijisheng.top";
+	private static final String callbackUrl = "https://221.182.45.100:8084";
 	
 	
 	/**
@@ -101,8 +105,138 @@
 		UniPayResult uniPayResult = JSON.parseObject(execute.body(), UniPayResult.class);
 		return uniPayResult;
 	}
-	
-	
+	/**
+	 * native支付
+	 * @param orderNo           商户订单号
+	 * @param amount            订单金额
+	 * @param notifyUrl         服务器异步通知地址
+	 * @return
+	 */
+	public static String nativePay(String orderNo, BigDecimal amount, String notifyUrl) throws Exception {
+		int totalFee = amount.multiply(new BigDecimal("100")).intValue();
+
+		String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
+
+		// 构建 XML 请求体
+		Map<String, Object> params = new HashMap<>();
+		params.put("appid", appId);
+		params.put("mch_id", merchantNo);
+		params.put("nonce_str", UUIDUtil.getRandomCode(16));
+		params.put("body", "积分充值");
+		params.put("out_trade_no", orderNo);
+		params.put("total_fee", totalFee);
+//		params.put("spbill_create_ip", InetAddress.getLocalHost().getHostAddress());
+		params.put("spbill_create_ip", "221.182.45.100");
+		params.put("notify_url", "https://221.182.45.100:8084/undif");
+		params.put("trade_type", "NATIVE");
+		params.put("product_id", "1");
+
+		String sign = sign1(JSONObject.from(params)); // 使用原来的 sign 方法
+		params.put("sign", sign);
+
+		String xmlBody = mapToXml(params); // 转换为 XML 字符串
+
+		// 发送请求
+		HttpRequest post = HttpUtil.createPost(url);
+		post.header(Header.CONTENT_TYPE, "application/xml");
+		post.body(xmlBody); // 发送原始 XML 字符串
+
+		log.info("Native支付接口请求参数:" + xmlBody);
+		HttpResponse execute = post.execute();
+		log.info("Native支付接口请求响应:" + execute.body());
+
+		if (execute.getStatus() != 200) {
+			log.error("Native支付接口异常:" + execute.body());
+			return null;
+		}
+		return execute.body();
+	}
+	private static String mapToXml(Map<String, Object> map) {
+		StringBuilder sb = new StringBuilder();
+		sb.append("<xml>");
+		for (Map.Entry<String, Object> entry : map.entrySet()) {
+			String key = entry.getKey();
+			Object value = entry.getValue();
+			if (value != null && !value.toString().isEmpty()) {
+				sb.append("<").append(key).append(">");
+				sb.append(value);
+				sb.append("</").append(key).append(">");
+			}
+		}
+		sb.append("</xml>");
+		return sb.toString();
+	}
+	public static String sign1(JSONObject body) {
+		Set<Map.Entry<String, Object>> entries = body.entrySet();
+		List<Map.Entry<String, Object>> infoIds = new ArrayList<>(entries);
+
+		// 排除 sign 字段本身
+		infoIds.removeIf(entry -> "sign".equals(entry.getKey()));
+
+		// 按 ASCII 顺序排序
+		infoIds.sort(Map.Entry.comparingByKey());
+
+		StringBuilder sb = new StringBuilder();
+		for (Map.Entry<String, Object> entry : infoIds) {
+			Object val = entry.getValue();
+			if (val != null && !val.toString().trim().isEmpty()) {
+				sb.append(entry.getKey()).append("=").append(val).append("&");
+			}
+		}
+
+		// 最后拼接 &key=商户密钥
+		sb.append("key=").append(key);
+
+		String stringSignTemp = sb.toString();
+		log.info("待签名串:{}", stringSignTemp);
+
+		// 使用 MD5 加密
+		return MD5AndKL.MD5(stringSignTemp);
+	}
+
+	/**
+	 * 微信下单的签名算法
+	 *
+	 * @param map
+	 * @return
+	 */
+	private String weixinSignature(Map<String, Object> map) {
+		try {
+			Set<Map.Entry<String, Object>> entries = map.entrySet();
+			List<Map.Entry<String, Object>> infoIds = new ArrayList<Map.Entry<String, Object>>(entries);
+			// 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)
+			Collections.sort(infoIds, new Comparator<Map.Entry<String, Object>>() {
+				public int compare(Map.Entry<String, Object> o1, Map.Entry<String, Object> o2) {
+					return (o1.getKey()).toString().compareTo(o2.getKey());
+				}
+			});
+			// 构造签名键值对的格式
+			StringBuilder sb = new StringBuilder();
+			for (Map.Entry<String, Object> item : infoIds) {
+				if (item.getKey() != null || item.getKey() != "") {
+					String key = item.getKey();
+					Object val = item.getValue();
+					if (!(val == "" || val == null)) {
+						sb.append(key + "=" + val + "&");
+					}
+				}
+			}
+			sb.append("key=" + key);
+			String sign = MD5AndKL.MD5Encode(sb.toString(), "UTF-8").toUpperCase(); //注:MD5签名方式
+			return sign;
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+	public static void main(String[] args) throws Exception {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+		String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5);
+		String string = PaymentUtil.nativePay(code,new BigDecimal("0.1"),
+				"/test"
+		);
+		System.err.println(string);
+	}
 	/**
 	 * 查询支付订单
 	 * @param orderNo   订单号
@@ -282,11 +416,5 @@
 	}
 	
 	
-	public static void main(String[] args) {
-//		UniPayResult uniPayResult = PaymentUtil.uniPay("852963742", 0.01D, "测试商品", "这是用于对接支付测试的商品描述",
-//				"", "/order/shopping-cart/shoppingCartPaymentCallback", "ooOrs64zHLuInkZ_GF0LpIN9_Rxc", "777168500885852");
-//		PaymentUtil.queryOrder("852963742");
-//		PaymentUtil.closeOrder("852963742");
-	
-	}
+
 }

--
Gitblit v1.7.1