From 16da0ad1fda1dffa3019425a6887d38ed4217f44 Mon Sep 17 00:00:00 2001 From: wzy <wzy19931122ai@163.com> Date: Sun, 10 Jan 2021 14:26:02 +0800 Subject: [PATCH] Merge branch 'api' into order_reform --- zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/weixinUtil/WeixinServiceUtil.java | 62 +++ zq-erp/src/main/resources/templates/views/admin/shop/templateMsg-list.html | 1 zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/HttpsRequest2.java | 53 ++- zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/Signature.java | 20 zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxCommonAction.java | 13 zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/payProtocol/JsApiPayReqData.java | 23 zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/templateMsg/AppointmentSuccess.java | 2 zq-erp/src/main/resources/config/application.properties | 2 zq-erp/src/main/resources/config/test/application.properties | 9 zq-erp/src/main/java/com/matrix/system/shopXcx/action/ShopRefundRecordAction.java | 8 zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/payComProtocol/JsApiPayComReqData.java | 6 zq-erp/src/main/java/com/matrix/component/rabbitmq/RabiitMqTemplate.java | 1 zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/TemplateMessageBulder.java | 19 + zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/service/BaseService.java | 4 zq-erp/src/main/java/com/matrix/system/shopXcx/api/service/impl/WxShopRefundRecordServiceImpl.java | 5 zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopWxtemplateMsgDao.xml | 30 + zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/MsgDemo3.java | 35 ++ zq-erp/src/main/resources/config/test/system.properties | 2 zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjServicesServiceImpl.java | 20 + zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/TemplateNameConstance.java | 15 + zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysVipInfoServiceImpl.java | 1 zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WXShopOrderAction.java | 1 zq-erp/src/main/java/com/matrix/system/shopXcx/dao/ShopWxtemplateMsgDao.java | 2 zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/queryProtocol/ScanPayQueryReqData.java | 6 zq-erp/src/main/java/com/matrix/config/RabbitMqConfig.java | 8 zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/refundProtocol/RefundReqData.java | 8 /dev/null | 19 - zq-erp/src/main/java/com/matrix/system/app/action/ApiServiceOrderAction.java | 2 zq-erp/src/main/java/com/matrix/system/shopXcx/bean/ShopWxtemplateMsg.java | 89 +++++- zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/UniformMsgSentTask.java | 120 ++++++++ zq-erp/src/main/java/com/matrix/core/tools/rr/GlueFactory.java | 23 + zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/DefaultTemplateMessageBulder.java | 99 +++++++ zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/WechatConfigure.java | 19 - zq-erp/src/main/java/com/matrix/system/common/constance/AppConstance.java | 44 +++ zq-erp/src/main/resources/config/db/increment/20210109.sql | 5 zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/VipCreateTask.java | 2 zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/MQTaskRouting.java | 6 zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/paramProtocol/BrandWCPayRequestData.java | 6 zq-erp/src/main/resources/config/lhx/system.properties | 3 39 files changed, 654 insertions(+), 139 deletions(-) diff --git a/zq-erp/src/main/java/com/matrix/component/rabbitmq/RabiitMqTemplate.java b/zq-erp/src/main/java/com/matrix/component/rabbitmq/RabiitMqTemplate.java index 89fea6d..bf51909 100644 --- a/zq-erp/src/main/java/com/matrix/component/rabbitmq/RabiitMqTemplate.java +++ b/zq-erp/src/main/java/com/matrix/component/rabbitmq/RabiitMqTemplate.java @@ -84,6 +84,7 @@ if (task != null) { // 消息内容 if (StringUtils.isNotBlank(content)) { + LogUtil.info("本次发送消息task.getExchange()="+task.getExchange()+";routingKey="+routingKey+";content="+content); channel.basicPublish(task.getExchange(), routingKey, false, null, content.getBytes()); } else { LogUtil.info("本次发送空消息"); diff --git a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/HttpsRequest2.java b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/HttpsRequest2.java index 12856ec..6f05de1 100644 --- a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/HttpsRequest2.java +++ b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/HttpsRequest2.java @@ -41,7 +41,7 @@ } Logger log=Logger.getLogger(HttpRequest.class); - + //表示请求器是否已经做了初始化工作 private boolean hasInit = false; @@ -56,6 +56,10 @@ //HTTP请求器 private CloseableHttpClient httpClient; + //证书地址 + private String certLocalPath; + //商户号 + private String mchId; public HttpsRequest2() throws UnrecoverableKeyException, KeyManagementException, NoSuchAlgorithmException, KeyStoreException, IOException { init(); @@ -63,10 +67,10 @@ private void init() throws IOException, KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyManagementException { - KeyStore keyStore = KeyStore.getInstance("PKCS12"); - FileInputStream instream = new FileInputStream(new File(WechatConfigure.certLocalPath));//加载本地的证书进行https加密传输 + KeyStore keyStore = KeyStore.getInstance("PKCS12"); + FileInputStream instream = new FileInputStream(new File(certLocalPath));//加载本地的证书进行https加密传输 try { - keyStore.load(instream,WechatConfigure.certPassword.toCharArray());//设置证书密码 + keyStore.load(instream, mchId.toCharArray());//设置证书密码 } catch (CertificateException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { @@ -76,7 +80,7 @@ } // Trust own CA and all self-signed certs SSLContext sslcontext = SSLContexts.custom() - .loadKeyMaterial(keyStore, WechatConfigure.certPassword.toCharArray()) + .loadKeyMaterial(keyStore, mchId.toCharArray()) .build(); // Allow TLSv1 protocol only SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory( @@ -85,11 +89,11 @@ null, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); - - httpClient = HttpClients.custom() + + httpClient = HttpClients.custom() .setSSLSocketFactory(sslsf) .build(); - // httpClient = HttpClients.custom().build(); + // httpClient = HttpClients.custom().build(); //根据默认超时限制初始化requestConfig requestConfig = RequestConfig.custom().setSocketTimeout(socketTimeout).setConnectTimeout(connectTimeout).build(); hasInit = true; @@ -135,17 +139,17 @@ httpPost.setConfig(requestConfig); log.info("executing request" + httpPost.getRequestLine()); - + try { HttpResponse response = httpClient.execute(httpPost); HttpEntity entity = response.getEntity(); result = EntityUtils.toString(entity, "UTF-8"); - + log.info("POST back date:" + httpPost.getRequestLine()); - - + + } catch (ConnectionPoolTimeoutException e) { // log.e("http get throw ConnectionPoolTimeoutException(wait time out)"); @@ -157,7 +161,7 @@ // log.e("http get throw SocketTimeoutException"); } catch (Exception e) { - e.printStackTrace(); + e.printStackTrace(); // log.e("http get throw Exception"); } finally { @@ -173,7 +177,7 @@ * @param socketTimeout 连接时长,默认10秒 */ public void setSocketTimeout(int socketTimeout) { - this.socketTimeout = socketTimeout; + this.socketTimeout = socketTimeout; resetRequestConfig(); } @@ -183,7 +187,7 @@ * @param connectTimeout 传输时长,默认30秒 */ public void setConnectTimeout(int connectTimeout) { - this.connectTimeout = connectTimeout; + this.connectTimeout = connectTimeout; resetRequestConfig(); } @@ -197,6 +201,23 @@ * @param requestConfig 设置HttpsRequest的请求器配置 */ public void setRequestConfig(RequestConfig requestConfig) { - this.requestConfig = requestConfig; + this.requestConfig = requestConfig; + } + + + public String getMchId() { + return mchId; + } + + public void setMchId(String mchId) { + this.mchId = mchId; + } + + public String getCertLocalPath() { + return certLocalPath; + } + + public void setCertLocalPath(String certLocalPath) { + this.certLocalPath = certLocalPath; } } diff --git a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/Signature.java b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/Signature.java index 40300d5..c764cff 100644 --- a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/Signature.java +++ b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/Signature.java @@ -22,7 +22,7 @@ * @return 签名 * @throws IllegalAccessException */ - public static String getSign(Object o) throws IllegalAccessException { + public static String getSign(Object o,String paySecret) throws IllegalAccessException { ArrayList<String> list = new ArrayList<String>(); Class<? extends Object> cls = o.getClass(); Field[] fields = cls.getDeclaredFields(); @@ -40,14 +40,14 @@ sb.append(arrayToSort[i]); } String result = sb.toString(); - result += "key=" + WechatConfigure.key; + result += "key=" +paySecret; Util.log("Sign Before MD5:" + result); result = MD5.MD5Encode(result).toUpperCase(); Util.log("Sign Result:" + result); return result; } - public static String getSign(Map<String, Object> map) { + public static String getSign(Map<String, Object> map,String paySecret) { ArrayList<String> list = new ArrayList<String>(); for (Map.Entry<String, Object> entry : map.entrySet()) { if (entry.getValue() != "") { @@ -62,7 +62,7 @@ sb.append(arrayToSort[i]); } String result = sb.toString(); - result += "key=" + WechatConfigure.key; + result += "key=" + paySecret; Util.log("Sign Before MD5:" + result); result = MD5.MD5Encode(result).toUpperCase(); Util.log("Sign Result:" + result); @@ -79,13 +79,13 @@ * @throws IOException * @throws SAXException */ - public static String getSignFromResponseString(String responseString) + public static String getSignFromResponseString(String responseString,String paySecret) throws IOException, SAXException, ParserConfigurationException { Map<String, Object> map = XMLParser.getMapFromXML(responseString); // 清掉返回数据对象里面的Sign数据(不能把这个数据也加进去进行签名),然后用签名算法进行签名 map.put("sign", ""); // 将API返回的数据根据用签名算法进行计算新的签名,用来跟API返回的签名进行比较 - return Signature.getSign(map); + return Signature.getSign(map,paySecret); } /** @@ -98,7 +98,7 @@ * @throws IOException * @throws SAXException */ - public static boolean checkIsSignValidFromResponseString(String responseString) + public static boolean checkIsSignValidFromResponseString(String responseString,String paySecret) throws ParserConfigurationException, IOException, SAXException { Map<String, Object> map = XMLParser.getMapFromXML(responseString); @@ -113,7 +113,7 @@ // 清掉返回数据对象里面的Sign数据(不能把这个数据也加进去进行签名),然后用签名算法进行签名 map.put("sign", ""); // 将API返回的数据根据用签名算法进行计算新的签名,用来跟API返回的签名进行比较 - String signForAPIResponse = Signature.getSign(map); + String signForAPIResponse = Signature.getSign(map,paySecret); if (!signForAPIResponse.equals(signFromAPIResponse)) { // 签名验不过,表示这个API返回的数据有可能已经被篡改了 @@ -124,9 +124,7 @@ return true; } - public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException { - System.out.println(checkIsSignValidFromResponseString("<xml><appid><![CDATA[wx13515a9204ea669d]]></appid><attach><![CDATA[35f7170585ad4f09b5109cc985b1eec0]]></attach><bank_type><![CDATA[CFT]]></bank_type><cash_fee><![CDATA[1]]></cash_fee><fee_type><![CDATA[CNY]]></fee_type><is_subscribe><![CDATA[N]]></is_subscribe><mch_id><![CDATA[1486409192]]></mch_id><nonce_str><![CDATA[elqhnr10vzaq0wgalf9njjyqwyd7gyr7]]></nonce_str><openid><![CDATA[o8x8E5lqmD9c5rdsjTQ9KWN4-H40]]></openid><out_trade_no><![CDATA[2018090610284198419]]></out_trade_no><result_code><![CDATA[SUCCESS]]></result_code><return_code><![CDATA[SUCCESS]]></return_code><sign><![CDATA[DD04172CDAA60F834163AF3F5B63BE3F]]></sign><time_end><![CDATA[20180906102853]]></time_end><total_fee>1</total_fee><trade_type><![CDATA[JSAPI]]></trade_type><transaction_id><![CDATA[4200000169201809067369627940]]></transaction_id></xml>")); - } + /** * diff --git a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/WechatConfigure.java b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/WechatConfigure.java index 30d2a22..0a37ebc 100644 --- a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/WechatConfigure.java +++ b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/common/WechatConfigure.java @@ -9,7 +9,7 @@ // 这个就是自己要保管好的私有Key了(切记只能放在自己的后台代码里,不能放在任何可能被看到源代码的客户端程序中) // 每次自己Post数据给API的时候都要用这个key来对所有字段进行签名,生成的签名会放在Sign这个字段,API收到Post数据的时候也会用同样的签名算法对Post过来的数据进行签名和验证 // 收到API的返回的时候也要用这个key来对返回的数据算下签名,跟API的Sign数据进行比较,如果值不一致,有可能数据被第三方给篡改 - public static final String PAY_NOTIFY_URL="https://xcxhive2.jyymatrix.cc/wxCommon/wxpayCallback"; + // 交易类型 public static final String TRADE_TYPE_JSAPI = "JSAPI"; public static final String TRADE_TYPE_NATIVE = "NATIVE"; @@ -17,28 +17,15 @@ public static final String SIGN_MD5 = "MD5"; //域名 - - // 微信支付秘钥 - public static String key = "3hbNHPOSXx85rC0QEqvGgIHu1wduT4Qc"; - - // 微信分配的公众号ID(开通公众号之后可以获取到) - public static String appID = "wx3836ab3c1490ff29"; - - - // 微信支付分配的商户号ID(开通公众号的微信支付功能之后可以获取到) - public static String mchID = "1573208361"; - - - public static String web_appID = "1486409192"; + // 受理模式下给子商户分配的子商户号 public static String subMchID = ""; // HTTPS证书的本地路径 public static String certLocalPath = "/home/cert/apiclient_cert.p12"; - // HTTPS证书密码,默认密码等于商户号MCHID - public static String certPassword = "1573208361"; + // 是否使用异步线程的方式来上报API测速,默认为异步模式 public static boolean useThreadToDoReport = true; diff --git a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/paramProtocol/BrandWCPayRequestData.java b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/paramProtocol/BrandWCPayRequestData.java index c367bf3..b0c8126 100644 --- a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/paramProtocol/BrandWCPayRequestData.java +++ b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/paramProtocol/BrandWCPayRequestData.java @@ -25,16 +25,16 @@ private String signType = ""; private String paySign = ""; - public BrandWCPayRequestData(String prepay_id){ + public BrandWCPayRequestData(String prepay_id,String appID,String paySecret){ //默认必须设置 - setAppId(WechatConfigure.appID); + setAppId(appID); //随机字符串,不长于32 位 setNonceStr(RandomStringGenerator.getRandomStringByLength(32)); setTimeStamp(Long.toString(System.currentTimeMillis() / 1000L)); setPrepay_id("prepay_id="+prepay_id); //根据API给的签名规则进行签名 【 必须要放在本方法的最后】 setSignType(WechatConfigure.SIGN_MD5); - String sign = Signature.getSign(toMap()); + String sign = Signature.getSign(toMap(),paySecret); setPaySign(sign);//把签名数据设置到Sign这个属性中 } diff --git a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/payComProtocol/JsApiPayComReqData.java b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/payComProtocol/JsApiPayComReqData.java index 7313595..d38b928 100644 --- a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/payComProtocol/JsApiPayComReqData.java +++ b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/payComProtocol/JsApiPayComReqData.java @@ -70,16 +70,16 @@ * @param bankTrueName 收款号姓名 * @param bankCode 收款号开户行 */ - public JsApiPayComReqData(String desc, String outTradeNo, int totalFee, String bankNo, String bankTrueName, String bankCode) { + public JsApiPayComReqData(String mchID,String paySecret ,String desc, String outTradeNo, int totalFee, String bankNo, String bankTrueName, String bankCode) { //默认必须设置 - setMch_id(WechatConfigure.mchID); + setMch_id(mchID); setDesc(desc); setPartner_trade_no(outTradeNo); setAmount(totalFee); //随机字符串,不长于32 位 setNonce_str(RandomStringGenerator.getRandomStringByLength(32)); //根据API给的签名规则进行签名 【 必须要放在本方法的最后】 - String sign = Signature.getSign(toMap()); + String sign = Signature.getSign(toMap(),paySecret); setSign(sign);//把签名数据设置到Sign这个属性中 // setEnc_bank_no(); // setEnc_true_name(); diff --git a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/payProtocol/JsApiPayReqData.java b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/payProtocol/JsApiPayReqData.java index 2dc5f1e..819f58a 100644 --- a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/payProtocol/JsApiPayReqData.java +++ b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/payProtocol/JsApiPayReqData.java @@ -32,8 +32,8 @@ /** * 接收微信支付异步通知回调地址 */ - private String notify_url = WechatConfigure.PAY_NOTIFY_URL; private String trade_type = WechatConfigure.TRADE_TYPE_JSAPI; + private String notify_url ; private String openid = ""; private String limit_pay = ""; private String spbill_create_ip = ""; @@ -47,7 +47,8 @@ public JsApiPayReqData() { } - /** + /**appID 收款应用id + * mchID 商户号 * @param authCode 这个是扫码终端设备从用户手机上扫取到的支付授权号,这个号是跟用户用来支付的银行卡绑定的,有效期是1分钟 * @param body 要支付的商品的描述信息,用户会在支付成功页面里看到这个信息 * @param attach 支付订单里面可以填的附加数据,API会将提交的这个附加数据原样返回 @@ -59,10 +60,11 @@ * @param timeExpire 订单失效时间,格式同上 * @param goodsTag 商品标记,微信平台配置的商品标记,用于优惠券或者满减使用 */ - public JsApiPayReqData(String body,String outTradeNo,int totalFee,String spBillCreateIP,String openid,String attach){ + public JsApiPayReqData(String appID, String mchID,String paySecret,String notify_url, String body,String outTradeNo,int totalFee,String spBillCreateIP,String openid,String attach){ //默认必须设置 - setAppid(WechatConfigure.appID); - setMch_id(WechatConfigure.mchID); + setAppid(appID); + setMch_id(mchID); + setNotify_url(notify_url); setBody(body); setOut_trade_no(outTradeNo); setTotal_fee(totalFee); @@ -72,16 +74,17 @@ setNonce_str(RandomStringGenerator.getRandomStringByLength(32)); setOpenid(openid); //根据API给的签名规则进行签名 【 必须要放在本方法的最后】 - String sign = Signature.getSign(toMap()); + String sign = Signature.getSign(toMap(),paySecret); setSign(sign);//把签名数据设置到Sign这个属性中 } - public JsApiPayReqData(String body,String outTradeNo,int totalFee,String spBillCreateIP,String attach){ + public JsApiPayReqData(String appID, String mchID,String paySecret,String notify_url,String body,String outTradeNo,int totalFee,String spBillCreateIP,String attach){ //默认必须设置 - setAppid(WechatConfigure.web_appID); - setMch_id(WechatConfigure.mchID); + setAppid(appID); + setMch_id(mchID); setBody(body); + setNotify_url(notify_url); setOut_trade_no(outTradeNo); setTotal_fee(totalFee); setSpbill_create_ip(spBillCreateIP); @@ -89,7 +92,7 @@ //随机字符串,不长于32 位 setNonce_str(RandomStringGenerator.getRandomStringByLength(32)); //根据API给的签名规则进行签名 【 必须要放在本方法的最后】 - String sign = Signature.getSign(toMap()); + String sign = Signature.getSign(toMap(),paySecret); setSign(sign);//把签名数据设置到Sign这个属性中 } diff --git a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/queryProtocol/JsApiPayReqData.java b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/queryProtocol/JsApiPayReqData.java deleted file mode 100644 index 8784f20..0000000 --- a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/queryProtocol/JsApiPayReqData.java +++ /dev/null @@ -1,295 +0,0 @@ -package com.matrix.component.wechat.externalInterface.protocol.queryProtocol; - - -import com.matrix.component.wechat.externalInterface.common.RandomStringGenerator; -import com.matrix.component.wechat.externalInterface.common.Signature; -import com.matrix.component.wechat.externalInterface.common.WechatConfigure; - -import java.lang.reflect.Field; -import java.util.HashMap; -import java.util.Map; - -/** - * -* 预付订单请求参数 -* @author:姜友瑶 -* @date 2016年10月14日 - */ -public class JsApiPayReqData { - - //每个字段具体的意思请查看API文档 - private String appid = ""; - private String mch_id = ""; - private String device_info = ""; - private String nonce_str = ""; - private String sign = ""; - private String body = ""; - private String detail = ""; - private String attach = ""; - private String out_trade_no = ""; - private String fee_type = ""; - private int total_fee = 0; - /** - * 接收微信支付异步通知回调地址 - */ - private String notify_url = WechatConfigure.PAY_NOTIFY_URL; - private String trade_type = WechatConfigure.TRADE_TYPE_JSAPI; - private String openid = ""; - private String limit_pay = ""; - private String spbill_create_ip = ""; - private String product_id = ""; - private String time_start = ""; - private String time_expire = ""; - private String goods_tag = ""; - private String auth_code = ""; - - - public JsApiPayReqData() { - } - - /** - * @param authCode 这个是扫码终端设备从用户手机上扫取到的支付授权号,这个号是跟用户用来支付的银行卡绑定的,有效期是1分钟 - * @param body 要支付的商品的描述信息,用户会在支付成功页面里看到这个信息 - * @param attach 支付订单里面可以填的附加数据,API会将提交的这个附加数据原样返回 - * @param outTradeNo 商户系统内部的订单号,32个字符内可包含字母, 确保在商户系统唯一 - * @param totalFee 订单总金额,单位为“分”,只能整数 - * @param deviceInfo 商户自己定义的扫码支付终端设备号,方便追溯这笔交易发生在哪台终端设备上 - * @param spBillCreateIP 订单生成的机器IP - * @param timeStart 订单生成时间, 格式为yyyyMMddHHmmss,如2009年12 月25 日9 点10 分10 秒表示为20091225091010。时区为GMT+8 beijing。该时间取自商户服务器 - * @param timeExpire 订单失效时间,格式同上 - * @param goodsTag 商品标记,微信平台配置的商品标记,用于优惠券或者满减使用 - */ - public JsApiPayReqData(String body,String outTradeNo,int totalFee,String spBillCreateIP,String openid,String attach){ - //默认必须设置 - setAppid(WechatConfigure.appID); - setMch_id(WechatConfigure.mchID); - setBody(body); - setOut_trade_no(outTradeNo); - setTotal_fee(totalFee); - setSpbill_create_ip(spBillCreateIP); - setAttach(attach); - //随机字符串,不长于32 位 - setNonce_str(RandomStringGenerator.getRandomStringByLength(32)); - setOpenid(openid); - //根据API给的签名规则进行签名 【 必须要放在本方法的最后】 - String sign = Signature.getSign(toMap()); - setSign(sign);//把签名数据设置到Sign这个属性中 - - } - - public JsApiPayReqData(String body,String outTradeNo,int totalFee,String spBillCreateIP,String attach){ - //默认必须设置 - setAppid(WechatConfigure.web_appID); - setMch_id(WechatConfigure.mchID); - setBody(body); - setOut_trade_no(outTradeNo); - setTotal_fee(totalFee); - setSpbill_create_ip(spBillCreateIP); - setAttach(attach); - //随机字符串,不长于32 位 - setNonce_str(RandomStringGenerator.getRandomStringByLength(32)); - //根据API给的签名规则进行签名 【 必须要放在本方法的最后】 - String sign = Signature.getSign(toMap()); - setSign(sign);//把签名数据设置到Sign这个属性中 - } - - public String getDetail() { - return detail; - } - - public void setDetail(String detail) { - this.detail = detail; - } - - public String getFee_type() { - return fee_type; - } - - public void setFee_type(String fee_type) { - this.fee_type = fee_type; - } - - public String getNotify_url() { - return notify_url; - } - - public void setNotify_url(String notify_url) { - this.notify_url = notify_url; - } - - public String getTrade_type() { - return trade_type; - } - - public void setTrade_type(String trade_type) { - this.trade_type = trade_type; - } - - public String getOpenid() { - return openid; - } - - public void setOpenid(String openid) { - this.openid = openid; - } - - public String getLimit_pay() { - return limit_pay; - } - - public void setLimit_pay(String limit_pay) { - this.limit_pay = limit_pay; - } - - public String getProduct_id() { - return product_id; - } - - public void setProduct_id(String product_id) { - this.product_id = product_id; - } - - public String getAppid() { - return appid; - } - - public void setAppid(String appid) { - this.appid = appid; - } - - public String getMch_id() { - return mch_id; - } - - public void setMch_id(String mch_id) { - this.mch_id = mch_id; - } - - public String getDevice_info() { - return device_info; - } - - public void setDevice_info(String device_info) { - this.device_info = device_info; - } - - public String getNonce_str() { - return nonce_str; - } - - public void setNonce_str(String nonce_str) { - this.nonce_str = nonce_str; - } - - public String getSign() { - return sign; - } - - public void setSign(String sign) { - this.sign = sign; - } - - public String getBody() { - return body; - } - - /** - * - * body最大长度128 - * @author:姜友瑶 - * @param body - * 返回类型 void - * @date 2016年10月13日 - */ - public void setBody(String body) { - - if(body.length()>128){ - body=body.substring(0, 128); - } - this.body = body; - } - - public String getAttach() { - return attach; - } - - public void setAttach(String attach) { - this.attach = attach; - } - - public String getOut_trade_no() { - return out_trade_no; - } - - public void setOut_trade_no(String out_trade_no) { - this.out_trade_no = out_trade_no; - } - - public int getTotal_fee() { - return total_fee; - } - - public void setTotal_fee(int total_fee) { - this.total_fee = total_fee; - } - - public String getSpbill_create_ip() { - return spbill_create_ip; - } - - public void setSpbill_create_ip(String spbill_create_ip) { - this.spbill_create_ip = spbill_create_ip; - } - - public String getTime_start() { - return time_start; - } - - public void setTime_start(String time_start) { - this.time_start = time_start; - } - - public String getTime_expire() { - return time_expire; - } - - public void setTime_expire(String time_expire) { - this.time_expire = time_expire; - } - - public String getGoods_tag() { - return goods_tag; - } - - public void setGoods_tag(String goods_tag) { - this.goods_tag = goods_tag; - } - - public String getAuth_code() { - return auth_code; - } - - public void setAuth_code(String auth_code) { - this.auth_code = auth_code; - } - - public Map<String,Object> toMap(){ - Map<String,Object> map = new HashMap<String, Object>(); - Field[] fields = this.getClass().getDeclaredFields(); - for (Field field : fields) { - Object obj; - try { - obj = field.get(this); - if(obj!=null){ - map.put(field.getName(), obj); - } - } catch (IllegalArgumentException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - } - return map; - } - -} diff --git a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/queryProtocol/ScanPayQueryReqData.java b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/queryProtocol/ScanPayQueryReqData.java index 42cc0c9..37855ba 100644 --- a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/queryProtocol/ScanPayQueryReqData.java +++ b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/queryProtocol/ScanPayQueryReqData.java @@ -37,10 +37,10 @@ //-------------------------------------------------------------------- //微信分配的公众号ID(开通公众号之后可以获取到) - setAppid(WechatConfigure.appID); + //setAppid(WechatConfigure.appID); //微信支付分配的商户号ID(开通公众号的微信支付功能之后可以获取到) - setMch_id(WechatConfigure.mchID); + // setMch_id(WechatConfigure.mchID); //transaction_id是微信系统为每一笔支付交易分配的订单号,通过这个订单号可以标识这笔交易,它由支付订单API支付成功时返回的数据里面获取到。 setTransaction_id(transactionID); @@ -52,7 +52,7 @@ setNonce_str(RandomStringGenerator.getRandomStringByLength(32)); //根据API给的签名规则进行签名 - String sign = Signature.getSign(toMap()); + //String sign = Signature.getSign(toMap()); setSign(sign);//把签名数据设置到Sign这个属性中 diff --git a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/refundProtocol/RefundReqData.java b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/refundProtocol/RefundReqData.java index 6aa739c..adff5d8 100644 --- a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/refundProtocol/RefundReqData.java +++ b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/refundProtocol/RefundReqData.java @@ -40,13 +40,13 @@ * @param opUserID 操作员帐号, 默认为商户号 * @param refundFeeType 货币类型,符合ISO 4217标准的三位字母代码,默认为CNY(人民币) */ - public RefundReqData(String outTradeNo,String outRefundNo,int totalFee,int refundFee,String opUserID){ + public RefundReqData(String mchID,String appID,String paySecret ,String outTradeNo,String outRefundNo,int totalFee,int refundFee,String opUserID){ //微信分配的公众号ID(开通公众号之后可以获取到) - setAppid(WechatConfigure.appID); + setAppid(mchID); //微信支付分配的商户号ID(开通公众号的微信支付功能之后可以获取到) - setMch_id(WechatConfigure.mchID); + setMch_id(appID); //transaction_id是微信系统为每一笔支付交易分配的订单号,通过这个订单号可以标识这笔交易,它由支付订单API支付成功时返回的数据里面获取到。 //setTransaction_id(transactionID); @@ -69,7 +69,7 @@ setNonce_str(RandomStringGenerator.getRandomStringByLength(32)); //根据API给的签名规则进行签名 - String sign = Signature.getSign(toMap()); + String sign = Signature.getSign(toMap(),paySecret); setSign(sign);//把签名数据设置到Sign这个属性中 } diff --git a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/rsaProtocal/JsApiRSAReqData.java b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/rsaProtocal/JsApiRSAReqData.java deleted file mode 100644 index e694b90..0000000 --- a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/rsaProtocal/JsApiRSAReqData.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.matrix.component.wechat.externalInterface.protocol.rsaProtocal; - - -import com.matrix.component.wechat.externalInterface.common.RandomStringGenerator; -import com.matrix.component.wechat.externalInterface.common.Signature; -import com.matrix.component.wechat.externalInterface.common.WechatConfigure; - -import java.lang.reflect.Field; -import java.util.HashMap; -import java.util.Map; - -/** - * 公钥请求类 - * - * @author wzy - */ -public class JsApiRSAReqData { - - private String mch_id; - private String nonce_str; - private String sign; - private String sign_type; - - - public JsApiRSAReqData() { - this.mch_id = WechatConfigure.mchID; - this.nonce_str = RandomStringGenerator.getRandomStringByLength(32); - this.sign = Signature.getSign(toMap()); - this.sign_type = "MD5"; - } - - public Map<String, Object> toMap() { - Map<String, Object> map = new HashMap<String, Object>(); - Field[] fields = this.getClass().getDeclaredFields(); - for (Field field : fields) { - Object obj; - try { - obj = field.get(this); - if (obj != null) { - map.put(field.getName(), obj); - } - } catch (IllegalArgumentException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - } - return map; - } -} diff --git a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/service/BaseService.java b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/service/BaseService.java index 1b9620d..8f9a680 100644 --- a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/service/BaseService.java +++ b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/service/BaseService.java @@ -38,4 +38,8 @@ public void setServiceRequest(IServiceRequest request){ serviceRequest = request; } + + public IServiceRequest getServiceRequest() { + return serviceRequest; + } } diff --git a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/service/JsApiGetPublicKeyService.java b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/service/JsApiGetPublicKeyService.java deleted file mode 100644 index 173f31f..0000000 --- a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/service/JsApiGetPublicKeyService.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.matrix.component.wechat.externalInterface.service; - -import com.matrix.component.wechat.externalInterface.common.WechatConfigure; -import com.matrix.component.wechat.externalInterface.protocol.payComProtocol.JsApiPayComReqData; -import com.matrix.component.wechat.externalInterface.protocol.rsaProtocal.JsApiRSAReqData; - -public class JsApiGetPublicKeyService extends BaseService { - - public JsApiGetPublicKeyService() throws ClassNotFoundException, IllegalAccessException, InstantiationException { - super(WechatConfigure.PUBLIC_KEY_GET_API, WechatConfigure.HttpsRequestClassName2); - } - - public String request(JsApiRSAReqData jsApiRSAReqData) throws Exception { - - String responseString = sendPost(jsApiRSAReqData); - - return responseString; - } -} diff --git a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/weixinUtil/WeixinServiceUtil.java b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/weixinUtil/WeixinServiceUtil.java index 771333f..7a00022 100644 --- a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/weixinUtil/WeixinServiceUtil.java +++ b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/weixinUtil/WeixinServiceUtil.java @@ -1,5 +1,6 @@ package com.matrix.component.wechat.externalInterface.weixinUtil; +import com.matrix.component.wechat.externalInterface.common.HttpsRequest2; import com.matrix.core.exception.GlobleException; import com.matrix.core.tools.LogUtil; import com.matrix.core.tools.StringUtils; @@ -18,7 +19,10 @@ import com.matrix.component.wechat.externalInterface.service.JsApiPayComService; import com.matrix.component.wechat.externalInterface.service.RefundService; import com.matrix.component.wechat.externalInterface.service.ScanPayQueryService; +import com.matrix.system.common.bean.BusParameterSettings; import com.matrix.system.common.constance.AppConstance; +import com.matrix.system.common.dao.BusParameterSettingsDao; +import com.matrix.system.common.interceptor.HostInterceptor; import com.matrix.system.shopXcx.api.tools.WxShopOrderUtil; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; @@ -43,6 +47,13 @@ @Autowired private WxShopOrderUtil wxShopOrderUtil; + + @Autowired + BusParameterSettingsDao busParameterSettingsDao; + + + + /** * 支付"175.9.82.254" @@ -62,7 +73,20 @@ // 创建微信支付预付接口 JsApiPayBusiness jsApiPayBusiness = new JsApiPayBusiness(); String idAddr = getIpAddr(WebUtil.getRequest()); - JsApiPayReqData jsApiPayReqData = new JsApiPayReqData(desc, outTradeNo, price, idAddr, openId, attach); + + Long companyId=HostInterceptor.getCompanyId(); + + BusParameterSettings mchID = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_APPID, companyId); + BusParameterSettings paySecret = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_SECRET, companyId); + BusParameterSettings notifyUrl = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_NOTIFYURL, companyId); + + BusParameterSettings appId = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.MINIPROGRAM_APPID, companyId); + + JsApiPayReqData jsApiPayReqData = new JsApiPayReqData(appId.getParamValue(),mchID.getParamValue(), + paySecret.getParamValue(), + notifyUrl.getParamValue(), + desc, outTradeNo, price, idAddr, openId, attach); + // 创建预付订单并返回请求结果 JsApiPayResData result = jsApiPayBusiness.createPrapareOrder(jsApiPayReqData); // 把预付订单的信息存放在request域中 @@ -71,7 +95,7 @@ LogUtil.info("#---签名信息:return_msg = {}" , result.getReturn_msg()); if (result.getReturn_code().equals("SUCCESS")) { // 请求成功, 构建BrandWCPayRequest发起支付需要的参数 - BrandWCPayRequestData payData = new BrandWCPayRequestData(result.getPrepay_id()); + BrandWCPayRequestData payData = new BrandWCPayRequestData(result.getPrepay_id(),appId.getParamValue(),paySecret.getParamValue()); WebUtil.getRequest().setAttribute("payData", payData); return payData; }else{ @@ -115,7 +139,6 @@ * @param desc 描述 * @param outTradeNo 提现申请编号 * @param totalFee 提现金额(分) - * @param spBillCreateIP 调用接口的IP * @param openid * @return */ @@ -125,7 +148,12 @@ try { JsApiPayBusiness jsApiPayBusiness = new JsApiPayBusiness(); // TODO 企业付款 - JsApiPayComReqData jsApiPayComReqData=new JsApiPayComReqData("","",0,"","",""); + Long companyId=HostInterceptor.getCompanyId(); + BusParameterSettings mchID = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_APPID, companyId); + BusParameterSettings paySecret = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_SECRET, companyId); + + + JsApiPayComReqData jsApiPayComReqData=new JsApiPayComReqData(mchID.getParamValue(),paySecret.getParamValue(),"","",0,"","",""); JsApiPayComService jsApiPayComService=new JsApiPayComService(); result = jsApiPayBusiness.payComOrder(jsApiPayComService, jsApiPayComReqData); LogUtil.info("#提现,企业付款到个人---result:{}",result); @@ -155,15 +183,25 @@ int refundFee, String opUserID){ LogUtil.info("#---outTradeNo:{}#---outRefundNo:{}#---totalFee:{}#---refundFee:{}", outTradeNo,outRefundNo,totalFee,refundFee); + BusParameterSettings mchID = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_APPID, HostInterceptor.getCompanyId()); if(opUserID==null){ - opUserID=WechatConfigure.mchID; + opUserID=mchID.getParamValue(); } RefundResData result=null; boolean flag=false; try { JsApiPayBusiness jsApiPayBusiness = new JsApiPayBusiness(); - RefundReqData refundReqData=new RefundReqData(outTradeNo, outRefundNo, totalFee, refundFee,opUserID); + Long companyId=HostInterceptor.getCompanyId(); + BusParameterSettings paySecret = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_SECRET, companyId); + BusParameterSettings appId = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_APPID, companyId); + BusParameterSettings certLocalPath = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_CERTLOCAL_PATH, companyId); + + RefundReqData refundReqData=new RefundReqData(mchID.getParamValue(),appId.getParamValue(),paySecret.getParamValue(), outTradeNo, outRefundNo, totalFee, refundFee,opUserID); RefundService refundService=new RefundService(); + HttpsRequest2 request2= (HttpsRequest2) refundService.getServiceRequest(); + request2.setCertLocalPath(certLocalPath.getParamValue()); + request2.setMchId(mchID.getParamValue()); + result = jsApiPayBusiness.refundComOrder(refundService, refundReqData); LogUtil.info("#退款,企业付款到个人---result:{}",result); //如果返回余额不足时 @@ -191,12 +229,12 @@ * @return */ public String getIpAddr(HttpServletRequest request) { - String ip = request.getHeader("x-forwarded-for"); - /* if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { - ip = request.getHeader("Proxy-Client-IP"); - } - if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { - ip = request.getHeader("WL-Proxy-Client-IP"); + String ip = request.getHeader("x-forwarded-for"); + /* if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); } */ if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); diff --git a/zq-erp/src/main/java/com/matrix/config/RabbitMqConfig.java b/zq-erp/src/main/java/com/matrix/config/RabbitMqConfig.java index 6ff44d6..2effc80 100644 --- a/zq-erp/src/main/java/com/matrix/config/RabbitMqConfig.java +++ b/zq-erp/src/main/java/com/matrix/config/RabbitMqConfig.java @@ -5,6 +5,7 @@ import com.matrix.component.rabbitmq.RabiitMqTemplate; import com.matrix.component.rabbitmq.RabiitMqTemplateFactory; import com.matrix.system.shopXcx.mqTask.*; +import com.matrix.system.wechart.templateMsg.Task.UniformMsgSentTask; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -48,6 +49,11 @@ return new TemplateMsgTask(); } + @Bean + UniformMsgSentTask UniformMsgSentTask(){ + return new UniformMsgSentTask(); + } + @Bean OrderOutSotoreTask OrderOutSotoreTask(){ return new OrderOutSotoreTask(); @@ -67,10 +73,10 @@ //注册RabbitMq任务 taskList.add(new MqTask(MQ_EXCHANGE_A + evn, MQTaskRouting.CREATE_VIP + evn, MQTaskRouting.CREATE_VIP + evn, VipCreateTask())); - taskList.add(new MqTask(MQ_EXCHANGE_A + "cf", MQTaskRouting.CREATE_VIP + evn, MQTaskRouting.CREATE_VIP + evn, null)); taskList.add(new MqTask(MQ_EXCHANGE_A + evn, MQTaskRouting.CREATE_ORDER + evn,MQTaskRouting.CREATE_ORDER + evn,OrderrCreateTask())); taskList.add(new MqTask(MQ_EXCHANGE_A + evn, MQTaskRouting.SEND_TEMPLATE_MSG + evn,MQTaskRouting.SEND_TEMPLATE_MSG + evn, TemplateMsgTask())); taskList.add(new MqTask(MQ_EXCHANGE_A + evn, MQTaskRouting.ORDER_OUT_SOTORE + evn,MQTaskRouting.ORDER_OUT_SOTORE + evn, OrderOutSotoreTask())); + taskList.add(new MqTask(MQ_EXCHANGE_A + evn, MQTaskRouting.SEND_UNIFORM_TEMPLATE_MSG + evn,MQTaskRouting.SEND_UNIFORM_TEMPLATE_MSG + evn, UniformMsgSentTask())); rabiitMqTemplate.binding(taskList); diff --git a/zq-erp/src/main/java/com/matrix/core/tools/rr/GlueFactory.java b/zq-erp/src/main/java/com/matrix/core/tools/rr/GlueFactory.java index 5f0f32f..d46fe06 100644 --- a/zq-erp/src/main/java/com/matrix/core/tools/rr/GlueFactory.java +++ b/zq-erp/src/main/java/com/matrix/core/tools/rr/GlueFactory.java @@ -104,4 +104,27 @@ throw new IllegalArgumentException(">>>>>>>>>>> xxl-glue, loadNewInstance error, instance is null"); } + + /** + * 根据字符串获取几个java实例 + * @param codeSource + * @return + * @throws Exception + */ + public Object loadInstance(String codeSource) throws Exception{ + if (codeSource!=null && codeSource.trim().length()>0) { + Class<?> clazz = groovyClassLoader.parseClass(codeSource); + if (clazz != null) { + Object instance = clazz.newInstance(); + if (instance!=null) { + this.injectService(instance); + return instance; + } + } + } + throw new IllegalArgumentException(">>>>>>>>>>> xxl-glue, loadNewInstance error, instance is null"); + } + + + } diff --git a/zq-erp/src/main/java/com/matrix/system/app/action/ApiServiceOrderAction.java b/zq-erp/src/main/java/com/matrix/system/app/action/ApiServiceOrderAction.java index e0c59eb..59424ef 100644 --- a/zq-erp/src/main/java/com/matrix/system/app/action/ApiServiceOrderAction.java +++ b/zq-erp/src/main/java/com/matrix/system/app/action/ApiServiceOrderAction.java @@ -142,7 +142,7 @@ } if (!vipInfo.getPassWord().equals(serviceOrderDto.getPassword())) { - return AjaxResult.buildSuccessInstance("资金密码错误"); + return AjaxResult.buildFailInstance("资金密码错误"); } SysProjServices sysProjServices = new SysProjServices(); diff --git a/zq-erp/src/main/java/com/matrix/system/common/constance/AppConstance.java b/zq-erp/src/main/java/com/matrix/system/common/constance/AppConstance.java index b971f6b..56216fc 100644 --- a/zq-erp/src/main/java/com/matrix/system/common/constance/AppConstance.java +++ b/zq-erp/src/main/java/com/matrix/system/common/constance/AppConstance.java @@ -589,4 +589,48 @@ public static final String QSFY = "QSFY"; + /** + * 小程序APPID + */ + public static final String MINIPROGRAM_APPID = "miniprogramAppid"; + /** + * 小程序Secret + */ + public static final String MINIPROGRAM_SECRET = "miniprogramSecret"; + /** + * 公众号APPID + */ + public static final String GZH_APPID = "gzhAppId"; + + /** + * 微信商户号 + */ + public static final String WECHARPAY_APPID = "wecharPayAppid"; + /** + * 支付秘钥 + */ + public static final String WECHARPAY_SECRET = "wecharPaySecret"; + + /** + * 支付通知地址 + */ + public static final String WECHARPAY_NOTIFYURL = "wecharPaynotifyUrl"; + /** + * 支付证书地址 + */ + public static final String WECHARPAY_CERTLOCAL_PATH = "certLocalPath"; + + + + + + + + + + + + + + } diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjServicesServiceImpl.java b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjServicesServiceImpl.java index 9749835..cfb58f7 100644 --- a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjServicesServiceImpl.java +++ b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysProjServicesServiceImpl.java @@ -1,5 +1,7 @@ package com.matrix.system.hive.service.imp; +import com.alibaba.fastjson.JSONObject; +import com.matrix.component.rabbitmq.RabiitMqTemplate; import com.matrix.core.constance.MatrixConstance; import com.matrix.core.exception.GlobleException; import com.matrix.core.pojo.PaginationVO; @@ -16,9 +18,11 @@ import com.matrix.system.hive.plugin.util.MoneyUtil; import com.matrix.system.hive.pojo.MyBeauticianCount; import com.matrix.system.hive.service.*; +import com.matrix.system.shopXcx.mqTask.MQTaskRouting; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -97,6 +101,13 @@ WarehouseDao warehouseDao; @Resource private ShoppingGoodsService shoppingGoodsService; + + @Autowired + private RabiitMqTemplate rabiitMqTemplate; + + @Value("${evn}") + private String evn; + /** * 新增服务单 jyy @@ -561,10 +572,15 @@ if (!projServices.getState().equals(Dictionary.SERVICE_STATU_FWWC)) { throw new GlobleException("该服务单状态为" + projServices.getState() + ",不可以进行当前操作!"); } else { - projServices.setState(Dictionary.SERVICE_STATU_FFJS); projServices.setConsumeTime(new Date()); - return sysProjServicesDao.update(projServices); + int result=sysProjServicesDao.update(projServices); + //发送微信公众号提醒 + JSONObject param=new JSONObject(); + param.put("companyId",projServices.getCompanyId()); + param.put("serviceId",projServices.getId()); + rabiitMqTemplate.sendMsg(MQTaskRouting.SEND_UNIFORM_TEMPLATE_MSG+evn,param.toJSONString()); + return result; } } diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysVipInfoServiceImpl.java b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysVipInfoServiceImpl.java index b9db73c..75f839a 100644 --- a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysVipInfoServiceImpl.java +++ b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysVipInfoServiceImpl.java @@ -575,6 +575,7 @@ vipInfoDetailVo.setBirthday(sysVipInfo.getBirthday1()); vipInfoDetailVo.setPassword(sysVipInfo.getPassWord()); vipInfoDetailVo.setPhoto(sysVipInfo.getPhoto()); + vipInfoDetailVo.setVipNo(sysVipInfo.getVipNo()); List<SysVipLabel> labels = sysVipLabelDao.selectByVipId(sysVipInfo.getId()); vipInfoDetailVo.setLabels(labels); diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/action/ShopRefundRecordAction.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/action/ShopRefundRecordAction.java index 4b25528..c790239 100644 --- a/zq-erp/src/main/java/com/matrix/system/shopXcx/action/ShopRefundRecordAction.java +++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/action/ShopRefundRecordAction.java @@ -464,16 +464,14 @@ int reMoney = b1.multiply(bb).intValue(); LogUtil.info("退款退款金额{}", reMoney); - //Double refundMoney = 0.1 * 100; - //用户ID - String userId = WechatConfigure.mchID; + if (isDebug) { - boolean b = weixinServiceUtil.comRefund(orderNo, refundNo, 1, 1, userId); + boolean b = weixinServiceUtil.comRefund(orderNo, refundNo, 1, 1, null); flag = b; } else { LogUtil.info("开始调用退款接口。。。退款编号为{}", refundNo); - boolean b = weixinServiceUtil.comRefund(orderNo, refundNo, orMoney, reMoney, userId); + boolean b = weixinServiceUtil.comRefund(orderNo, refundNo, orMoney, reMoney, null); flag = b; } diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WXShopOrderAction.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WXShopOrderAction.java index d940ea1..54ca9f5 100644 --- a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WXShopOrderAction.java +++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WXShopOrderAction.java @@ -10,6 +10,7 @@ import com.matrix.core.pojo.AjaxResult; import com.matrix.core.tools.StringUtils; import com.matrix.system.common.constance.AppConstance; +import com.matrix.system.common.interceptor.HostInterceptor; import com.matrix.system.constance.Dictionary; import com.matrix.system.hive.bean.ShoppingGoods; import com.matrix.system.hive.dao.ShoppingGoodsDao; diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxCommonAction.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxCommonAction.java index 568c875..cb91885 100644 --- a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxCommonAction.java +++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxCommonAction.java @@ -7,7 +7,10 @@ import com.matrix.component.wechat.externalInterface.common.Signature; import com.matrix.component.wechat.externalInterface.common.Util; import com.matrix.component.wechat.externalInterface.protocol.queryProtocol.NotifyData; +import com.matrix.system.common.bean.BusParameterSettings; import com.matrix.system.common.constance.AppConstance; +import com.matrix.system.common.dao.BusParameterSettingsDao; +import com.matrix.system.common.interceptor.HostInterceptor; import com.matrix.system.hive.bean.SysVipInfo; import com.matrix.system.hive.dao.SysVipInfoDao; import com.matrix.system.shopXcx.bean.ShopActivitiesGroupJoin; @@ -75,6 +78,11 @@ @Autowired private SysVipInfoDao sysVipInfoDao; + @Autowired + BusParameterSettingsDao busParameterSettingsDao; + + + @Value("${evn}") private String evn; /** @@ -86,7 +94,7 @@ * @throws Exception */ @Transactional(rollbackFor = Exception.class) - @RequestMapping(value = "/wxpayCallback") + @RequestMapping(value = "/wxapi/wxpayCallback") public void payCallBack(HttpServletResponse response, HttpServletRequest request) throws IOException { LogUtil.info("微信支付回调start...."); @@ -111,7 +119,8 @@ // 返回状态码 SUCCESS/FAIL if (AppConstance.CODE_SUCCESS.equals(data.getReturn_code())) { // 校验签名 - if (Signature.checkIsSignValidFromResponseString(notityXml.toString())) { + BusParameterSettings paySecret = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_SECRET, HostInterceptor.getCompanyId()); + if (Signature.checkIsSignValidFromResponseString(notityXml.toString(),paySecret.getParamValue())) { // 校验业务结果 if (AppConstance.CODE_SUCCESS.equals(data.getResult_code())) { // 返回SUCCESS报文 diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/service/impl/WxShopRefundRecordServiceImpl.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/service/impl/WxShopRefundRecordServiceImpl.java index 807ab9d..6030d3e 100644 --- a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/service/impl/WxShopRefundRecordServiceImpl.java +++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/service/impl/WxShopRefundRecordServiceImpl.java @@ -78,14 +78,13 @@ //Double refundMoney = 0.1 * 100; //用户ID - String userId = WechatConfigure.mchID; if (isDebug) { - boolean b = weixinServiceUtil.comRefund(orderNo, refundNo, 1, 1, userId); + boolean b = weixinServiceUtil.comRefund(orderNo, refundNo, 1, 1, null); flag = b; } else { LogUtil.info("开始调用退款接口。。。退款编号为", refundNo); - boolean b = weixinServiceUtil.comRefund(orderNo, refundNo, orMoney, reMoney, userId); + boolean b = weixinServiceUtil.comRefund(orderNo, refundNo, orMoney, reMoney, null); flag = b; } diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/bean/ShopWxtemplateMsg.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/bean/ShopWxtemplateMsg.java index 4c5e2d4..390f897 100644 --- a/zq-erp/src/main/java/com/matrix/system/shopXcx/bean/ShopWxtemplateMsg.java +++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/bean/ShopWxtemplateMsg.java @@ -40,8 +40,15 @@ */ private Integer status; + /** + * 模板类型 1,公众号,2,小程序 + */ + private Integer tempType; - + /** + * 取数模板类 + */ + private String templateClass; /** * 模板备注 @@ -86,24 +93,76 @@ } } - public void buildDicMap(Object value) { - if (value != null) { - STATUS[] statusArray = STATUS.values(); - for (STATUS s : statusArray) { - if (s.getCode().equals(value)) { - getDicMap().put("status", s.getName()); - } - } - } - } + public enum TempType { + + MP("公众号", 1), + + APP("小程序", 2); + + private TempType(String name, int code) { + this.name = name; + this.code = code; + } + + private String name; + private Integer code; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + } + + + public void setStatus(Integer status) { - buildDicMap(status); - - buildDicMap("status"); - + if (status != null) { + STATUS[] statusArray = STATUS.values(); + for (STATUS s : statusArray) { + if (s.getCode().equals(status)) { + getDicMap().put("status", s.getName()); + } + } + } this.status = status; } + public String getTemplateClass() { + return templateClass; + } + + public void setTemplateClass(String templateClass) { + + this.templateClass = templateClass; + } + + public Integer getTempType() { + + return tempType; + } + + public void setTempType(Integer tempType) { + if (tempType != null) { + TempType[] statusArray = TempType.values(); + for (TempType s : statusArray) { + if (s.getCode().equals(tempType)) { + getDicMap().put("tempType", s.getName()); + } + } + } + this.tempType = tempType; + } public Integer getId() { return id; diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/dao/ShopWxtemplateMsgDao.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/dao/ShopWxtemplateMsgDao.java index 96f20f4..92b583b 100644 --- a/zq-erp/src/main/java/com/matrix/system/shopXcx/dao/ShopWxtemplateMsgDao.java +++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/dao/ShopWxtemplateMsgDao.java @@ -26,7 +26,7 @@ public int deleteById(Integer id); - public ShopWxtemplateMsg selectByCode(Integer code); + public ShopWxtemplateMsg selectByCode(@Param("code") Integer code, @Param("companyId") Long companyId); public int deleteByModel(@Param("record") ShopWxtemplateMsg shopWxtemplateMsg); diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/MQTaskRouting.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/MQTaskRouting.java index 68c94d1..861de97 100644 --- a/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/MQTaskRouting.java +++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/MQTaskRouting.java @@ -12,6 +12,12 @@ * 发送微信消息 */ String SEND_TEMPLATE_MSG = "SEND_TEMPLATE_MSG"; + + /** + * 发送小程序统一模板消息 + */ + String SEND_UNIFORM_TEMPLATE_MSG = "SEND_UNIFORM_TEMPLATE_MSG"; + /** * 订单出库 */ diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/VipCreateTask.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/VipCreateTask.java index 5d59638..e650788 100644 --- a/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/VipCreateTask.java +++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/VipCreateTask.java @@ -48,7 +48,7 @@ } else { SysVipInfo vipInfo = new SysVipInfo(); //在备注记下微商城的用户id - vipInfo.setRemark(userInfo.getOpenId()); + vipInfo.setOpenId(userInfo.getOpenId()); vipInfo.setAddr(userInfo.getProvince() + " " + userInfo.getCity()); vipInfo.setPhone(userInfo.getPhoneNumber()); if (userInfo.getGender() != null) { diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/templateMsg/AppointmentSuccess.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/templateMsg/AppointmentSuccess.java index 69ae1e6..3dbd6f4 100644 --- a/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/templateMsg/AppointmentSuccess.java +++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/mqTask/templateMsg/AppointmentSuccess.java @@ -48,7 +48,7 @@ SysShopInfo shopInfo = shopInfoDao.selectById(onlinebooking.getShopId()); //获取模板id - ShopWxtemplateMsg wxtemplateMsg = wxtemplateMsgDao.selectByCode(TemplateMsgType.APPOINTMENT_SUCCESS.getCode()); + ShopWxtemplateMsg wxtemplateMsg = wxtemplateMsgDao.selectByCode(TemplateMsgType.APPOINTMENT_SUCCESS.getCode(), 17L); String page = "pages/yuyue/yyInfo?id=" + orderId + "&model=1"; diff --git a/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/MsgDemo3.java b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/MsgDemo3.java new file mode 100644 index 0000000..5531bf7 --- /dev/null +++ b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/MsgDemo3.java @@ -0,0 +1,35 @@ +package com.matrix.system.wechart.templateMsg; + +import com.alibaba.fastjson.JSONObject; +import com.matrix.component.tools.HttpClientUtil; +import com.matrix.core.pojo.AjaxResult; +import com.matrix.system.hive.plugin.util.HttpUtils; +import com.matrix.system.shopXcx.api.WeChatGzhApiTools; +import com.matrix.system.wechart.templateMsg.Task.UniformMsgSentTask; +import com.rabbitmq.client.Delivery; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.io.IOException; + +@Controller +@RequestMapping(value = "test3") +public class MsgDemo3 { + + + @Autowired + UniformMsgSentTask uniformMsgSentTask; + + @RequestMapping("/template") + @ResponseBody + public AjaxResult template() throws IOException { + + uniformMsgSentTask.handle(null,null); + return AjaxResult.buildSuccessInstance("1"); + + } + + +} diff --git a/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/TemplateMessageBulder.java b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/TemplateMessageBulder.java new file mode 100644 index 0000000..4c0bafa --- /dev/null +++ b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/TemplateMessageBulder.java @@ -0,0 +1,19 @@ +package com.matrix.system.wechart.templateMsg.Task; + +import com.matrix.system.wechart.templateMsg.UniformMsgPojo; + +import java.util.Map; + +/** + * 动态构建消息主体内容 + * @author jyy + * + */ +public interface TemplateMessageBulder { + /** + * * 返回的map中 如果包含错误消息用error属性来表示 + * @param param + * @return + */ + Map buildMsg(Map param); +} diff --git a/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/UniformMsgSentTask.java b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/UniformMsgSentTask.java new file mode 100644 index 0000000..7094fe9 --- /dev/null +++ b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/UniformMsgSentTask.java @@ -0,0 +1,120 @@ +package com.matrix.system.wechart.templateMsg.Task; + + +import com.alibaba.fastjson.JSONObject; +import com.matrix.biz.bean.BizUser; +import com.matrix.biz.service.BizUserService; +import com.matrix.component.tools.HttpClientUtil; +import com.matrix.core.pojo.AjaxResult; +import com.matrix.core.tools.LogUtil; +import com.matrix.core.tools.rr.GlueFactory; +import com.matrix.system.common.bean.BusParameterSettings; +import com.matrix.system.common.constance.AppConstance; +import com.matrix.system.common.dao.BusParameterSettingsDao; +import com.matrix.system.constance.Dictionary; +import com.matrix.system.hive.bean.SysProjServices; +import com.matrix.system.hive.bean.SysVipInfo; +import com.matrix.system.hive.dao.SysProjServicesDao; +import com.matrix.system.hive.dao.SysShopInfoDao; +import com.matrix.system.hive.dao.SysVipInfoDao; +import com.matrix.system.shopXcx.api.WeChatGzhApiTools; +import com.matrix.system.shopXcx.bean.ShopWxtemplateMsg; +import com.matrix.system.shopXcx.dao.ShopWxtemplateMsgDao; +import com.matrix.system.wechart.templateMsg.GzhTemplateMessagePojo; +import com.matrix.system.wechart.templateMsg.TemplateNameConstance; +import com.matrix.system.wechart.templateMsg.UniformMsgPojo; +import com.rabbitmq.client.DeliverCallback; +import com.rabbitmq.client.Delivery; +import org.apache.commons.collections.map.HashedMap; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +/** + * 小程序统一消息模板消息发送提醒 + * @author jyy + */ +@Component +public class UniformMsgSentTask implements DeliverCallback { + + @Autowired + private ShopWxtemplateMsgDao shopWxtemplateMsgDao; + + @Autowired + private BusParameterSettingsDao busParameterSettingsDao; + + /** + * 发送模板消息需要传JSONO字符串作为格式 + * 例如:{"companyId":17} + * companyId 是必须属性 + * @param consumerTag + * @param message + * @throws IOException + */ + @Override + public void handle(String consumerTag, Delivery message) throws IOException { + try { + + + String messages = new String(message.getBody(), "UTF-8"); + JSONObject messageJsonParam=JSONObject.parseObject(messages); + + if(!messageJsonParam.containsKey("companyId")){ + LogUtil.error("小程序消息推送参数格式异常发送模板消息需要传JSONO字符串作为格式 例如:{\"companyId\":17} companyId 是必须属性"); + return; + } + + Long companyId = Long.parseLong( messageJsonParam.get("companyId").toString()); + + //获取公司微信配置参数 + BusParameterSettings xcxAppId = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.MINIPROGRAM_APPID, companyId); + BusParameterSettings xcxSecret = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.MINIPROGRAM_SECRET, companyId); + BusParameterSettings gzhAppid = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.GZH_APPID, companyId); + //获取消息模板 + ShopWxtemplateMsg template = shopWxtemplateMsgDao.selectByCode(TemplateNameConstance.GZH_YYTX,companyId); + //校验参数 + if(xcxAppId==null||xcxSecret==null||gzhAppid==null||template==null){ + LogUtil.error("小程序消息推送配置缺失xcxAppId="+xcxAppId+";xcxSecret="+xcxSecret+";gzhAppid="+gzhAppid+";template="+template); + return; + } + + //获取模板动态构建类 + TemplateMessageBulder templateMessageBulder = (TemplateMessageBulder) GlueFactory.getInstance().loadInstance(template.getTemplateClass()); + //为模板动态类装备必要的参数 + Map<String, Object> bulderParam = new HashedMap(); + bulderParam.put("gzhAppid", gzhAppid.getParamValue()); + bulderParam.put("template_id", template.getUuid()); + bulderParam.put("messageJsonParam", messageJsonParam); + + + //调用模板计算出消息体 + Map msgResult = templateMessageBulder.buildMsg(bulderParam); + + if(msgResult.containsKey("error")){ + //错误消息处理 + LogUtil.error("模板消息发送失败:"+msgResult.get("error")); + return; + }else{ + //正常返回消息 + List msgList = (List) msgResult.get("msgList"); + //获取acceToken + String ACCESS_TOKEN = WeChatGzhApiTools.getAccessToken(xcxAppId.getParamValue(), xcxSecret.getParamValue()); + String url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token=ACCESS_TOKEN".replaceAll("ACCESS_TOKEN", ACCESS_TOKEN); + for (Object msg : msgList) { + UniformMsgPojo uniformMsgPojo = (UniformMsgPojo) msg; + //推送消息到微信 + JSONObject result = HttpClientUtil.sendPostWithJson(url, JSONObject.toJSON(uniformMsgPojo).toString()); + //微信返回值 + LogUtil.debug("微信小程序模板消息推送结果:" + result.toString()); + } + } + + } catch (Exception e) { + LogUtil.error("消费者执行异常", e); + } + + } +} diff --git a/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/DefaultTemplateMessageBulder.java b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/DefaultTemplateMessageBulder.java new file mode 100644 index 0000000..d917a1e --- /dev/null +++ b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/Task/messageBulderDemo/DefaultTemplateMessageBulder.java @@ -0,0 +1,99 @@ +package com.matrix.system.wechart.templateMsg.Task.messageBulderDemo; + +import com.alibaba.fastjson.JSONObject; +import com.matrix.biz.bean.BizUser; +import com.matrix.biz.dao.BizUserDao; +import com.matrix.core.tools.DateUtil; +import com.matrix.core.tools.StringUtils; +import com.matrix.system.hive.bean.SysBeauticianState; +import com.matrix.system.hive.bean.SysProjServices; +import com.matrix.system.hive.bean.SysVipInfo; +import com.matrix.system.hive.dao.SysBeauticianStateDao; +import com.matrix.system.hive.dao.SysProjServicesDao; +import com.matrix.system.hive.dao.SysVipInfoDao; +import com.matrix.system.wechart.templateMsg.GzhTemplateMessagePojo; +import com.matrix.system.wechart.templateMsg.Task.TemplateMessageBulder; +import com.matrix.system.wechart.templateMsg.UniformMsgPojo; +import io.swagger.models.auth.In; +import org.apache.commons.collections.map.HashedMap; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 某个公司客户的定制消息模板 + */ +@Component +public class DefaultTemplateMessageBulder implements TemplateMessageBulder { + + @Autowired + SysProjServicesDao projServicesDao; + + @Autowired + SysVipInfoDao vipInfoDao; + + @Autowired + private SysBeauticianStateDao beauticianStateDao; + + + + @Override + public Map buildMsg(Map param) { + + //返回参数 + Map builParam=new HashedMap(); + + + //获取基础公共参数 + String gzhAppid= (String) param.get("gzhAppid"); + String template_id= (String) param.get("template_id"); + //触发点传送的json参数 + JSONObject messageJsonParam= (JSONObject) param.get("messageJsonParam"); + + Long serviceId= (Long) messageJsonParam.get("serviceId"); + + + //构建消息主体 + SysProjServices sysProjServices = projServicesDao.selectById(serviceId); + + + //补充服务单扩展信息=============== + List<SysBeauticianState> beauticianStateList = beauticianStateDao.selectBySerIds(sysProjServices.getId()); + + SysVipInfo vipInfo=vipInfoDao.selectById(sysProjServices.getVipId()); + String touser= vipInfo.getOpenId(); + if(StringUtils.isBlank(touser)){ + builParam.put("error","未获取到"+vipInfo.getVipName()+"用户小程序openid"); + return builParam; + } + + String time= DateUtil.dateFormatStr(sysProjServices.getConsumeTime(),DateUtil.DATE_FORMAT_MM); + List msgList=new ArrayList(); + //如果一个项目存在多个护理项目则发送多次消息 + for (SysBeauticianState beauticianState:beauticianStateList){ + UniformMsgPojo uniformMsgPojo=new UniformMsgPojo(); + GzhTemplateMessagePojo messagePojo=new GzhTemplateMessagePojo(); + uniformMsgPojo.setTouser(touser); + messagePojo.setTemplate_id(template_id); + messagePojo.setAppid(gzhAppid); + + + //个性参数设置 + Integer suplerTimes= beauticianState.getProjUse().getSurplusCount(); + messagePojo.setFirst("尊敬的:"+vipInfo.getVipName(),"#453454"); + messagePojo.setKeyWord(beauticianState.getProjInfo().getName(),"#453454"); + messagePojo.setKeyWord(time,"#453454"); + messagePojo.setRemark("您的护理项目剩余"+suplerTimes+"次。","#453454"); + uniformMsgPojo.setMp_template_msg(messagePojo); + + + msgList.add(uniformMsgPojo); + } + + builParam.put("msgList",msgList); + return builParam; + } +} diff --git a/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/TemplateNameConstance.java b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/TemplateNameConstance.java new file mode 100644 index 0000000..d66a4f3 --- /dev/null +++ b/zq-erp/src/main/java/com/matrix/system/wechart/templateMsg/TemplateNameConstance.java @@ -0,0 +1,15 @@ +package com.matrix.system.wechart.templateMsg; + +/** + * 模板code定义常量 + * @author jyy + */ +public interface TemplateNameConstance { + + /** + * 公众号预约提醒 + */ + Integer GZH_YYTX=10000; + + +} diff --git a/zq-erp/src/main/resources/config/application.properties b/zq-erp/src/main/resources/config/application.properties index 0cc9ddf..e14f492 100644 --- a/zq-erp/src/main/resources/config/application.properties +++ b/zq-erp/src/main/resources/config/application.properties @@ -1,4 +1,4 @@ -evn=dev +evn=devbb server.port=8080 diff --git a/zq-erp/src/main/resources/config/db/increment/20210109.sql b/zq-erp/src/main/resources/config/db/increment/20210109.sql new file mode 100644 index 0000000..2f140ba --- /dev/null +++ b/zq-erp/src/main/resources/config/db/increment/20210109.sql @@ -0,0 +1,5 @@ +ALTER TABLE `shop_wxtemplate_msg` +ADD COLUMN `temp_type` int(2) NULL COMMENT ' 模板类型 1,公众号,2,小程序' AFTER `code`, +ADD COLUMN `template_class` longtext NULL COMMENT '取数模板类' AFTER `temp_type`; + + diff --git a/zq-erp/src/main/resources/config/lhx/system.properties b/zq-erp/src/main/resources/config/lhx/system.properties index ffeb78d..d51c554 100644 --- a/zq-erp/src/main/resources/config/lhx/system.properties +++ b/zq-erp/src/main/resources/config/lhx/system.properties @@ -102,3 +102,6 @@ #hive仓库地址 hive.service=http://erp.hive.jyymatrix.cc/meidu-crm/ + +gzh_appid=wx57e6335559bdbda6 +gzh_secret=ecb408af170e3890e6544290cad33760 diff --git a/zq-erp/src/main/resources/config/test/application.properties b/zq-erp/src/main/resources/config/test/application.properties index 09b80d4..b5a6726 100644 --- a/zq-erp/src/main/resources/config/test/application.properties +++ b/zq-erp/src/main/resources/config/test/application.properties @@ -1,12 +1,13 @@ -evn=dev +evn=tyytest server.port=8080 #线上测试环境 -spring.datasource.username=chuhuan -spring.datasource.password=chuhuan -spring.datasource.url=jdbc:mysql://119.3.52.84:3306/hive_plus_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&allowMultiQueries=true&transformedBitIsBoolean=true&serverTimezone=GMT%2B8 +spring.datasource.username=ct_test +spring.datasource.password=123456 +spring.datasource.url=jdbc:mysql://120.27.238.55:3306/hive_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&allowMultiQueries=true&transformedBitIsBoolean=true&serverTimezone=GMT%2B8 + diff --git a/zq-erp/src/main/resources/config/test/system.properties b/zq-erp/src/main/resources/config/test/system.properties index a6ae4c0..26d5253 100644 --- a/zq-erp/src/main/resources/config/test/system.properties +++ b/zq-erp/src/main/resources/config/test/system.properties @@ -1,5 +1,5 @@ #是否启用debug模式 -debug=true +debug=false # 日志文件保存地址 log_path=/mnt/hive/log-test diff --git a/zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopWxtemplateMsgDao.xml b/zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopWxtemplateMsgDao.xml index cb13505..e1aae99 100644 --- a/zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopWxtemplateMsgDao.xml +++ b/zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopWxtemplateMsgDao.xml @@ -16,6 +16,8 @@ <result property="remark" column="remark" /> <result property="companyId" column="company_id" /> <result property="code" column="code" /> + <result property="tempType" column="temp_type" /> + <result property="templateClass" column="template_class" /> </resultMap> @@ -32,6 +34,8 @@ <result property="remark" column="remark" /> <result property="companyId" column="company_id" /> <result property="code" column="code" /> + <result property="tempType" column="temp_type" /> + <result property="templateClass" column="template_class" /> </resultMap> <!-- 字段sql --> @@ -46,7 +50,9 @@ status, remark, company_id, - code + code, + temp_type, + template_class </sql> <!-- 属性sql --> @@ -61,9 +67,10 @@ #{item.status}, #{item.remark}, #{item.companyId}, - #{item.code} + #{item.code}, + #{item.tempType}, + #{item.templateClass} </sql> - <!-- where sql --> <sql id="where_sql"> @@ -86,6 +93,12 @@ <if test="(record.companyId!=null and record.companyId!='') or (record.companyId!='' and record.companyId==0) "> and company_id = #{record.companyId} </if> + + <if test="(record.tempType!=null and record.tempType!='') or (record.tempType!='' and record.tempType==0) "> + and tempType = #{record.tempType} + </if> + + </if> </sql> @@ -140,6 +153,10 @@ <if test="_parameter.containsKey('code')"> code = #{code}, </if> + <if test="_parameter.containsKey('temp_type')"> + temp_type = #{tempType}, + </if> + </set> WHERE id=#{id} </update> @@ -167,6 +184,11 @@ <if test="record.code != null and record.code != '' "> code = #{record.code}, </if> + + <if test="record.tempType != null and record.tempType != '' "> + temp_type = #{record.tempType}, + </if> + </set> WHERE id=#{record.id} </update> @@ -248,7 +270,7 @@ select <include refid="columns" ></include> from shop_wxtemplate_msg - where code=#{code} + where code=#{code} and company_id=#{companyId} </select> diff --git a/zq-erp/src/main/resources/templates/views/admin/shop/templateMsg-list.html b/zq-erp/src/main/resources/templates/views/admin/shop/templateMsg-list.html index f3c70ac..6bfb688 100644 --- a/zq-erp/src/main/resources/templates/views/admin/shop/templateMsg-list.html +++ b/zq-erp/src/main/resources/templates/views/admin/shop/templateMsg-list.html @@ -86,6 +86,7 @@ <th data-field="name">名称</th> <th data-field="uuid">模板ID</th> <th data-field="dicMap.status">是否启用</th> + <th data-field="dicMap.tempType">模板类型</th> <th data-field="remark">备注</th> </tr> </thead> -- Gitblit v1.9.1