Browse Source

IC卡程序

chenw 7 years ago
parent
commit
1bd85ae6ba

+ 0 - 174
applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/po/MessageInfo.java

@@ -1,174 +0,0 @@
-package com.usoftchina.smartschool.device.client.po;
-
-import java.io.Serializable;
-
-/**
- * @Author chenwei
- * @Date 2019/03/08
- */
-public class MessageInfo implements Serializable {
-
-    private String msgId;
-    /**
-     * 公众号id
-     */
-    private String appId;
-
-    /**
-     * 公众号密钥
-     */
-    private String secret;
-
-    /*
-     * 推送人微信标识
-     */
-    private String touser;
-
-    /**
-     * 微信模板id
-     */
-    private String templateId;
-
-    private String title;
-
-    private String keyword1;
-
-    private String keyword2;
-
-    private String keyword3;
-
-    private String keyword4;
-
-    private String keyword5;
-
-    private String keyword6;
-
-    private int userType;
-
-    private String remark;
-
-    private String url;
-
-    public String getAppId() {
-        return appId;
-    }
-
-    public void setAppId(String appId) {
-        this.appId = appId;
-    }
-
-    public String getSecret() {
-        return secret;
-    }
-
-    public void setSecret(String secret) {
-        this.secret = secret;
-    }
-
-    public String getTouser() {
-        return touser;
-    }
-
-    public void setTouser(String touser) {
-        this.touser = touser;
-    }
-
-    public String getTemplateId() {
-        return templateId;
-    }
-
-    public void setTemplateId(String templateId) {
-        this.templateId = templateId;
-    }
-
-    public String getTitle() {
-        return title;
-    }
-
-    public void setTitle(String title) {
-        this.title = title;
-    }
-
-    public String getKeyword1() {
-        return keyword1;
-    }
-
-    public void setKeyword1(String keyword1) {
-        this.keyword1 = keyword1;
-    }
-
-    public String getKeyword2() {
-        return keyword2;
-    }
-
-    public void setKeyword2(String keyword2) {
-        this.keyword2 = keyword2;
-    }
-
-    public String getKeyword3() {
-        return keyword3;
-    }
-
-    public void setKeyword3(String keyword3) {
-        this.keyword3 = keyword3;
-    }
-
-    public String getKeyword4() {
-        return keyword4;
-    }
-
-    public void setKeyword4(String keyword4) {
-        this.keyword4 = keyword4;
-    }
-
-    public String getKeyword6() {
-        return keyword6;
-    }
-
-    public void setKeyword6(String keyword6) {
-        this.keyword6 = keyword6;
-    }
-
-    public String getRemark() {
-        return remark;
-    }
-
-    public void setRemark(String remark) {
-        this.remark = remark;
-    }
-
-    public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
-
-    public String getKeyword5() {
-        return keyword5;
-    }
-
-    public void setKeyword5(String keyword5) {
-        this.keyword5 = keyword5;
-    }
-
-    public int getUserType() {
-        return userType;
-    }
-
-    public void setUserType(int userType) {
-        this.userType = userType;
-    }
-
-    public String getMsgId() {
-        return msgId;
-    }
-
-    public void setMsgId(String msgId) {
-        this.msgId = msgId;
-    }
-
-
-
-}

+ 17 - 64
applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/service/IcCardService.java

@@ -6,7 +6,8 @@ import com.usoftchina.smartschool.device.client.jdbc.DynamicDataSourceContextHol
 import com.usoftchina.smartschool.device.client.jdbc.DynamicDataSourceRegister;
 import com.usoftchina.smartschool.device.client.po.*;
 import com.usoftchina.smartschool.device.client.repository.IcCardRepository;
-import com.usoftchina.smartschool.device.client.utils.HmacUtils;
+import com.usoftchina.smartschool.device.dto.AccTransDetail;
+import com.usoftchina.smartschool.device.exception.ExceptionCode;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.*;
@@ -19,11 +20,7 @@ import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
 import org.springframework.util.StringUtils;
 import org.springframework.web.client.RestTemplate;
-import org.springframework.web.util.DefaultUriBuilderFactory;
 
