Kaynağa Gözat

preorder sucess

xujunwei 4 yıl önce
ebeveyn
işleme
539618f460

+ 1 - 1
framework-boot/src/main/java/com/mrxu/framework/boot/entity/PageParam.java

@@ -2,7 +2,7 @@ package com.mrxu.framework.boot.entity;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.mrxu.framework.boot.MrxuConst;
-import com.mrxu.framework.boot.util.MrxuAssert;
+import com.mrxu.framework.common.util.MrxuAssert;
 import com.mrxu.framework.common.util.StrFunc;
 
 public class PageParam<T> extends Page<T> {

+ 34 - 0
framework-common/pom.xml

@@ -51,6 +51,40 @@
             <groupId>javax.servlet</groupId>
             <artifactId>javax.servlet-api</artifactId>
         </dependency>
+        <dependency>
+            <groupId>javax.validation</groupId>
+            <artifactId>validation-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.hibernate.validator</groupId>
+            <artifactId>hibernate-validator</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>javax.el</groupId>
+            <artifactId>javax.el-api</artifactId>
+            <version>3.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.web</groupId>
+            <artifactId>javax.el</artifactId>
+            <version>2.2.4</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+        </dependency>
+
+        <!-- order 中用到 -->
+        <dependency>
+            <groupId>org.jdom</groupId>
+            <artifactId>jdom</artifactId>
+            <version>1.1</version>
+        </dependency>
+
 
     </dependencies>
     <packaging>jar</packaging>

+ 90 - 0
framework-common/src/main/java/com/mrxu/framework/common/util/HttpUtil.java

@@ -1,15 +1,18 @@
 package com.mrxu.framework.common.util;
 
 import com.alibaba.fastjson.JSONObject;
+import org.apache.http.ssl.SSLContexts;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import javax.net.ssl.*;
 import javax.servlet.http.HttpServletRequest;
 import java.io.*;
+import java.net.ConnectException;
 import java.net.HttpURLConnection;
 import java.net.URL;
 import java.net.URLEncoder;
+import java.security.KeyStore;
 import java.security.cert.CertificateException;
 import java.security.cert.X509Certificate;
 import java.util.HashMap;
@@ -395,4 +398,91 @@ public class HttpUtil {
         return isAjax(request) || uri.endsWith(".aj") || uri.endsWith(".json");
     }
 
+    public static String httpsRequest(String requestUrl, String requestMethod, String outputStr,String certName) {
+        SSLContext sslContext = null;
+        HttpsURLConnection conn = null;
+        InputStream inputStream = null;
+        InputStreamReader inputStreamReader = null;
+        BufferedReader bufferedReader = null;
+        try {
+            if(certName != null) {
+                KeyStore keyStore = KeyStore.getInstance("PKCS12");
+                ClassLoader loader = Thread.currentThread().getContextClassLoader();
+                InputStream instream = loader.getResourceAsStream("wxcert/" + certName + ".p12");
+                keyStore.load(instream, certName.toCharArray());
+                sslContext = SSLContexts.custom().loadKeyMaterial(keyStore, certName.toCharArray()).build();
+            }
+            else {
+                // 创建SSLContext对象,并使用我们指定的信任管理器初始化
+                TrustManager[] tm = { new MyX509TrustManager() };
+                sslContext = SSLContext.getInstance("SSL", "SunJSSE");
+                sslContext.init(null, tm, new java.security.SecureRandom());
+            }
+
+            // 从上述SSLContext对象中得到SSLSocketFactory对象
+            SSLSocketFactory ssf = sslContext.getSocketFactory();
+            URL url = new URL(requestUrl);
+            conn = (HttpsURLConnection) url.openConnection();
+            conn.setSSLSocketFactory(ssf);
+            conn.setDoOutput(true);
+            conn.setDoInput(true);
+            conn.setUseCaches(false);
+            // 设置请求方式(GET/POST)
+            conn.setRequestMethod(requestMethod);
+            conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");
+            // 当outputStr不为null时向输出流写数据
+            if (null != outputStr) {
+                OutputStream outputStream = conn.getOutputStream();
+                // 注意编码格式
+                outputStream.write(outputStr.getBytes("UTF-8"));
+                outputStream.close();
+            }
+            // 从输入流读取返回内容
+            inputStream = conn.getInputStream();
+            inputStreamReader = new InputStreamReader(inputStream, "utf-8");
+            bufferedReader = new BufferedReader(inputStreamReader);
+            String str = null;
+            StringBuffer buffer = new StringBuffer();
+            while ((str = bufferedReader.readLine()) != null) {
+                buffer.append(str);
+            }
+            // 释放资源
+            return buffer.toString();
+        }
+        catch (ConnectException ce) {
+            logger.error("连接超时:{}", ce);
+        } catch (Exception e) {
+            logger.error("https请求异常:{}", e);
+        }
+        finally {
+            try {
+                if(bufferedReader != null) {
+                    bufferedReader.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            try {
+                if(inputStreamReader != null) {
+                    inputStreamReader.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            try {
+                if(inputStream != null) {
+                    inputStream.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            inputStream = null;
+            if(conn != null) {
+                conn.disconnect();
+            }
+
+        }
+        return null;
+    }
+
 }

+ 38 - 0
framework-common/src/main/java/com/mrxu/framework/common/util/MD5Util.java

@@ -0,0 +1,38 @@
+package com.mrxu.framework.common.util;
+
+import java.security.MessageDigest;
+
+public class MD5Util {
+
+    private static String byteArrayToHexString(byte b[]) {
+        StringBuffer resultSb = new StringBuffer();
+        for (int i = 0; i < b.length; i++) {
+        	resultSb.append(byteToHexString(b[i]));
+        }
+        return resultSb.toString();
+    }
+
+	private static String byteToHexString(byte b) {
+		int n = b;
+		if (n < 0) {
+			n += 256;
+		}
+		int d1 = n / 16;
+		int d2 = n % 16;
+		return hexDigits[d1] + hexDigits[d2];
+	}
+
+	public static String MD5Encode(String origin) {
+		String resultString = null;
+		try {
+			resultString = new String(origin);
+			MessageDigest md = MessageDigest.getInstance("MD5");
+			resultString = byteArrayToHexString(md.digest(resultString.getBytes("UTF-8")));
+		}
+		catch (Exception exception) {
+		}
+		return resultString;
+	}
+	
+	private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5","6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
+}

+ 17 - 2
framework-boot/src/main/java/com/mrxu/framework/boot/util/MrxuAssert.java

@@ -1,10 +1,14 @@
-package com.mrxu.framework.boot.util;
+package com.mrxu.framework.common.util;
 
-import com.mrxu.framework.common.util.BusinessException;
+import org.hibernate.validator.HibernateValidator;
 import org.springframework.validation.BindingResult;
 import org.springframework.validation.FieldError;
 
+import javax.validation.ConstraintViolation;
+import javax.validation.Validation;
+import javax.validation.Validator;
 import java.util.List;
+import java.util.Set;
 
 public class MrxuAssert {
 
@@ -37,4 +41,15 @@ public class MrxuAssert {
             throw new BusinessException(errorMsg.toString());
         }
     }
+
+
+    private static Validator validator = Validation.byProvider(HibernateValidator.class).configure().failFast(true).buildValidatorFactory().getValidator();
+    public static void validateBean(Object obj) {
+        Set<ConstraintViolation<Object>> constraintViolations = validator.validate(obj);
+        if (constraintViolations.size() > 0) {
+            ConstraintViolation<Object> rs = constraintViolations.iterator().next();
+            throw new BusinessException(String.format("%s:%s",rs.getPropertyPath(), rs.getMessage()));
+        }
+    }
+
 }

+ 22 - 0
framework-common/src/main/java/com/mrxu/framework/common/util/MyX509TrustManager.java

@@ -0,0 +1,22 @@
+package com.mrxu.framework.common.util;
+
+import javax.net.ssl.X509TrustManager;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+
+public class MyX509TrustManager implements X509TrustManager {
+
+	// 检查客户端证书
+	public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+	}
+
+	// 检查服务器端证书
+	public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+	}
+
+	// 返回受信任的X509证书数组
+	public X509Certificate[] getAcceptedIssuers() {
+		return null;
+	}
+	
+}

+ 122 - 0
framework-common/src/main/java/com/mrxu/framework/common/xcx/WeixinUtil.java

@@ -0,0 +1,122 @@
+package com.mrxu.framework.common.xcx;
+
+import com.alibaba.fastjson.JSONObject;
+import com.mrxu.framework.common.util.BusinessException;
+import com.mrxu.framework.common.util.MD5Util;
+
+import org.jdom.Document;
+import org.jdom.Element;
+import org.jdom.JDOMException;
+import org.jdom.input.SAXBuilder;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.*;
+
+public class WeixinUtil {
+
+    public static String createSign(SortedMap<String, Object> parameters, String key) {
+        StringBuilder sb = new StringBuilder();
+        Set<Map.Entry<String, Object>> es = parameters.entrySet();
+        Iterator<Map.Entry<String, Object>> it = es.iterator();
+        while (it.hasNext()) {
+            Map.Entry<String, Object> entry = it.next();
+            String k = entry.getKey();
+            Object v = entry.getValue();
+            if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {
+                sb.append(k + "=" + v + "&");
+            }
+        }
+        sb.append("key=" + key);
+        String sign = MD5Util.MD5Encode(sb.toString()).toUpperCase();
+        return sign;
+    }
+
+    public static String getRequestXml(Map<String,Object> parameters) {
+        StringBuffer sb = new StringBuffer();
+        sb.append("<xml>");
+        Set<Map.Entry<String, Object>> es = parameters.entrySet();
+        Iterator<Map.Entry<String, Object>> it = es.iterator();
+        while (it.hasNext()) {
+            Map.Entry<String, Object> entry = it.next();
+            String k = entry.getKey();
+            Object v = entry.getValue();
+            if ("attach".equalsIgnoreCase(k) || "body".equalsIgnoreCase(k) || "sign".equalsIgnoreCase(k)) {
+                sb.append("<" + k + ">" + "<![CDATA[" + v + "]]></" + k + ">");
+            } else {
+                sb.append("<" + k + ">" + v + "</" + k + ">");
+            }
+        }
+        sb.append("</xml>");
+        return sb.toString();
+    }
+
+    public static JSONObject doXMLParse(String strxml) {
+        strxml = strxml.replaceFirst("encoding=\".*\"", "encoding=\"UTF-8\"");
+        if (null == strxml || "".equals(strxml)) {
+            return null;
+        }
+        JSONObject m = new JSONObject();
+        InputStream in = null;
+        Document doc = null;
+        try {
+            in = new ByteArrayInputStream(strxml.getBytes("UTF-8"));
+            SAXBuilder builder = new SAXBuilder();
+            doc = builder.build(in);
+            Element root = doc.getRootElement();
+            @SuppressWarnings("unchecked")
+            List<Element> list = root.getChildren();
+            Iterator<Element> it = list.iterator();
+            while (it.hasNext()) {
+                Element e = (Element) it.next();
+                String k = e.getName();
+                String v = "";
+                @SuppressWarnings("unchecked")
+                List<Element> children = e.getChildren();
+                if (children.isEmpty()) {
+                    v = e.getTextNormalize();
+                } else {
+                    v = getChildrenText(children);
+                }
+                m.put(k, v);
+            }
+        }
+        catch (JDOMException | IOException e1) {
+            e1.printStackTrace();
+            throw new BusinessException("非法xml格式");
+        }
+        finally {
+            try {
+                if(in != null) {
+                    in.close();
+                }
+            }
+            catch (IOException e) {
+            }
+        }
+        return m;
+    }
+
+    public static String getChildrenText(List<Element> children) {
+        StringBuffer sb = new StringBuffer();
+        if (!children.isEmpty()) {
+            Iterator<Element> it = children.iterator();
+            while (it.hasNext()) {
+                Element e = it.next();
+                String name = e.getName();
+                String value = e.getTextNormalize();
+                @SuppressWarnings("unchecked")
+                List<Element> list = e.getChildren();
+                sb.append("<" + name + ">");
+                if (!list.isEmpty()) {
+                    sb.append(getChildrenText(list));
+                }
+                sb.append(value);
+                sb.append("</" + name + ">");
+            }
+        }
+        return sb.toString();
+    }
+
+}

+ 62 - 0
framework-common/src/main/java/com/mrxu/framework/common/xcx/api/PayService.java

@@ -0,0 +1,62 @@
+package com.mrxu.framework.common.xcx.api;
+
+import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.mrxu.framework.common.util.HttpUtil;
+import com.mrxu.framework.common.util.IdFunc;
+import com.mrxu.framework.common.util.MrxuAssert;
+import com.mrxu.framework.common.util.StrFunc;
+import com.mrxu.framework.common.xcx.WeixinUtil;
+import com.mrxu.framework.common.xcx.bean.PayBaseResponse;
+import com.mrxu.framework.common.xcx.bean.UnifiedorderRequest;
+import com.mrxu.framework.common.xcx.bean.UnifiedorderResponse;
+
+import java.util.TreeMap;
+
+public class PayService {
+
+    //预支付订单
+    private static String unifiedorder = "https://api.mch.weixin.qq.com/pay/unifiedorder";
+    //查询订单状态
+    private static String orderquery = "https://api.mch.weixin.qq.com/pay/orderquery";
+
+    private static String refund = "https://api.mch.weixin.qq.com/secapi/pay/refund";
+
+    // https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1
+    public static UnifiedorderResponse unifiedorder(UnifiedorderRequest request,String apiKey) {
+        return request(UnifiedorderResponse.class,unifiedorder,"POST",request,apiKey,null);
+    }
+
+    private static <T extends PayBaseResponse> T request(Class<T> clazz, String requestUrl, String requestMethod, Object requestBean, String apiKey, String certName) {
+        MrxuAssert.validateBean(requestBean);
+        String jsonStr = JSONUtil.toJsonStr(requestBean);
+        TreeMap<String, Object> parameters = JSONUtil.toBean(jsonStr,new TreeMap<String, String>().getClass());
+        // 签名,详见签名生成算法
+        String sign = WeixinUtil.createSign(parameters,apiKey);
+        parameters.put("sign", sign);
+        String requestXML = WeixinUtil.getRequestXml(parameters);
+        String resultStr =  HttpUtil.httpsRequest(requestUrl,requestMethod,requestXML,null);
+        System.out.println(resultStr);
+        JSONObject resultJson = WeixinUtil.doXMLParse(resultStr);
+        T result = JSONUtil.toBean(resultJson.toJSONString(),clazz);
+        return result;
+    }
+
+    public static void main(String[] args) {
+        UnifiedorderRequest request = new UnifiedorderRequest();
+        request.setAppid("wx199e4718946c4e6d");
+        request.setMch_id("1514682921");
+        request.setNonce_str(StrFunc.randomString(32));
+        request.setBody("test");
+        request.setOut_trade_no(IdFunc.getId("F"));
+        request.setTotal_fee(100);
+        request.setSpbill_create_ip("127.0.0.1");
+        request.setTime_expire("20211227091010");
+        request.setNotify_url("333");
+        request.setTrade_type("JSAPI");
+        request.setOpenid("o9ZIQ5Ts4Bo_z3o0J47wPWVGRRy8");
+        unifiedorder(request,"7616442b20a95c985ae712d72797c4c7");
+    }
+
+
+}

+ 1 - 0
framework-common/src/main/java/com/mrxu/framework/common/xcx/base/XcxHttp.java

@@ -47,5 +47,6 @@ public class XcxHttp {
 		}
         return wxRs;
     }
+
 	
 }

+ 14 - 0
framework-common/src/main/java/com/mrxu/framework/common/xcx/bean/PayBaseResponse.java

@@ -0,0 +1,14 @@
+package com.mrxu.framework.common.xcx.bean;
+
+import lombok.Data;
+
+@Data
+public class PayBaseResponse {
+
+    // 返回状态码	return_code	是	String(16)	SUCCESS  SUCCESS/FAIL 此字段是通信标识,非交易标识,交易是否成功需要查看result_code来判断
+    private String return_code;
+    // 返回信息	return_msg	否	String(128)	签名失败 返回信息,如非空,为错误原因 签名失败 参数格式校验错误
+    private String return_msg;
+
+
+}

+ 120 - 0
framework-common/src/main/java/com/mrxu/framework/common/xcx/bean/UnifiedorderRequest.java

@@ -0,0 +1,120 @@
+package com.mrxu.framework.common.xcx.bean;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.Size;
+
+@Data
+public class UnifiedorderRequest {
+
+    //小程序ID	appid  是	String(32)	wxd678efh567hg6787	微信分配的小程序ID
+    @Size(max=32)
+    @NotEmpty
+    private String appid;
+    // 商户号	mch_id	是	String(32)	1230000109	微信支付分配的商户号
+    @Size(max=32)
+    @NotEmpty
+    private String mch_id;
+    // 设备号	device_info	否	String(32)	013467007045764	自定义参数,可以为终端设备号(门店号或收银设备ID),PC网页或公众号内支付可以传"WEB"
+    private String device_info;
+    // 随机字符串	nonce_str	是	String(32)	5K8264ILTKCH16CQ2502SI8ZNMTM67VS	随机字符串,长度要求在32位以内。推荐随机数生成算法
+    @Size(max=32)
+    @NotEmpty
+    private String nonce_str;
+    // 签名	sign	是	String(64)	C380BEC2BFD727A4B6845133519F3AD6	通过签名算法计算得出的签名值,详见签名生成算法
+    //@Size(max=64)
+    //@NotEmpty
+    private String sign;
+    // 签名类型	sign_type	否	String(32)	MD5	签名类型,默认为MD5,支持HMAC-SHA256和MD5。
+    @Size(max=32)
+    private String sign_type;
+    // 商品描述	body	是	String(127)	腾讯充值中心-QQ会员充值 商品简单描述,该字段请按照规范传递,具体请见参数规定
+    @Size(max=127)
+    @NotEmpty
+    private String body;
+    /*商品详情	detail	否	String(6000)	[{
+        "goods_detail":[
+        {
+            "goods_id":"iphone6s_16G",
+                "wxpay_goods_id":"1001",
+                "goods_name":"iPhone6s 16G",
+                "quantity":1,
+                "price":528800,
+                "goods_category":"123456",
+                "body":"苹果手机"
+        },
+        {
+            "goods_id":"iphone6s_32G",
+                "wxpay_goods_id":"1002",
+                "goods_name":"iPhone6s 32G",
+                "quantity":1,
+                "price":608800,
+                "goods_category":"123789",
+                "body":"苹果手机"
+        }
+        ]
+    }]	商品详细描述,对于使用单品优惠的商户,该字段必须按照规范上传,详见“单品优惠参数说明”*/
+    @Size(max=6000)
+    private String detail;
+    // 附加数据	attach	否	String(127)	深圳分店	附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用。
+    @Size(max=127)
+    private String attach;
+    // 商户订单号	out_trade_no	是	String(32)	20150806125346	商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*且在同一个商户号下唯一。详见商户订单号
+    @Size(max=32)
+    @NotEmpty
+    private String out_trade_no;
+    // 标价币种	fee_type	否	String(16)	CNY	符合ISO 4217标准的三位字母代码,默认人民币:CNY,详细列表请参见货币类型
+    @Size(max=16)
+    private String fee_type;
+    // 标价金额	total_fee	是	int	88	订单总金额,单位为分,详见支付金额
+    private int total_fee;
+    // 终端IP	spbill_create_ip	是	String(64)	123.12.12.123	支持IPV4和IPV6两种格式的IP地址。调用微信支付API的机器IP
+    @Size(max=64)
+    @NotEmpty
+    private String spbill_create_ip;
+    // 交易起始时间	time_start	否	String(14)	20091225091010	订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则
+    @Size(max=14)
+    private String time_start;
+    /*交易结束时间	time_expire	否	String(14)	20091227091010
+    订单失效时间,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为20091227091010。订单失效时间是针对订单号而言的,由于在请求支付的时候有一个必传参数prepay_id只有两小时的有效期,所以在重入时间超过2小时的时候需要重新请求下单接口获取新的prepay_id。其他详见时间规则
+    建议:最短失效时间间隔大于1分钟*/
+    @Size(max=14)
+    private String time_expire;
+    // 订单优惠标记	goods_tag	否	String(32)	WXG	订单优惠标记,使用代金券或立减优惠功能时需要的参数,说明详见代金券或立减优惠
+    @Size(max=32)
+    private String goods_tag;
+    // 通知地址	notify_url	是	String(256)	https://www.weixin.qq.com/wxpay/pay.php	异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。公网域名必须为https,如果是走专线接入,使用专线NAT IP或者私有回调域名可使用http。
+    @Size(max=256)
+    private String notify_url;
+    // 交易类型	trade_type	是	String(16)	JSAPI	小程序取值如下:JSAPI,详细说明见参数规定
+    @Size(max=16)
+    @NotEmpty
+    private String trade_type;
+    // 商品ID	product_id	否	String(32)	12235413214070356458058	trade_type=NATIVE时,此参数必传。此参数为二维码中包含的商品ID,商户自行定义。
+    @Size(max=32)
+    private String product_id;
+    // 指定支付方式	limit_pay	否	String(32)	no_credit	上传此参数no_credit--可限制用户不能使用信用卡支付
+    @Size(max=32)
+    private String limit_pay;
+    // 用户标识	openid	否	String(128)	oUpF8uMuAJO_M2pxb1Q9zNjWeS6o	trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识。openid如何获取,可参考【获取openid】。
+    @Size(max=128)
+    private String openid;
+    // 电子发票入口开放标识	receipt	否	String(8)	Y	Y,传入Y时,支付成功消息和支付详情页将出现开票入口。需要在微信支付商户平台或微信公众平台开通电子发票功能,传此字段才可生效
+    @Size(max=8)
+    private String receipt;
+    //是否需要分账	profit_sharing	否	String(16)	Y	Y-是,需要分账 N-否,不分账 字母要求大写,不传默认不分账
+    @Size(max=16)
+    private String profit_sharing;
+    /*场景信息	scene_info	否	String(256)
+    {"store_info" : {
+        "id": "SZTX001",
+                "name": "腾大餐厅",
+                "area_code": "440305",
+                "address": "科技园中一路腾讯大厦" }}
+
+    该字段常用于线下活动时的场景信息上报,支持上报实际门店信息,商户也可以按需求自己上报相关信息。该字段为JSON对象数据,对象格式为{"store_info":{"id": "门店ID","name": "名称","area_code": "编码","address": "地址" }} ,字段详细说明请点击行前的+展开
+    */
+    @Size(max=256)
+    private String scene_info;
+}

+ 36 - 0
framework-common/src/main/java/com/mrxu/framework/common/xcx/bean/UnifiedorderResponse.java

@@ -0,0 +1,36 @@
+package com.mrxu.framework.common.xcx.bean;
+
+import lombok.Data;
+
+@Data
+public class UnifiedorderResponse extends PayBaseResponse {
+
+/***** 以下字段在return_code为SUCCESS的时候有返回 *****/
+    // 小程序ID	appid	是	String(32)	wx8888888888888888	调用接口提交的小程序ID
+    private String appid;
+    // 商户号	mch_id	是	String(32)	1900000109	调用接口提交的商户号
+    private String mch_id;
+    // 设备号	device_info	否	String(32)	013467007045764	自定义参数,可以为请求支付的终端设备号等
+    private String device_info;
+    // 随机字符串	nonce_str	是	String(32)	5K8264ILTKCH16CQ2502SI8ZNMTM67VS	微信返回的随机字符串
+    private String nonce_str;
+    // 签名	sign	是	String(64)	C380BEC2BFD727A4B6845133519F3AD6	微信返回的签名值,详见签名算法
+    private String sign;
+    // 业务结果	result_code	是	String(16)	SUCCESS	SUCCESS/FAIL
+    private String result_code;
+    // 错误代码	err_code	否	String(32)	SYSTEMERROR	详细参见下文错误列表
+    private String err_code;
+    // 错误代码描述	err_code_des	否	String(128)	系统错误	错误信息描述
+    private String err_code_des;
+
+
+/***** 以下字段在return_code 和result_code都为SUCCESS的时候有返回 *****/
+    // 交易类型	trade_type	是	String(16)	JSAPI	交易类型,取值为:JSAPI,NATIVE,APP等,说明详见参数规定
+    private String trade_type;
+    // 预支付交易会话标识	prepay_id	是	String(64)	wx201410272009395522657a690389285100	微信生成的预支付会话标识,用于后续接口调用中使用,该值有效期为2小时
+    private String prepay_id;
+    /* 二维码链接	code_url	否	String(64)	weixin://wxpay/bizpayurl/up?pr=NwY5Mz9&groupid=00
+    trade_type=NATIVE时有返回,此url用于生成支付二维码,然后提供给用户进行扫码支付。
+    注意:code_url的值并非固定,使用时按照URL格式转成二维码即可 */
+    private String code_url;
+}

+ 1 - 1
framework-starter/mrxu-starter-redisson/src/main/java/com/mrxu/framework/starter/redisson/aop/LockManager.java

@@ -5,7 +5,7 @@ import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
 import java.util.concurrent.TimeUnit;
 
-import com.mrxu.framework.boot.util.MrxuAssert;
+import com.mrxu.framework.common.util.MrxuAssert;
 import org.aspectj.lang.ProceedingJoinPoint;
 import org.aspectj.lang.annotation.Around;
 import org.aspectj.lang.annotation.Aspect;