-import java.net.URI;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -97,71 +94,27 @@ public class IcCardService {
         jdbcTemplate.execute(insertSql);
         //2.获取本次传输的数据
         List<AccTransDetail> resultList = jdbcTemplate.query(getDataSql, new BeanPropertyRowMapper<>(AccTransDetail.class), "待上传");
-        List<MessageInfo> messageInfoList = new ArrayList<MessageInfo>();
-        StringBuilder sb = new StringBuilder();
-        resultList.forEach(accTransDetail -> {
-            sb.append(accTransDetail.getGuid() + ",");
-            String oldType = accTransDetail.getAccTransType();
-            accTransDetail.setAccTransType(Transaction.getName(accTransDetail.getAccTransType()));
-            //构造messageInfo对象
-            MessageInfo messageInfo = new MessageInfo();
-            messageInfo.setMsgId(accTransDetail.getGuid());
-            messageInfo.setTouser(accTransDetail.getEmpNo());
-            //messageInfo.setTouser("o8lZ9uNXXY7VSfNM6be-7VZNkcOw");
-            messageInfo.setTouser(accTransDetail.getEmpName());
-            messageInfo.setUserType(2);
-            messageInfo.setTemplateId("FhtdzLdpzLLp4eJGtgvH4SUfIpSIF0kWwIpsWsSBp6c");
-            String accNo = accTransDetail.getAccNo();
-            String cardNo = StringUtils.isEmpty(accNo) ? null : accNo.substring(accTransDetail.getAccNo().length() - 4);
-            String header = "您好,您的小孩" + accTransDetail.getEmpName() + "在校的校园卡(卡号:*** " + cardNo + ")发生如下交易";
-            messageInfo.setTitle(header);
-            messageInfo.setKeyword1(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(accTransDetail.getAccTransDay()));
-            if (Integer.parseInt(oldType) > 15) {
-                messageInfo.setKeyword2(String.format("%.2f", accTransDetail.getoMoneyValue()));
-            }else {
-                messageInfo.setKeyword2(String.format("%.2f", accTransDetail.getiMoneyValue()));
-            }
-            messageInfo.setKeyword3(accTransDetail.getAccTransType());
-            messageInfo.setKeyword4(String.format("%.2f", accTransDetail.getCardMoneyValue()));
-            messageInfo.setRemark("感谢您使用");
-            messageInfoList.add(messageInfo);
-        });
         //3.传输
         HttpHeaders headers = new HttpHeaders();
         headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
         MultiValueMap<String, String> requestEntity = new LinkedMultiValueMap<>();
-        requestEntity.add("data", JSON.toJSONString(messageInfoList));
+        requestEntity.add("data", JSON.toJSONString(resultList));
+        requestEntity.add("school", schoolService.find().getName());
         HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<>(requestEntity, headers);
-        //禁止对该url进行encode操作
-        DefaultUriBuilderFactory defaultUriBuilderFactory = new DefaultUriBuilderFactory();
-        defaultUriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE);
-        restTemplate.setUriTemplateHandler(defaultUriBuilderFactory);
-        ResponseEntity<String> responseEntity = restTemplate.postForEntity(getURI(targetURL, "/send"), httpEntity, String.class);
-        //4.完成后,将传输的成功的数据状态更新为"已上传"
-        if (responseEntity.getStatusCode().equals(HttpStatus.OK)) {
-            Result result = JSON.parseObject(responseEntity.getBody(), Result.class);
-            if (result.isSuccess()) {
-                String ids = "'" + sb.substring(0, sb.length() - 1).replaceAll(",", "','") + "'";
-                jdbcTemplate.update(updateSql, "已上传", ids);
+        ResponseEntity<Result> response = restTemplate.postForEntity(targetURL, resultList, Result.class);
+        if (response.getStatusCode() == HttpStatus.OK) {
+            Result<String> result = response.getBody();
+            if (!result.isSuccess()) {
+                ExceptionCode.ERROR_UNKNOWN.occur(result.getMessage());
+            }else {
+                //更新发送的数据
+                String ids = result.getData();
+                if (!StringUtils.isEmpty(ids)){
+                    jdbcTemplate.update(updateSql, "已上传", ids);
+                }
             }
+        } else {
+            ExceptionCode.ERROR_UNKNOWN.occur("IC卡消费记录发送失败");
         }
     }
-
-    private String getURI(String url, String subIndexOf, Object... vars){
-        StringBuilder accessUrl = new StringBuilder(url);
-        accessUrl.append(url.contains("?") ? "&" : "?");
-        // 身份ID
-        accessUrl.append("school=").append(schoolService.find().getName());
-        //时间戳
-        accessUrl.append("&_timestamp=").append(System.currentTimeMillis());
-        RestTemplate restTemplate = new RestTemplate();
-        URI uri = restTemplate.getUriTemplateHandler().expand(accessUrl.toString(), vars);
-        url = uri.toString();
-        /*if (StringUtils.isEmpty(accessSecretKey)) {
-            return url + "&_signature=" + HmacUtils.encode(url.substring(url.indexOf(subIndexOf)));
-        }else {
-            return url + "&_signature=" + HmacUtils.encode(url.substring(url.indexOf(subIndexOf)), accessSecretKey);
-        }*/
-        return url + "&_signature=" + HmacUtils.encode(url.substring(url.indexOf(subIndexOf)));
-    }
 }

+ 0 - 51
applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/utils/HmacUtils.java

@@ -1,51 +0,0 @@
-package com.usoftchina.smartschool.device.client.utils;
-
-
-import com.usoftchina.smartschool.device.crypto.Hex;
-import com.usoftchina.smartschool.device.crypto.HmacEncoder;
-import com.usoftchina.smartschool.device.crypto.HmacSHA256Encoder;
-
-/**
- * Hmac加密工具
- * 
- * @author yingp
- *
- */
-public class HmacUtils {
-
-	private static HmacEncoder hmacEncoder;
-
-	// 默认约定密钥
-	private final static byte[] key = { 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 117, 98, 116, 111, 98, 46, 99, 111, 109, 47,
-			101, 114, 112, 47, 115, 97, 108, 101, 47, 111, 114, 100, 101, 114, 115, 63, 115, 111, 109, 101, 116, 104, 105, 110, 103 };
-
-	static {
-		// default algorithm: HmacSHA256
-		hmacEncoder = new HmacSHA256Encoder();
-	}
-
-	/**
-	 * 
-	 * @param message
-	 *            明文
-	 * @return 16进制密文
-	 */
-	public static String encode(Object message) {
-		byte[] encodeData = hmacEncoder.encode(String.valueOf(message).getBytes(), key);
-		return new String(Hex.encode(encodeData));
-	}
-
-	/**
-	 * 
-	 * @param message
-	 *            明文
-	 * @param key
-	 *            密钥
-	 * @return 16进制密文
-	 */
-	public static String encode(Object message, String key) {
-		byte[] encodeData = hmacEncoder.encode(String.valueOf(message).getBytes(), key.getBytes());
-		return new String(Hex.encode(encodeData));
-	}
-
-}

+ 1 - 1
applications/device/device-client/src/main/resources/application.yml

@@ -7,7 +7,7 @@ device:
     accessControlEvent: https://school-api.ydyhz.com/api/device/accesscontrol/event
   # IC卡传输的服务端接口
   icCard:
-    icCardUrl: https://school-api.ubtob.com/api/wechat/send/Messages
+    icCardUrl: https://school-api.ydyhz.com/api/device/iccard/consume/record
 server:
   tomcat:
     uri-encoding: UTF-8

+ 1 - 1
applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/po/AccTransDetail.java → applications/device/device-sdk/src/main/java/com/usoftchina/smartschool/device/dto/AccTransDetail.java

@@ -1,4 +1,4 @@
-package com.usoftchina.smartschool.device.client.po;
+package com.usoftchina.smartschool.device.dto;
 
 import java.io.Serializable;
 import java.util.Date;

+ 91 - 0
applications/device/device-server/src/main/java/com/usoftchina/smartschool/device/config/RestTemplateConfig.java

@@ -0,0 +1,91 @@
+package com.usoftchina.smartschool.device.client.config;
+
+import org.apache.http.client.HttpClient;
+import org.apache.http.config.Registry;
+import org.apache.http.config.RegistryBuilder;
+import org.apache.http.conn.socket.ConnectionSocketFactory;
+import org.apache.http.conn.socket.PlainConnectionSocketFactory;
+import org.apache.http.conn.ssl.NoopHostnameVerifier;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.http.ssl.SSLContextBuilder;
+import org.apache.http.ssl.TrustStrategy;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.converter.StringHttpMessageConverter;
+import org.springframework.web.client.RestTemplate;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLContext;
+import java.nio.charset.Charset;
+import java.security.KeyManagementException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.List;
+
+/**
+ * @Author chenwei
+ * @Date 2019/03/07
+ */
+@Configuration
+public class RestTemplateConfig {
+
+    private static final Logger logger = LoggerFactory.getLogger(RestTemplateConfig.class);
+
+    @Bean
+    public RestTemplate restTemplate(){
+        RestTemplate restTemplate = new RestTemplate();
+        List<HttpMessageConverter<?>> converterList = restTemplate.getMessageConverters();
+        converterList.add(0, responseBodyConverter());
+        restTemplate.setRequestFactory(httpRequestFactory());
+        return restTemplate;
+    }
+
+    @Bean
+    public HttpMessageConverter<String> responseBodyConverter() {
+        StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
+        return converter;
+    }
+
+    @Bean
+    public HttpComponentsClientHttpRequestFactory httpRequestFactory(){
+        try {
+            HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
+            SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
+                public boolean isTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
+                    return true;
+                }
+            }).build();
+            httpClientBuilder.setSSLContext(sslContext);
+            HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;
+            SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
+            Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
+                    .register("http", PlainConnectionSocketFactory.getSocketFactory())
+                    .register("https", sslConnectionSocketFactory).build();// 注册http和https请求
+            // 开始设置连接池
+            PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
+            poolingHttpClientConnectionManager.setMaxTotal(500); // 最大连接数500
+            poolingHttpClientConnectionManager.setDefaultMaxPerRoute(100); // 同路由并发数100
+            httpClientBuilder.setConnectionManager(poolingHttpClientConnectionManager);
+            httpClientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler(3, true)); // 重试次数
+            HttpClient httpClient = httpClientBuilder.build();
+            HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); // httpClient连接配置
+            clientHttpRequestFactory.setConnectTimeout(20000);              // 连接超时
+            clientHttpRequestFactory.setReadTimeout(30000);                 // 数据读取超时时间
+            clientHttpRequestFactory.setConnectionRequestTimeout(20000);    // 连接不够用的等待时间
+            return clientHttpRequestFactory;
+        }catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException e){
+            logger.info("初始化HTTP连接池出错, message={}", e);
+        }
+        return null;
+    }
+
+}

+ 20 - 0
applications/device/device-server/src/main/java/com/usoftchina/smartschool/device/controller/IcCardController.java

@@ -1,8 +1,16 @@
 package com.usoftchina.smartschool.device.controller;
 
+import com.alibaba.fastjson.JSON;
+import com.usoftchina.smartschool.base.Result;
+import com.usoftchina.smartschool.device.dto.AccTransDetail;
+import com.usoftchina.smartschool.device.service.IcCardService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
 /**
  * 对接IC卡业务
  *
@@ -12,4 +20,16 @@ import org.springframework.web.bind.annotation.RestController;
 @RestController
 @RequestMapping("/iccard")
 public class IcCardController {
+
+    @Autowired
+    private IcCardService icCardService;
+
+    @PostMapping("/consume/record")
+    public Result consumePush(String data, String school){
+        List<AccTransDetail> accTransDetailList = JSON.parseArray(data, AccTransDetail.class);
+        String result = icCardService.consumePush(accTransDetailList, school);
+        return Result.success(result);
+    }
+
+
 }

+ 18 - 0
applications/device/device-server/src/main/java/com/usoftchina/smartschool/device/mapper/IcCardMapper.java

@@ -0,0 +1,18 @@
+package com.usoftchina.smartschool.device.mapper;
+
+import com.usoftchina.smartschool.school.dto.SysSchoolDTO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @Author ChenWei
+ * @Date 2019/03/12
+ */
+@Mapper
+public interface IcCardMapper {
+
+    String SelectParentOpenId(@Param("code") String code, @Param("schoolId") Long schoolId);
+
+    SysSchoolDTO getSchoolIdByName(@Param("name") String name);
+
+}

+ 1 - 1
applications/device/device-client/src/main/java/com/usoftchina/smartschool/device/client/po/Transaction.java → applications/device/device-server/src/main/java/com/usoftchina/smartschool/device/po/Transaction.java

@@ -1,4 +1,4 @@
-package com.usoftchina.smartschool.device.client.po;
+package com.usoftchina.smartschool.device.po;
 
 public enum Transaction {
 

+ 11 - 0
applications/device/device-server/src/main/java/com/usoftchina/smartschool/device/service/IcCardService.java

@@ -0,0 +1,11 @@
+package com.usoftchina.smartschool.device.service;
+
+import com.usoftchina.smartschool.device.dto.AccTransDetail;
+
+import java.util.List;
+
+public interface IcCardService {
+
+    String consumePush(List<AccTransDetail> accTransDetailList, String school);
+
+}

+ 123 - 0
applications/device/device-server/src/main/java/com/usoftchina/smartschool/device/service/impl/IcCardServiceImpl.java

@@ -0,0 +1,123 @@
+package com.usoftchina.smartschool.device.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.usoftchina.smartschool.device.base.Result;
+import com.usoftchina.smartschool.device.dto.AccTransDetail;
+import com.usoftchina.smartschool.device.mapper.IcCardMapper;
+import com.usoftchina.smartschool.device.po.Transaction;
+import com.usoftchina.smartschool.device.service.IcCardService;
+import com.usoftchina.smartschool.school.dto.SysSchoolDTO;
+import com.usoftchina.smartschool.utils.ObjectUtils;
+import com.usoftchina.smartschool.utils.http.HmacUtils;
+import com.usoftchina.smartschool.wechat.dto.MessageInfoDTO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.*;
+import org.springframework.stereotype.Service;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.util.StringUtils;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.util.DefaultUriBuilderFactory;
+
+import java.net.URI;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Author chenwei
+ * @Date 2019/03/12
+ */
+@Service
+public class IcCardServiceImpl implements IcCardService {
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+    @Autowired
+    private IcCardMapper icCardMapper;
+
+    private final String targetURL = "https://school-api.ydyhz.com/api/wechat/send/Messages";
+
+    public String consumePush(List<AccTransDetail> accTransDetailList, String school){
+        List<MessageInfoDTO> messageInfoList = new ArrayList<MessageInfoDTO>();
+        SysSchoolDTO sysSchoolDTO = icCardMapper.getSchoolIdByName(school);
+        if (!ObjectUtils.isEmpty(sysSchoolDTO)) {
+            String appId = sysSchoolDTO.getSchool_appid();
+            String secret = sysSchoolDTO.getSchool_secret();
+            Long schoolId = sysSchoolDTO.getSchool_id();
+            StringBuilder sb = new StringBuilder();
+            accTransDetailList.forEach(accTransDetail -> {
+                sb.append(accTransDetail.getGuid() + ",");
+                String oldType = accTransDetail.getAccTransType();
+                accTransDetail.setAccTransType(Transaction.getName(accTransDetail.getAccTransType()));
+                //构造messageInfo对象
+                MessageInfoDTO messageInfo = new MessageInfoDTO();
+                messageInfo.setMsgId(accTransDetail.getGuid());
+                String openId = icCardMapper.SelectParentOpenId(accTransDetail.getEmpNo(), schoolId);
+                messageInfo.setTouser(openId);
+                messageInfo.setAppId(appId);
+                messageInfo.setSecret(secret);
+                messageInfo.setUserType(2);
+                messageInfo.setTemplateId("FhtdzLdpzLLp4eJGtgvH4SUfIpSIF0kWwIpsWsSBp6c");
+                String accNo = accTransDetail.getAccNo();
+                String cardNo = StringUtils.isEmpty(accNo) ? null : accNo.substring(accTransDetail.getAccNo().length() - 4);
+                String header = "您好,您的小孩" + accTransDetail.getEmpName() + "在校的校园卡(卡号:*** " + cardNo + ")发生如下交易";
+                messageInfo.setTitle(header);
+                Date accTransDay = accTransDetail.getAccTransDay();
+                if (null != accTransDay) {
+                    messageInfo.setKeyword1(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(accTransDetail.getAccTransDay()));
+                }
+                if (Integer.parseInt(oldType) > 15) {
+                    messageInfo.setKeyword2(String.format("%.2f", accTransDetail.getoMoneyValue()));
+                } else {
+                    messageInfo.setKeyword2(String.format("%.2f", accTransDetail.getiMoneyValue()));
+                }
+                messageInfo.setKeyword3(accTransDetail.getAccTransType());
+                messageInfo.setKeyword4(String.format("%.2f", accTransDetail.getCardMoneyValue()));
+                messageInfo.setRemark("感谢您使用");
+                messageInfoList.add(messageInfo);
+            });
+            //3.传输
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+            MultiValueMap<String, String> requestEntity = new LinkedMultiValueMap<>();
+            requestEntity.add("data", JSON.toJSONString(messageInfoList));
+            HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<>(requestEntity, headers);
+            //禁止对该url进行encode操作
+            DefaultUriBuilderFactory defaultUriBuilderFactory = new DefaultUriBuilderFactory();
+            defaultUriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE);
+            restTemplate.setUriTemplateHandler(defaultUriBuilderFactory);
+            ResponseEntity<String> responseEntity = restTemplate.postForEntity(getURI(targetURL, "/send", school), httpEntity, String.class);
+            //4.完成后,将传输的成功的数据状态更新为"已上传"
+            if (responseEntity.getStatusCode().equals(HttpStatus.OK)) {
+                Result result = JSON.parseObject(responseEntity.getBody(), Result.class);
+                if (result.isSuccess()) {
+                    String ids = "'" + sb.substring(0, sb.length() - 1).replaceAll(",", "','") + "'";
+                    return ids;
+                }
+            }
+        }
+        return null;
+    }
+
+    private String getURI(String url, String subIndexOf, String school, Object... vars){
+        StringBuilder accessUrl = new StringBuilder(url);
+        accessUrl.append(url.contains("?") ? "&" : "?");
+        // 身份ID
+        accessUrl.append("school=").append(school);
+        //时间戳
+        accessUrl.append("&_timestamp=").append(System.currentTimeMillis());
+        RestTemplate restTemplate = new RestTemplate();
+        URI uri = restTemplate.getUriTemplateHandler().expand(accessUrl.toString(), vars);
+        url = uri.toString();
+        /*if (StringUtils.isEmpty(accessSecretKey)) {
+            return url + "&_signature=" + HmacUtils.encode(url.substring(url.indexOf(subIndexOf)));
+        }else {
+            return url + "&_signature=" + HmacUtils.encode(url.substring(url.indexOf(subIndexOf)), accessSecretKey);
+        }*/
+        return url + "&_signature=" + HmacUtils.encode(url.substring(url.indexOf(subIndexOf)));
+    }
+
+}

+ 20 - 0
applications/device/device-server/src/main/resources/mapper/IcCardMapper.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.usoftchina.smartschool.device.mapper.IcCardMapper" >
+  <resultMap id="BaseResultMap" type="com.usoftchina.smartschool.school.dto.SysSchoolDTO">
+
+  </resultMap>
+
+  <select id="getSchoolIdByName" resultType="com.usoftchina.smartschool.school.dto.SysSchoolDTO">
+    SELECT * FROM SYS_SCHOOL WHERE SCHOOL_NAME = #{name}
+  </select>
+
+  <select id="SelectParentOpenId" resultType="string">
+    select openid from sys_parents where  parent_id in
+    (SELECT parent_id FROM sys_parents_stu WHERE stu_id =
+      (SELECT stu_id FROM sys_student WHERE stu_number = #{code} and school_id = #{schoolId})
+    )
+    and school_id=#{schoolId}
+    and   ifnull(openid,'')  != ''  limit 0,1
+  </select>
+</mapper>