Browse Source

【越加红】纷享销客 新增商品接口对接调试成功

wub 3 years ago
parent
commit
a8acd268de
47 changed files with 2885 additions and 12 deletions
  1. 22 0
      pom.xml
  2. 67 0
      src/main/java/com/uas/eis/beans/AppReqParmVO.java
  3. 34 0
      src/main/java/com/uas/eis/beans/CorpAccessToken.java
  4. 50 0
      src/main/java/com/uas/eis/beans/HttpResponseMessageVO.java
  5. 67 0
      src/main/java/com/uas/eis/beans/MsgReceiveParamVO.java
  6. 49 0
      src/main/java/com/uas/eis/beans/req/AppTokenReq.java
  7. 58 0
      src/main/java/com/uas/eis/beans/req/BaseOfOpenUserIdReq.java
  8. 44 0
      src/main/java/com/uas/eis/beans/req/BaseReq.java
  9. 63 0
      src/main/java/com/uas/eis/beans/req/CorpAccessTokenReq.java
  10. 42 0
      src/main/java/com/uas/eis/beans/req/CrmAddReq.java
  11. 52 0
      src/main/java/com/uas/eis/beans/req/CrmGetReq.java
  12. 236 0
      src/main/java/com/uas/eis/beans/req/CrmQueryReq.java
  13. 50 0
      src/main/java/com/uas/eis/beans/req/CrmUpdateReq.java
  14. 49 0
      src/main/java/com/uas/eis/beans/req/OpenUserIdReq.java
  15. 7 0
      src/main/java/com/uas/eis/beans/req/Req.java
  16. 52 0
      src/main/java/com/uas/eis/beans/result/AppTokenResult.java
  17. 48 0
      src/main/java/com/uas/eis/beans/result/BaseResult.java
  18. 65 0
      src/main/java/com/uas/eis/beans/result/CorpAccessTokenResult.java
  19. 29 0
      src/main/java/com/uas/eis/beans/result/CrmAddResult.java
  20. 34 0
      src/main/java/com/uas/eis/beans/result/CrmGetResult.java
  21. 43 0
      src/main/java/com/uas/eis/beans/result/CrmQueryResult.java
  22. 129 0
      src/main/java/com/uas/eis/beans/result/Goods.java
  23. 51 0
      src/main/java/com/uas/eis/beans/result/OpenUserIdResult.java
  24. 41 0
      src/main/java/com/uas/eis/beans/result/ProductAddResult.java
  25. 53 0
      src/main/java/com/uas/eis/beans/result/ProductDto.java
  26. 39 0
      src/main/java/com/uas/eis/beans/result/Result.java
  27. 1 1
      src/main/java/com/uas/eis/core/support/SpringDynamicCronTask.java
  28. 10 0
      src/main/java/com/uas/eis/exception/AccessTokenException.java
  29. 51 0
      src/main/java/com/uas/eis/exception/AesException.java
  30. 10 0
      src/main/java/com/uas/eis/exception/AppAccessTokenRequestException.java
  31. 52 0
      src/main/java/com/uas/eis/exception/BaseException.java
  32. 10 0
      src/main/java/com/uas/eis/exception/CorpAccessTokenRequestException.java
  33. 45 0
      src/main/java/com/uas/eis/manager/AccessTokenManager.java
  34. 15 0
      src/main/java/com/uas/eis/manager/OpenUserIdManager.java
  35. 33 0
      src/main/java/com/uas/eis/manager/ProductManager.java
  36. 145 0
      src/main/java/com/uas/eis/manager/impl/AccessTokenManagerImpl.java
  37. 28 0
      src/main/java/com/uas/eis/manager/impl/OpenUserIdManagerImpl.java
  38. 86 0
      src/main/java/com/uas/eis/manager/impl/ProductManagerImpl.java
  39. 90 0
      src/main/java/com/uas/eis/utils/Configuration.java
  40. 53 0
      src/main/java/com/uas/eis/utils/Constants.java
  41. 227 0
      src/main/java/com/uas/eis/utils/HttpTookit.java
  42. 271 0
      src/main/java/com/uas/eis/utils/OpenAPIUtils.java
  43. 66 0
      src/main/java/com/uas/eis/utils/PKCS7Encoder.java
  44. 170 0
      src/main/java/com/uas/eis/utils/SigUtils.java
  45. 1 1
      src/main/resources/api_sign_key_mapping.properties
  46. 10 3
      src/main/resources/application-prod.yml
  47. 37 7
      src/test/java/com/uas/eis/UasEisApplicationTests.java

+ 22 - 0
pom.xml

@@ -150,9 +150,31 @@
 			<scope>system</scope>
 			<systemPath>${project.basedir}/lib/ojdbc7.jar</systemPath>
 		</dependency>
+
+		<!-- GSon -->
+		<dependency>
+			<groupId>com.google.code.gson</groupId>
+			<artifactId>gson</artifactId>
+			<version>2.3</version>
+		</dependency>
+
+		<dependency>
+			<groupId>com.google.guava</groupId>
+			<artifactId>guava</artifactId>
+			<version>18.0</version>
+		</dependency>
 	</dependencies>
 
 	<build>
+		<resources>
+			<resource>
+				<filtering>true</filtering>
+				<directory>src/main/resources</directory>
+				<includes>
+					<include>**/*</include>
+				</includes>
+			</resource>
+		</resources>
 		<plugins>
         		<plugin>
             			<groupId>org.springframework.boot</groupId>

+ 67 - 0
src/main/java/com/uas/eis/beans/AppReqParmVO.java

@@ -0,0 +1,67 @@
+package com.uas.eis.beans;
+
+import java.io.Serializable;
+
+/**
+ * 封装接收App端请求传入参数的JavaBean
+ * 
+ * @author huanghp
+ * @date 2015年8月28日
+ */
+public class AppReqParmVO implements Serializable {
+
+    private static final long serialVersionUID = -1206184202179044275L;
+
+    /**
+     * App 端 请求传入的身份态
+     */
+    private String code;
+
+    /**
+     * 请求时间戳
+     */
+    private String timestamp;
+
+    /**
+     * 请求随机数
+     */
+    private String nonce;
+
+    /**
+     * 请求参数+token的签名
+     */
+    private String codeSig;
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getTimestamp() {
+        return timestamp;
+    }
+
+    public void setTimestamp(String timestamp) {
+        this.timestamp = timestamp;
+    }
+
+    public String getNonce() {
+        return nonce;
+    }
+
+    public void setNonce(String nonce) {
+        this.nonce = nonce;
+    }
+
+    public String getCodeSig() {
+        return codeSig;
+    }
+
+    public void setCodeSig(String codeSig) {
+        this.codeSig = codeSig;
+    }
+
+}

+ 34 - 0
src/main/java/com/uas/eis/beans/CorpAccessToken.java

@@ -0,0 +1,34 @@
+package com.uas.eis.beans;
+
+import java.io.Serializable;
+
+public class CorpAccessToken implements Serializable {
+
+    private static final long serialVersionUID = -4995204525912210225L;
+
+    /**
+     * corpAccessToken
+     */
+    private String corpAccessToken;
+
+    /**
+     * corpId
+     */
+    private String corpId;
+
+    public String getCorpAccessToken() {
+        return corpAccessToken;
+    }
+
+    public void setCorpAccessToken(String corpAccessToken) {
+        this.corpAccessToken = corpAccessToken;
+    }
+
+    public String getCorpId() {
+        return corpId;
+    }
+
+    public void setCorpId(String corpId) {
+        this.corpId = corpId;
+    }
+}

+ 50 - 0
src/main/java/com/uas/eis/beans/HttpResponseMessageVO.java

@@ -0,0 +1,50 @@
+package com.uas.eis.beans;
+
+/**
+ * 发送http https 请求的返回结果包装类
+ * 
+ * @author huanghp
+ * @date 2015年8月28日
+ */
+public class HttpResponseMessageVO {
+
+    /**
+     * http响应状态码
+     */
+    private String httpCode;
+
+    /**
+     * http响应消息
+     */
+    private String message;
+
+    /**
+     * http响应内容
+     */
+    private String content;
+
+    public String getHttpCode() {
+        return httpCode;
+    }
+
+    public void setHttpCode(String httpCode) {
+        this.httpCode = httpCode;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+}

+ 67 - 0
src/main/java/com/uas/eis/beans/MsgReceiveParamVO.java

@@ -0,0 +1,67 @@
+package com.uas.eis.beans;
+
+import java.io.Serializable;
+
+/**
+ * 封装接收开平推送消息请求参数的JavaBean
+ * 
+ * @author huanghp
+ * @date 2015年8月28日
+ */
+public class MsgReceiveParamVO implements Serializable {
+
+    private static final long serialVersionUID = 3966976690051895927L;
+
+    /**
+     * 请求随机数
+     */
+    private String nonce;
+
+    /**
+     * 请求时间戳
+     */
+    private String timeStamp;
+
+    /**
+     * AesKey 加密的消息内容
+     */
+    private String content;
+
+    /**
+     * 请求参数+token 签名
+     */
+    private String sig;
+
+    public String getNonce() {
+        return nonce;
+    }
+
+    public void setNonce(String nonce) {
+        this.nonce = nonce;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getSig() {
+        return sig;
+    }
+
+    public void setSig(String sig) {
+        this.sig = sig;
+    }
+
+    public String getTimeStamp() {
+        return timeStamp;
+    }
+
+    public void setTimeStamp(String timeStamp) {
+        this.timeStamp = timeStamp;
+    }
+
+}

+ 49 - 0
src/main/java/com/uas/eis/beans/req/AppTokenReq.java

@@ -0,0 +1,49 @@
+package com.uas.eis.beans.req;
+
+import com.google.common.base.MoreObjects;
+
+/**
+ * 封装获取appToken 请求参数的JaveBean
+ * 
+ * @author huanghp
+ * @date 2015年8月28日
+ */
+public class AppTokenReq implements Req {
+
+    private static final long serialVersionUID = -5691676776742443894L;
+
+    /**
+     * 应用ID
+     */
+    private String appId;
+
+    /**
+     * 应用秘钥
+     */
+    private String appSecret;
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public void setAppId(String appId) {
+        this.appId = appId;
+    }
+
+    public String getAppSecret() {
+        return appSecret;
+    }
+
+    public void setAppSecret(String appSecret) {
+        this.appSecret = appSecret;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("appId", appId)
+                .add("appSecret", appSecret)
+                .toString();
+    }
+
+}

+ 58 - 0
src/main/java/com/uas/eis/beans/req/BaseOfOpenUserIdReq.java

@@ -0,0 +1,58 @@
+package com.uas.eis.beans.req;
+
+
+import com.google.common.base.MoreObjects;
+
+public class BaseOfOpenUserIdReq implements Req {
+
+    private static final long serialVersionUID = 6280290415792613761L;
+
+    /**
+     * 第三方应用获得企业授权的凭证
+     */
+    protected String corpAccessToken;
+
+    /**
+     * 开放平台派发的公司账号
+     */
+    protected String corpId;
+
+    /**
+     * 前操作的开放平台派发的用户帐号
+     */
+    protected String currentOpenUserId;
+
+    public String getCurrentOpenUserId() {
+        return currentOpenUserId;
+    }
+
+    public void setCurrentOpenUserId(String currentOpenUserId) {
+        this.currentOpenUserId = currentOpenUserId;
+    }
+
+    public String getCorpAccessToken() {
+        return corpAccessToken;
+    }
+
+    public void setCorpAccessToken(String corpAccessToken) {
+        this.corpAccessToken = corpAccessToken;
+    }
+
+    public String getCorpId() {
+        return corpId;
+    }
+
+    public void setCorpId(String corpId) {
+        this.corpId = corpId;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("corpAccessToken", corpAccessToken)
+                .add("corpId", corpId)
+                .add("currentOpenUserId",currentOpenUserId)
+                .toString();
+    }
+
+}

+ 44 - 0
src/main/java/com/uas/eis/beans/req/BaseReq.java

@@ -0,0 +1,44 @@
+package com.uas.eis.beans.req;
+
+
+import com.google.common.base.MoreObjects;
+
+public class BaseReq implements Req {
+
+    private static final long serialVersionUID = 6280290415792613761L;
+
+    /**
+     * 第三方应用获得企业授权的凭证
+     */
+    protected String corpAccessToken;
+
+    /**
+     * 开放平台派发的公司账号
+     */
+    protected String corpId;
+
+    public String getCorpAccessToken() {
+        return corpAccessToken;
+    }
+
+    public void setCorpAccessToken(String corpAccessToken) {
+        this.corpAccessToken = corpAccessToken;
+    }
+
+    public String getCorpId() {
+        return corpId;
+    }
+
+    public void setCorpId(String corpId) {
+        this.corpId = corpId;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("corpAccessToken", corpAccessToken)
+                .add("corpId", corpId)
+                .toString();
+    }
+
+}

+ 63 - 0
src/main/java/com/uas/eis/beans/req/CorpAccessTokenReq.java

@@ -0,0 +1,63 @@
+package com.uas.eis.beans.req;
+
+import com.google.common.base.MoreObjects;
+
+/**
+ * 封装获取CorpAccessToken 请求参数的JaveBean
+ * 
+ * @author huanghp
+ * @date 2015年8月28日
+ */
+public class CorpAccessTokenReq implements Req {
+
+    private static final long serialVersionUID = 119087883828028381L;
+
+    /**
+     * 应用ID
+     */
+    private String appId;
+
+    /**
+     * 应用秘钥
+     */
+    private String appSecret;
+
+    /**
+     * 永久授权码
+     */
+    private String permanentCode;
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public void setAppId(String appId) {
+        this.appId = appId;
+    }
+
+    public String getAppSecret() {
+        return appSecret;
+    }
+
+    public void setAppSecret(String appSecret) {
+        this.appSecret = appSecret;
+    }
+
+    public String getPermanentCode() {
+        return permanentCode;
+    }
+
+    public void setPermanentCode(String permanentCode) {
+        this.permanentCode = permanentCode;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("appId", appId)
+                .add("permanentCode", permanentCode)
+                .add("permanentCode", permanentCode)
+                .toString();
+    }
+
+}

+ 42 - 0
src/main/java/com/uas/eis/beans/req/CrmAddReq.java

@@ -0,0 +1,42 @@
+package com.uas.eis.beans.req;
+
+import com.google.common.base.MoreObjects;
+import com.uas.eis.beans.result.Goods;
+
+import java.util.Map;
+
+/**
+ * CRM添加接口参数
+ * Created by zhongcy on 2016/12/30.
+ */
+public class CrmAddReq<T> extends BaseOfOpenUserIdReq{
+
+    private static final long serialVersionUID = 9135811674969239762L;
+
+    private T data;
+
+    public CrmAddReq(T data) {
+        this.data = data;
+    }
+
+    public CrmAddReq() {
+    }
+
+    public T getData() {
+        return data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("corpAccessToken", corpAccessToken)
+                .add("corpId", corpId)
+                .add("currentOpenUserId", currentOpenUserId)
+                .add("data", data)
+                .toString();
+    }
+}

+ 52 - 0
src/main/java/com/uas/eis/beans/req/CrmGetReq.java

@@ -0,0 +1,52 @@
+package com.uas.eis.beans.req;
+
+
+import com.google.common.base.MoreObjects;
+
+/**
+ * Crm获取详情接口参数
+ * Created by zhongcy on 2017/1/9.
+ */
+public class CrmGetReq extends BaseReq{
+
+    private static final long serialVersionUID = -6899653224372546750L;
+
+    private String currentOpenUserId;
+
+    private String apiName;
+
+    private String dataId;
+
+    public String getCurrentOpenUserId() {
+        return currentOpenUserId;
+    }
+
+    public void setCurrentOpenUserId(String currentOpenUserId) {
+        this.currentOpenUserId = currentOpenUserId;
+    }
+
+    public String getApiName() {
+        return apiName;
+    }
+
+    public void setApiName(String apiName) {
+        this.apiName = apiName;
+    }
+
+    public String getDataId() {
+        return dataId;
+    }
+
+    public void setDataId(String dataId) {
+        this.dataId = dataId;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("currentOpenUserId", currentOpenUserId)
+                .add("apiName", apiName)
+                .add("dataId", dataId)
+                .toString();
+    }
+}

+ 236 - 0
src/main/java/com/uas/eis/beans/req/CrmQueryReq.java

@@ -0,0 +1,236 @@
+package com.uas.eis.beans.req;
+
+import com.google.common.base.MoreObjects;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Query Arg
+ * Created by zhongcy on 2017/1/6.
+ */
+public class CrmQueryReq extends BaseReq{
+
+    private static final long serialVersionUID = -6119269380581225350L;
+
+    private String currentOpenUserId;
+
+    private String apiName;
+
+    private SearchQuery searchQuery;
+
+    public String getCurrentOpenUserId() {
+        return currentOpenUserId;
+    }
+
+    public void setCurrentOpenUserId(String currentOpenUserId) {
+        this.currentOpenUserId = currentOpenUserId;
+    }
+
+    public String getApiName() {
+        return apiName;
+    }
+
+    public void setApiName(String apiName) {
+        this.apiName = apiName;
+    }
+
+    public SearchQuery getSearchQuery() {
+        return searchQuery;
+    }
+
+    public void setSearchQuery(SearchQuery searchQuery) {
+        this.searchQuery = searchQuery;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("currentOpenUserId", currentOpenUserId)
+                .add("apiName", apiName)
+                .add("searchQuery", searchQuery)
+                .toString();
+    }
+
+    public static class SearchQuery{
+        //偏移量
+        private int offset = 0;
+
+        //获取数据条数,取最大值1000
+        private int limit = 500;
+
+        private DataProjection dataProjection;
+
+        private List<RangeCondition> rangeConditions;
+
+        private List<Order> orders;
+
+        public int getOffset() {
+            return offset;
+        }
+
+        public void setOffset(int offset) {
+            this.offset = offset;
+        }
+
+        public int getLimit() {
+            return limit;
+        }
+
+        public void setLimit(int limit) {
+            this.limit = limit;
+        }
+
+        public DataProjection getDataProjection() {
+            return dataProjection;
+        }
+
+        public void setDataProjection(DataProjection dataProjection) {
+            this.dataProjection = dataProjection;
+        }
+
+        public List<RangeCondition> getRangeConditions() {
+            return rangeConditions;
+        }
+
+        public void setRangeConditions(List<RangeCondition> rangeConditions) {
+            this.rangeConditions = rangeConditions;
+        }
+
+        public List<Order> getOrders() {
+            return orders;
+        }
+
+        public void setOrders(List<Order> orders) {
+            this.orders = orders;
+        }
+
+        @Override
+        public String toString() {
+            return MoreObjects.toStringHelper(this)
+                    .add("offset", offset)
+                    .add("limit", limit)
+                    .add("dataProjection", dataProjection)
+                    .add("rangeConditions", rangeConditions)
+                    .add("orders", orders)
+                    .toString();
+        }
+    }
+    public static class DataProjection{
+        private List<String> fieldNames = Arrays.asList("_id","name","last_modified_time");
+
+        public List<String> getFieldNames() {
+            return fieldNames;
+        }
+
+        public void setFieldNames(List<String> fieldNames) {
+            this.fieldNames = fieldNames;
+        }
+
+        @Override
+        public String toString() {
+            return MoreObjects.toStringHelper(this)
+                    .add("fieldNames", fieldNames)
+                    .toString();
+        }
+    }
+
+    public static class RangeCondition{
+        private String fieldName = "last_modified_time";
+
+        private Long from;
+
+        //默认不包含最低值
+        private boolean includeLower = false;
+
+        private Long to = 4102358400000L;
+
+        private boolean includeUpper = false;
+
+
+        public String getFieldName() {
+            return fieldName;
+        }
+
+        public void setFieldName(String fieldName) {
+            this.fieldName = fieldName;
+        }
+
+        public Long getFrom() {
+            return from;
+        }
+
+        public void setFrom(Long from) {
+            this.from = from;
+        }
+
+        public boolean isIncludeLower() {
+            return includeLower;
+        }
+
+        public void setIncludeLower(boolean includeLower) {
+            this.includeLower = includeLower;
+        }
+
+        public Long getTo() {
+            return to;
+        }
+
+        public void setTo(Long to) {
+            this.to = to;
+        }
+
+        public boolean isIncludeUpper() {
+            return includeUpper;
+        }
+
+        public void setIncludeUpper(boolean includeUpper) {
+            this.includeUpper = includeUpper;
+        }
+
+        @Override
+        public String toString() {
+            return MoreObjects.toStringHelper(this)
+                    .add("fieldName", fieldName)
+                    .add("from", from)
+                    .add("includeLower", includeLower)
+                    .add("to", to)
+                    .add("includeUpper", includeUpper)
+                    .toString();
+        }
+    }
+
+    public static class Order{
+        //降序
+        private boolean ascending = false;
+
+        //字段,默认按照最后更新时间排序
+        private String field = "last_modified_time";
+
+        public boolean isAscending() {
+            return ascending;
+        }
+
+        public void setAscending(boolean ascending) {
+            this.ascending = ascending;
+        }
+
+        public String getField() {
+            return field;
+        }
+
+        public void setField(String field) {
+            this.field = field;
+        }
+
+        @Override
+        public String toString() {
+            return MoreObjects.toStringHelper(this)
+                    .add("ascending", ascending)
+                    .add("field", field)
+                    .toString();
+        }
+    }
+
+}
+

+ 50 - 0
src/main/java/com/uas/eis/beans/req/CrmUpdateReq.java

@@ -0,0 +1,50 @@
+package com.uas.eis.beans.req;
+
+import com.google.common.base.MoreObjects;
+
+/**
+ * Crm更新对象数据参数
+ * Created by zhongcy on 2017/1/4.
+ */
+public class CrmUpdateReq<T> extends BaseOfOpenUserIdReq {
+    private static final long serialVersionUID = -3661876864620608225L;
+
+    private String dataId;
+
+    private T data;
+
+    public CrmUpdateReq() {
+    }
+
+    public CrmUpdateReq(String dataId, T data) {
+        this.dataId = dataId;
+        this.data = data;
+    }
+
+    public String getDataId() {
+        return dataId;
+    }
+
+    public void setDataId(String dataId) {
+        this.dataId = dataId;
+    }
+
+    public T getData() {
+        return data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("corpAccessToken", corpAccessToken)
+                .add("corpId", corpId)
+                .add("currentOpenUserId", currentOpenUserId)
+                .add("dataId", dataId)
+                .add("data", data)
+                .toString();
+    }
+}

+ 49 - 0
src/main/java/com/uas/eis/beans/req/OpenUserIdReq.java

@@ -0,0 +1,49 @@
+package com.uas.eis.beans.req;
+
+import com.google.common.base.MoreObjects;
+
+/**
+ * 封装通过code获取 openUserId 请求参数的JaveBean
+ * 
+ * @author huanghp
+ * @date 2015年8月28日
+ */
+public class OpenUserIdReq implements Req {
+
+    private static final long serialVersionUID = 7019560397749052017L;
+
+    /**
+     * appAccessToken
+     */
+    private String appAccessToken;
+
+    /**
+     * 临时身份票据
+     */
+    private String code;
+
+    public String getAppAccessToken() {
+        return appAccessToken;
+    }
+
+    public void setAppAccessToken(String appAccessToken) {
+        this.appAccessToken = appAccessToken;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("appAccessToken", appAccessToken)
+                .add("code", code)
+                .toString();
+    }
+
+}

+ 7 - 0
src/main/java/com/uas/eis/beans/req/Req.java

@@ -0,0 +1,7 @@
+package com.uas.eis.beans.req;
+
+import java.io.Serializable;
+
+public interface Req extends Serializable {
+
+}

+ 52 - 0
src/main/java/com/uas/eis/beans/result/AppTokenResult.java

@@ -0,0 +1,52 @@
+package com.uas.eis.beans.result;
+
+import com.google.common.base.MoreObjects;
+
+
+/**
+ * 封装获取到的AppToken结果的JavaBean
+ * 
+ * @author huanghp
+ * @date 2015年8月28日
+ */
+public class AppTokenResult extends BaseResult {
+
+    private static final long serialVersionUID = 7698338379605078704L;
+
+    /**
+     * appAccessToken
+     */
+    private String appAccessToken;
+
+    /**
+     * appToken 超时时间(单位为:分钟)
+     */
+    private long expiresIn;
+
+    public String getAppAccessToken() {
+        return appAccessToken;
+    }
+
+    public void setAppAccessToken(String appAccessToken) {
+        this.appAccessToken = appAccessToken;
+    }
+
+    public long getExpiresIn() {
+        return expiresIn;
+    }
+
+    public void setExpiresIn(long expiresIn) {
+        this.expiresIn = expiresIn;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("errorCode", errorCode)
+                .add("errorMessage", errorMessage)
+                .add("appAccessToken", appAccessToken)
+                .add("expiresIn", expiresIn)
+                .toString();
+    }
+
+}

+ 48 - 0
src/main/java/com/uas/eis/beans/result/BaseResult.java

@@ -0,0 +1,48 @@
+package com.uas.eis.beans.result;
+
+import com.google.common.base.MoreObjects;
+
+import java.io.Serializable;
+
+/**
+ * Created by zhongcy on 2016/4/18.
+ */
+public class BaseResult implements Serializable {
+
+    private static final long serialVersionUID = -1694441659920313916L;
+
+    /**
+     * 结果返回码(0表示成功)
+     */
+    protected int errorCode = 99;
+
+    /**
+     * 返回结果信息
+     */
+    protected String errorMessage;
+
+    public int getErrorCode() {
+        return errorCode;
+    }
+
+    public void setErrorCode(int errorCode) {
+        this.errorCode = errorCode;
+    }
+
+    public String getErrorMessage() {
+        return errorMessage;
+    }
+
+    public void setErrorMessage(String errorMessage) {
+        this.errorMessage = errorMessage;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("errorCode", errorCode)
+                .add("errorMessage", errorMessage)
+                .toString();
+    }
+
+}

+ 65 - 0
src/main/java/com/uas/eis/beans/result/CorpAccessTokenResult.java

@@ -0,0 +1,65 @@
+package com.uas.eis.beans.result;
+
+import com.google.common.base.MoreObjects;
+
+/**
+ * 封装获取到的CorpAccessToken结果的JavaBean
+ * 
+ * @author huanghp
+ * @date 2015年8月28日
+ */
+public class CorpAccessTokenResult extends BaseResult {
+
+    private static final long serialVersionUID = -4995204525912210225L;
+
+    /**
+     * corpAccessToken
+     */
+    private String corpAccessToken;
+
+    /**
+     * corpId
+     */
+    private String corpId;
+
+    /**
+     * corpAccessToken 超时时间(单位为:秒)
+     */
+    private long expiresIn;
+
+    public String getCorpAccessToken() {
+        return corpAccessToken;
+    }
+
+    public void setCorpAccessToken(String corpAccessToken) {
+        this.corpAccessToken = corpAccessToken;
+    }
+
+    public String getCorpId() {
+        return corpId;
+    }
+
+    public void setCorpId(String corpId) {
+        this.corpId = corpId;
+    }
+
+    public long getExpiresIn() {
+        return expiresIn;
+    }
+
+    public void setExpiresIn(long expiresIn) {
+        this.expiresIn = expiresIn;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("errorCode", errorCode)
+                .add("errorMessage", errorMessage)
+                .add("corpAccessToken", corpAccessToken)
+                .add("corpId", corpId)
+                .add("expiresIn", expiresIn)
+                .toString();
+    }
+
+}

+ 29 - 0
src/main/java/com/uas/eis/beans/result/CrmAddResult.java

@@ -0,0 +1,29 @@
+package com.uas.eis.beans.result;
+
+import com.google.common.base.MoreObjects;
+
+/**
+ * CRM crete接口返回结果
+ * Created by zhongcy on 2016/12/30.
+ */
+public class CrmAddResult extends BaseResult {
+
+    private static final long serialVersionUID = -6938203198421600660L;
+
+    private String dataId;
+
+    public String getDataId() {
+        return dataId;
+    }
+
+    public void setDataId(String dataId) {
+        this.dataId = dataId;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("dataId", dataId)
+                .toString();
+    }
+}

+ 34 - 0
src/main/java/com/uas/eis/beans/result/CrmGetResult.java

@@ -0,0 +1,34 @@
+package com.uas.eis.beans.result;
+
+import com.google.common.base.MoreObjects;
+
+import java.util.Map;
+
+/**
+ * 获取详情接口返回值
+ * Created by zhongcy on 2017/1/9.
+ */
+public class CrmGetResult extends BaseResult{
+
+    private static final long serialVersionUID = 4289877461866887841L;
+
+    /**
+     * 数据详情结果
+     */
+    private Map<String, Object> data;
+
+    public Map<String, Object> getData() {
+        return data;
+    }
+
+    public void setData(Map<String, Object> data) {
+        this.data = data;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("data", data)
+                .toString();
+    }
+}

+ 43 - 0
src/main/java/com/uas/eis/beans/result/CrmQueryResult.java

@@ -0,0 +1,43 @@
+package com.uas.eis.beans.result;
+
+import com.google.common.base.MoreObjects;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Crm查询结果
+ * Created by zhongcy on 2017/1/6.
+ */
+public class CrmQueryResult extends BaseResult {
+
+    private static final long serialVersionUID = -2706748557128822040L;
+
+    private int totalNumber;
+
+    private List<Map<String, Object>> datas;
+
+    public int getTotalNumber() {
+        return totalNumber;
+    }
+
+    public void setTotalNumber(int totalNumber) {
+        this.totalNumber = totalNumber;
+    }
+
+    public List<Map<String, Object>> getDatas() {
+        return datas;
+    }
+
+    public void setDatas(List<Map<String, Object>> datas) {
+        this.datas = datas;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("totalNumber", totalNumber)
+                .add("datas", datas)
+                .toString();
+    }
+}

+ 129 - 0
src/main/java/com/uas/eis/beans/result/Goods.java

@@ -0,0 +1,129 @@
+package com.uas.eis.beans.result;
+
+import com.google.common.base.MoreObjects;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+public class Goods implements Serializable {
+
+    private static final long serialVersionUID = 3486839815456351252L;
+
+    private String dataObjectApiName;
+    private String unit;
+    private List<String> owner;
+    private boolean is_spec;
+    private String remark;
+    private Double standard_price;
+    private String product_line;
+    private String name;
+    private String category;
+    private List<Map<String,Object>> sku;
+    private String _id;
+
+    public String get_id() {
+        return _id;
+    }
+
+    public void set_id(String _id) {
+        this._id = _id;
+    }
+
+    public String getDataObjectApiName() {
+        return dataObjectApiName;
+    }
+
+    public void setDataObjectApiName(String dataObjectApiName) {
+        this.dataObjectApiName = dataObjectApiName;
+    }
+
+    public String getUnit() {
+        return unit;
+    }
+
+    public void setUnit(String unit) {
+        this.unit = unit;
+    }
+
+    public List<String> getOwner() {
+        return owner;
+    }
+
+    public void setOwner(List<String> owner) {
+        this.owner = owner;
+    }
+
+    public boolean isIs_spec() {
+        return is_spec;
+    }
+
+    public void setIs_spec(boolean is_spec) {
+        this.is_spec = is_spec;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Double getStandard_price() {
+        return standard_price;
+    }
+
+    public void setStandard_price(Double standard_price) {
+        this.standard_price = standard_price;
+    }
+
+    public String getProduct_line() {
+        return product_line;
+    }
+
+    public void setProduct_line(String product_line) {
+        this.product_line = product_line;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getCategory() {
+        return category;
+    }
+
+    public void setCategory(String category) {
+        this.category = category;
+    }
+
+    public List<Map<String, Object>> getSku() {
+        return sku;
+    }
+
+    public void setSku(List<Map<String, Object>> sku) {
+        this.sku = sku;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("dataObjectApiName", dataObjectApiName)
+                .add("unit", unit)
+                .add("owner", owner)
+                .add("is_spec", is_spec)
+                .add("remark", remark)
+                .add("standard_price", standard_price)
+                .add("product_line", product_line)
+                .add("name", name)
+                .add("category", category)
+                .add("sku", sku)
+                .add("_id",_id)
+                .toString();
+    }
+}

+ 51 - 0
src/main/java/com/uas/eis/beans/result/OpenUserIdResult.java

@@ -0,0 +1,51 @@
+package com.uas.eis.beans.result;
+
+import com.google.common.base.MoreObjects;
+
+/**
+ * 封装获取到的OpenUserId 结果的JavaBean
+ * 
+ * @author huanghp
+ * @date 2015年8月28日
+ */
+public class OpenUserIdResult extends BaseResult {
+
+    private static final long serialVersionUID = 7403143650678784355L;
+
+    /**
+     * openUserId
+     */
+    private String openUserId;
+
+    /**
+     * corpId
+     */
+    private String corpId;
+
+    public String getOpenUserId() {
+        return openUserId;
+    }
+
+    public void setOpenUserId(String openUserId) {
+        this.openUserId = openUserId;
+    }
+
+    public String getCorpId() {
+        return corpId;
+    }
+
+    public void setCorpId(String corpId) {
+        this.corpId = corpId;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("errorCode", errorCode)
+                .add("errorMessage", errorMessage)
+                .add("openUserId", openUserId)
+                .add("corpId", corpId)
+                .toString();
+    }
+
+}

+ 41 - 0
src/main/java/com/uas/eis/beans/result/ProductAddResult.java

@@ -0,0 +1,41 @@
+package com.uas.eis.beans.result;
+
+import com.google.common.base.MoreObjects;
+
+/**
+ *
+ */
+public class ProductAddResult extends BaseResult {
+
+    private static final long serialVersionUID = -1877511411491870320L;
+
+    private Integer productId;
+    private String productCode;
+
+    public Integer getProductId() {
+        return productId;
+    }
+
+    public void setProductId(Integer productId) {
+        this.productId = productId;
+    }
+
+    public String getProductCode() {
+        return productCode;
+    }
+
+    public void setProductCode(String productCode) {
+        this.productCode = productCode;
+    }
+
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("errorCode", errorCode)
+                .add("errorMessage", errorMessage)
+                .add("productId", productId)
+                .add("productCode", productCode)
+                .toString();
+    }
+}

+ 53 - 0
src/main/java/com/uas/eis/beans/result/ProductDto.java

@@ -0,0 +1,53 @@
+package com.uas.eis.beans.result;
+
+import com.google.common.base.MoreObjects;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ *
+ */
+public class ProductDto implements Serializable {
+
+    private String dataObjectApiName;
+    private List<Map<String,Object>> spec_and_value;
+    private String spu_id;
+
+    public List<Map<String, Object>> getSpec_and_value() {
+        return spec_and_value;
+    }
+
+    public void setSpec_and_value(List<Map<String, Object>> spec_and_value) {
+        this.spec_and_value = spec_and_value;
+    }
+
+
+
+    public String getDataObjectApiName() {
+        return dataObjectApiName;
+    }
+
+    public void setDataObjectApiName(String dataObjectApiName) {
+        this.dataObjectApiName = dataObjectApiName;
+    }
+
+    public String getSpu_id() {
+        return spu_id;
+    }
+
+    public void setSpu_id(String spu_id) {
+        this.spu_id = spu_id;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("dataObjectApiName", dataObjectApiName)
+                .add("spec_and_value", spec_and_value)
+                .add("spu_id", spu_id)
+                .toString();
+    }
+}

+ 39 - 0
src/main/java/com/uas/eis/beans/result/Result.java

@@ -0,0 +1,39 @@
+package com.uas.eis.beans.result;
+
+import java.io.Serializable;
+
+public class Result<T> implements Serializable {
+
+    private static final long serialVersionUID = 5753982789557686887L;
+
+    private Integer code = 0;
+
+    private String msg = "成功";
+
+    private T data;
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    public T getData() {
+        return data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+
+}

+ 1 - 1
src/main/java/com/uas/eis/core/support/SpringDynamicCronTask.java

@@ -31,7 +31,7 @@ public class SpringDynamicCronTask implements SchedulingConfigurer {
 	@Override
 	public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
 		String activeProFiles = env.getActiveProfiles()[0];
-		if("prod".equals(activeProFiles)) {
+		if("dev".equals(activeProFiles)) {
 			logger.info(String.format("运行环境:%s;注册TASK:%s",activeProFiles,env.getProperty("Task.SyncProductsMethod")));
 			taskRegistrar.addCronTask(() -> {
 				//业务逻辑

+ 10 - 0
src/main/java/com/uas/eis/exception/AccessTokenException.java

@@ -0,0 +1,10 @@
+package com.uas.eis.exception;
+
+@SuppressWarnings("serial")
+public class AccessTokenException extends BaseException {
+
+    public AccessTokenException(int code, String msg) {
+        super(code, msg);
+    }
+
+}

+ 51 - 0
src/main/java/com/uas/eis/exception/AesException.java

@@ -0,0 +1,51 @@
+package com.uas.eis.exception;
+
+/**
+ * @author 黄虎平
+ * @date 2015年9月1日
+ */
+@SuppressWarnings("serial")
+public class AesException extends BaseException {
+
+    public static final int OK = 0;
+
+    public static final int VALIDATE_SIGNATURE_ERROR = -40001;
+
+    public static final int PARSE_XML_ERROR = -40002;
+
+    public static final int COMPUTE_SIGNATURE_ERROR = -40003;
+
+    public static final int ILLEGAL_AES_KEY = -40004;
+
+    public static final int ENCRYPT_AES_ERROR = -40006;
+
+    public static final int DECRYPT_AES_ERROR = -40007;
+
+    public static final int ILLEGAL_BUFFER = -40008;
+    
+    public AesException(int code) {
+        super(code, getMessage(code));
+    }
+
+    private static String getMessage(int code) {
+        switch (code) {
+            case VALIDATE_SIGNATURE_ERROR:
+                return "签名验证错误";
+            case PARSE_XML_ERROR:
+                return "xml解析失败";
+            case COMPUTE_SIGNATURE_ERROR:
+                return "sha加密生成签名失败";
+            case ILLEGAL_AES_KEY:
+                return "SymmetricKey非法";
+            case ENCRYPT_AES_ERROR:
+                return "aes加密失败";
+            case DECRYPT_AES_ERROR:
+                return "aes解密失败";
+            case ILLEGAL_BUFFER:
+                return "解密后得到的buffer非法";
+            default:
+                return null; // cannot be
+        }
+    }
+
+}

+ 10 - 0
src/main/java/com/uas/eis/exception/AppAccessTokenRequestException.java

@@ -0,0 +1,10 @@
+package com.uas.eis.exception;
+
+@SuppressWarnings("serial")
+public class AppAccessTokenRequestException extends AccessTokenException {
+
+    public AppAccessTokenRequestException(int code, String msg) {
+        super(code, msg);
+    }
+
+}

+ 52 - 0
src/main/java/com/uas/eis/exception/BaseException.java

@@ -0,0 +1,52 @@
+package com.uas.eis.exception;
+
+/**
+ * @author
+ * @date
+ */
+@SuppressWarnings("serial")
+public class BaseException extends Exception {
+
+    /**
+     * 异常代码
+     */
+    private int code;
+
+    /**
+     * 异常信息
+     */
+    private String msg;
+
+    public BaseException(int code, String msg) {
+        super(code + ":" + msg);
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public BaseException(Throwable cause) {
+        super(cause);
+    }
+
+    public BaseException(int code, String msg, Throwable cause) {
+        super(code + ":" + msg, cause);
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+}

+ 10 - 0
src/main/java/com/uas/eis/exception/CorpAccessTokenRequestException.java

@@ -0,0 +1,10 @@
+package com.uas.eis.exception;
+
+@SuppressWarnings("serial")
+public class CorpAccessTokenRequestException extends AccessTokenException {
+    
+    public CorpAccessTokenRequestException(int code, String msg) {
+        super(code, msg);
+    }
+    
+}

+ 45 - 0
src/main/java/com/uas/eis/manager/AccessTokenManager.java

@@ -0,0 +1,45 @@
+package com.uas.eis.manager;
+
+
+import com.uas.eis.beans.CorpAccessToken;
+import com.uas.eis.exception.AccessTokenException;
+import com.uas.eis.exception.AppAccessTokenRequestException;
+
+/**
+ * AccessToken缓存管理接口
+ * @author gaoshengbo
+ *
+ */
+public interface AccessTokenManager {
+
+    /**
+     * 重置缓存中的AppAccessToken
+     *
+     * @throws AppAccessTokenRequestException
+     */
+    public void resetAppAccessToken() throws AppAccessTokenRequestException;
+
+    /**
+     * 重置缓存中的CorpAccessToken
+     *
+     * @throws AccessTokenException
+     */
+    public void resetCorpAccessToken() throws AccessTokenException;
+
+    /**
+     * AppAccessToken是企业应用的全局唯一票据,需要AppId和AppSecret来换取, 不同的AppSecret会返回不同的AppAccessToken。
+     * 正常情况下AppAccessToken有效期为2592000秒(30天), 有效期内重复获取返回相同结果,并自动续期。 企业需要做适当缓存
+     *
+     * @return
+     */
+    public String getAppAccessToken() throws AppAccessTokenRequestException;
+
+    /**
+     * CorpAccessToken是企业应用访问相应公司数据的全局唯一票据, 拉取信息和发送消息的接口都需要携带CorpAccessToken和CorpId。
+     * 正常情况下CorpAccessToken的有效期为7200秒,有效期内重复获取返回相同结果,并自动续期。 企业需要做适当缓存
+     *
+     * @return
+     */
+    public CorpAccessToken getCorpAccessToken() throws AccessTokenException;
+
+}

+ 15 - 0
src/main/java/com/uas/eis/manager/OpenUserIdManager.java

@@ -0,0 +1,15 @@
+package com.uas.eis.manager;
+
+import com.uas.eis.beans.result.OpenUserIdResult;
+import com.uas.eis.exception.AccessTokenException;
+
+public interface OpenUserIdManager {
+
+    /**
+     * 根据code获取纷享开放平台openUserId
+     * @param code 纷享开放平台下发的员工身份临时票据,有效期为十分钟,有效期内使用一次后则会过期
+     * @return
+     * @throws AccessTokenException
+     */
+    public OpenUserIdResult getOpenUserId(String code) throws AccessTokenException;
+}

+ 33 - 0
src/main/java/com/uas/eis/manager/ProductManager.java

@@ -0,0 +1,33 @@
+package com.uas.eis.manager;
+
+
+import com.uas.eis.beans.result.*;
+import com.uas.eis.exception.AccessTokenException;
+
+/**
+ *
+ * 
+ * @author
+ * @date
+ */
+public interface ProductManager {
+
+    /**
+     * 添加商品
+     *
+     * @param
+     * @return
+     * @throws AccessTokenException
+     */
+    public CrmAddResult addGoods(Goods goods) throws AccessTokenException;
+
+    /**
+     * 修改商品
+     *
+     * @param
+     * @return
+     * @throws AccessTokenException
+     */
+    public BaseResult updateGoods(Goods goods) throws AccessTokenException;
+
+}

+ 145 - 0
src/main/java/com/uas/eis/manager/impl/AccessTokenManagerImpl.java

@@ -0,0 +1,145 @@
+package com.uas.eis.manager.impl;
+
+import com.google.common.collect.Maps;
+import com.uas.eis.beans.CorpAccessToken;
+import com.uas.eis.beans.req.AppTokenReq;
+import com.uas.eis.beans.req.CorpAccessTokenReq;
+import com.uas.eis.beans.result.AppTokenResult;
+import com.uas.eis.beans.result.CorpAccessTokenResult;
+import com.uas.eis.exception.AccessTokenException;
+import com.uas.eis.exception.AppAccessTokenRequestException;
+import com.uas.eis.exception.CorpAccessTokenRequestException;
+import com.uas.eis.manager.AccessTokenManager;
+import com.uas.eis.utils.Configuration;
+import com.uas.eis.utils.OpenAPIUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+
+@Service("accessTokenManager")
+public class AccessTokenManagerImpl implements AccessTokenManager {
+
+    private static final String KEY_EXPIRES_IN = "expiresIn";
+
+    private static final String KEY_TOKEN = "token";
+
+    private static final String APP_ACCESS_TOKEN_KEY_PREX = "appAccessToken_";
+
+    private static final String CORP_ACCESS_TOKEN_KEY_PREX = "corpAccessToken_";
+
+    @Resource(name = "configuration")
+    private Configuration configuration;
+
+    /**
+     * AppAccessToken、CorpAccessToken缓存
+     */
+    private static Map<String, Map<String, Object>> accessTokenMap = Maps.newConcurrentMap();
+
+    private static Map<String, Object> setCorpAccessToken(CorpAccessTokenResult result) {
+        CorpAccessToken corpAccessToken = new CorpAccessToken();
+        corpAccessToken.setCorpAccessToken(result.getCorpAccessToken());
+        corpAccessToken.setCorpId(result.getCorpId());
+
+        Map<String, Object> token = Maps.newHashMap();
+        // 减去3分钟,以免过时
+        token.put(KEY_EXPIRES_IN, (result.getExpiresIn() - 3 * 60) * 1000 + System.currentTimeMillis());
+        token.put(KEY_TOKEN, corpAccessToken);
+        return token;
+    }
+
+    @Override
+    public void resetAppAccessToken() throws AppAccessTokenRequestException {
+        accessTokenMap.remove(APP_ACCESS_TOKEN_KEY_PREX.concat(configuration.getAppId()));
+        getAppAccessToken();
+    }
+
+    @Override
+    public void resetCorpAccessToken() throws AccessTokenException {
+        accessTokenMap.remove(CORP_ACCESS_TOKEN_KEY_PREX.concat(configuration.getAppId()).concat(
+                configuration.getPermanentCode()));
+        getCorpAccessToken();
+    }
+
+    @Override
+    public String getAppAccessToken() throws AppAccessTokenRequestException {
+        String key = APP_ACCESS_TOKEN_KEY_PREX.concat(configuration.getAppId());
+        Map<String, Object> token = accessTokenMap.get(key);
+
+        if (token != null) {
+            long expiresIn = (Long) token.get(KEY_EXPIRES_IN);
+
+            if (System.currentTimeMillis() < expiresIn) {
+                return (String) token.get(KEY_TOKEN);
+            }
+            accessTokenMap.remove(key);
+        }
+
+        String appAccessToken = null;
+        synchronized (this) {
+            token = accessTokenMap.get(key);
+
+            // 多线程环境下,其他线程可能已经获得最新appAccessToken,直接返回
+            if (token != null) {
+                return (String) token.get(KEY_TOKEN);
+            }
+            AppTokenReq req = new AppTokenReq();
+            req.setAppId(configuration.getAppId());
+            req.setAppSecret(configuration.getAppSecret());
+            AppTokenResult result = OpenAPIUtils.getAppToken(req);
+            if (result.getErrorCode() != 0) {
+                throw new AppAccessTokenRequestException(result.getErrorCode(), result.getErrorMessage());
+            }
+            appAccessToken = result.getAppAccessToken();
+            token = Maps.newHashMap();
+            // 减去3分钟,以免过时
+            token.put(KEY_EXPIRES_IN, (result.getExpiresIn() - 3 * 60) * 1000 + System.currentTimeMillis());
+            token.put(KEY_TOKEN, appAccessToken);
+            accessTokenMap.put(key, token);
+            return appAccessToken;
+        }
+    }
+
+    @Override
+    public CorpAccessToken getCorpAccessToken() throws AccessTokenException {
+        String key =
+                CORP_ACCESS_TOKEN_KEY_PREX.concat(configuration.getAppId()).concat(configuration.getPermanentCode());
+        Map<String, Object> token = accessTokenMap.get(key);
+
+        if (token != null) {
+            long expiresIn = (Long) token.get(KEY_EXPIRES_IN);
+            if (System.currentTimeMillis() < expiresIn) {
+                return (CorpAccessToken) token.get(KEY_TOKEN);
+            }
+            accessTokenMap.remove(key);
+        }
+
+        synchronized (this) {
+            token = accessTokenMap.get(key);
+            // 多线程环境下,其他线程可能已经获得最新corpAccessToken,直接返回
+            if (token != null) {
+                return (CorpAccessToken) token.get(KEY_TOKEN);
+            }
+            
+            CorpAccessTokenReq req = new CorpAccessTokenReq();
+            req.setAppId(configuration.getAppId());
+            req.setAppSecret(configuration.getAppSecret());
+            req.setPermanentCode(configuration.getPermanentCode());
+            CorpAccessTokenResult corpAccessTokenResult =  OpenAPIUtils.getCorpToken(req);
+            if (corpAccessTokenResult != null && corpAccessTokenResult.getErrorCode() == 0) {
+                token = setCorpAccessToken(corpAccessTokenResult);
+            }
+
+            if (token == null) {
+                throw new CorpAccessTokenRequestException(corpAccessTokenResult.getErrorCode(),corpAccessTokenResult.getErrorMessage());
+            }
+            accessTokenMap.put(key, token);
+            CorpAccessToken corpAccessToken = (CorpAccessToken) token.get(KEY_TOKEN);
+            if (corpAccessToken == null) {
+                throw new CorpAccessTokenRequestException(corpAccessTokenResult.getErrorCode(),corpAccessTokenResult.getErrorMessage());
+            }
+            return corpAccessToken;
+        }
+    }
+}

+ 28 - 0
src/main/java/com/uas/eis/manager/impl/OpenUserIdManagerImpl.java

@@ -0,0 +1,28 @@
+package com.uas.eis.manager.impl;
+
+import com.uas.eis.beans.req.OpenUserIdReq;
+import com.uas.eis.beans.result.OpenUserIdResult;
+import com.uas.eis.exception.AccessTokenException;
+import com.uas.eis.manager.AccessTokenManager;
+import com.uas.eis.manager.OpenUserIdManager;
+import com.uas.eis.utils.OpenAPIUtils;
+import org.springframework.stereotype.Service;
+
+@Service("openUserIdManager")
+public class OpenUserIdManagerImpl implements OpenUserIdManager {
+
+    private final AccessTokenManager accessTokenManager;
+
+    public OpenUserIdManagerImpl(AccessTokenManager accessTokenManager) {
+        this.accessTokenManager = accessTokenManager;
+    }
+
+    @Override
+    public OpenUserIdResult getOpenUserId(String code) throws AccessTokenException {
+        OpenUserIdReq req = new OpenUserIdReq();
+        req.setCode(code);
+        req.setAppAccessToken(accessTokenManager.getAppAccessToken());
+
+        return OpenAPIUtils.getOpenUserId(req);
+    }
+}

+ 86 - 0
src/main/java/com/uas/eis/manager/impl/ProductManagerImpl.java

@@ -0,0 +1,86 @@
+package com.uas.eis.manager.impl;
+
+import com.uas.eis.beans.CorpAccessToken;
+import com.uas.eis.beans.req.CrmAddReq;
+import com.uas.eis.beans.req.CrmUpdateReq;
+import com.uas.eis.beans.result.BaseResult;
+import com.uas.eis.beans.result.CrmAddResult;
+import com.uas.eis.beans.result.Goods;
+import com.uas.eis.exception.AccessTokenException;
+import com.uas.eis.manager.AccessTokenManager;
+import com.uas.eis.manager.OpenUserIdManager;
+import com.uas.eis.manager.ProductManager;
+import com.uas.eis.utils.Configuration;
+import com.uas.eis.utils.OpenAPIUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service("productManager")
+public class ProductManagerImpl implements ProductManager {
+
+    private final AccessTokenManager accessTokenManager;
+
+    public ProductManagerImpl(AccessTokenManager accessTokenManager, OpenUserIdManager openUserIdManager) {
+        this.accessTokenManager = accessTokenManager;
+        this.openUserIdManager = openUserIdManager;
+    }
+
+    private final OpenUserIdManager openUserIdManager;
+
+    @Resource(name = "configuration")
+    private Configuration configuration;
+
+    @Override
+    public CrmAddResult addGoods(Goods goods) throws AccessTokenException {
+        CrmAddResult crmAddResult = new CrmAddResult();
+
+        CorpAccessToken token = accessTokenManager.getCorpAccessToken();
+
+        String openUserId = configuration.getOpenUserId();
+        //object_data里赋值openUserId
+        List<String> owner = new ArrayList<>();
+        owner.add(openUserId);
+        goods.setOwner(owner);
+
+        Map<String, Object> object_data = new HashMap<>();
+        object_data.put("object_data",goods);
+
+        CrmAddReq crmAddReq = new CrmAddReq();
+        crmAddReq.setCorpAccessToken(token.getCorpAccessToken());
+        crmAddReq.setCorpId(token.getCorpId());
+        crmAddReq.setCurrentOpenUserId(openUserId);
+        crmAddReq.setData(object_data);
+        try {
+            crmAddResult = OpenAPIUtils.createCrmData(crmAddReq);
+        }catch (Exception e) {
+            e.printStackTrace();
+        }
+        return crmAddResult;
+    }
+
+    @Override
+    public BaseResult updateGoods(Goods goods) throws AccessTokenException {
+        BaseResult baseResult = new BaseResult();
+
+        CorpAccessToken token = accessTokenManager.getCorpAccessToken();
+        String openUserId = configuration.getOpenUserId();
+        Map<String, Object> object_data = new HashMap<>();
+        object_data.put("object_data",goods);
+        CrmUpdateReq crmUpdateReq = new CrmUpdateReq();
+        crmUpdateReq.setCorpAccessToken(token.getCorpAccessToken());
+        crmUpdateReq.setCorpId(token.getCorpId());
+        crmUpdateReq.setCurrentOpenUserId(openUserId);
+        crmUpdateReq.setData(object_data);
+        try {
+            baseResult = OpenAPIUtils.updateCrmData(crmUpdateReq);
+        }catch (Exception e) {
+            e.printStackTrace();
+        }
+        return baseResult;
+    }
+}

+ 90 - 0
src/main/java/com/uas/eis/utils/Configuration.java

@@ -0,0 +1,90 @@
+package com.uas.eis.utils;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.stereotype.Service;
+
+/**
+ * 读取Properties配置信息的类
+ * 
+ * @author huanghp
+ * @date 2015年8月28日
+ */
+@Service("configuration")
+public class Configuration {
+
+    /**
+     * 应用Id
+     */
+    @Value("${fs.appId}")
+    private String appId;
+
+    /**
+     * 应用秘钥
+     */
+    @Value("${fs.appSecret}")
+    private String appSecret;
+
+    /**
+     * 永久授权码
+     */
+    @Value("${fs.permanentCode}")
+    private String permanentCode;
+
+    /**
+     * App 约定加密Key
+     */
+    @Value("${fs.token}")
+    private String token;
+
+    /**
+     * App 约定加密AesKey
+     */
+    @Value("${fs.encodingAesKey}")
+    private String encodingAesKey;
+
+    /**
+     * 绑定请求uri
+     */
+    @Value("${fs.authorize.url}")
+    private String fsAuthorizeUrl;
+
+    /**
+     * openUserId
+     */
+    @Value("${fs.openUserId}")
+    private String openUserId;
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public String getAppSecret() {
+        return appSecret;
+    }
+
+    public String getPermanentCode() {
+        return permanentCode;
+    }
+
+    public void setPermanentCode(String permanentCode) {
+        this.permanentCode = permanentCode;
+    }
+
+    public String getToken() {
+        return token;
+    }
+
+    public String getEncodingAesKey() {
+        return encodingAesKey;
+    }
+
+    public String getFsAuthorizeUrl() {
+        return fsAuthorizeUrl;
+    }
+
+    public String getOpenUserId() {
+        return openUserId;
+    }
+
+}

+ 53 - 0
src/main/java/com/uas/eis/utils/Constants.java

@@ -0,0 +1,53 @@
+package com.uas.eis.utils;
+
+public class Constants {
+
+    public static final String SESSION_CURRENT_OPEN_USER_ID = "currentOpenUserId";
+
+    private Constants() {}
+
+    /**
+     * 接口返回码
+     * 
+     * @author gaoshengbo
+     *
+     */
+    public enum interfaceResponseCode {
+
+        APP_ACCESS_TOKEN_EXPIRED(20005, "appAccessToken不存在或者已经过期"),
+
+        CORP_ACCESS_TOKEN_EXPIRED(20016, "corpAccessToken不存在或者已经过期");
+
+        public int code;
+
+        public String msg;
+
+        private interfaceResponseCode(int code, String msg) {
+            this.code = code;
+            this.msg = msg;
+        }
+    }
+
+    /**
+     * 异常码定义
+     * 
+     * @author gaoshengbo
+     *
+     */
+    public enum interfaceException {
+
+        ILLEGAL_ARGUMENT(-8, "参数不合法"),
+
+        INTERFACE_EXCEPTION(-9, "调用接口失败");
+
+        public int code;
+
+        public String msg;
+
+        private interfaceException(int code, String msg) {
+            this.code = code;
+            this.msg = msg;
+        }
+    }
+
+}

+ 227 - 0
src/main/java/com/uas/eis/utils/HttpTookit.java

@@ -0,0 +1,227 @@
+package com.uas.eis.utils;
+
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.net.ssl.SSLContext;
+
+import com.google.gson.Gson;
+import com.uas.eis.beans.HttpResponseMessageVO;
+import com.uas.eis.beans.req.Req;
+import com.uas.eis.beans.result.BaseResult;
+import com.uas.eis.beans.result.Result;
+import com.uas.eis.exception.BaseException;
+import org.apache.commons.lang.StringUtils;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.conn.ssl.SSLContextBuilder;
+import org.apache.http.conn.ssl.TrustStrategy;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * https 请求工具类
+ * 
+ * @author huanghp
+ * @date 2015年8月28日
+ */
+public class HttpTookit {
+
+    private static final Logger LOG = LoggerFactory.getLogger(HttpTookit.class);
+
+    private static final CloseableHttpClient httpClient;
+
+    public static final String CHARSET = "UTF-8";
+
+    static {
+        // 饱含模式实现 httpClient 单例
+        httpClient = createSSLClientDefault();
+    }
+
+    private HttpTookit() {}
+
+    public static CloseableHttpClient createSSLClientDefault() {
+        RequestConfig config = RequestConfig.custom().setConnectTimeout(600000).setSocketTimeout(150000).build();
+
+        try {
+            SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
+                // 信任所有
+                @Override
+                public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+                    return true;
+                }
+            }).build();
+
+            SSLConnectionSocketFactory sslsf =
+                    new SSLConnectionSocketFactory(sslContext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
+
+            return HttpClients.custom().setSSLSocketFactory(sslsf).setDefaultRequestConfig(config).build();
+        } catch (Exception e) {
+            LOG.error("init httpClient error, details:", e);
+        }
+
+        return HttpClients.createDefault();
+    }
+
+    /**
+     * post + json 发送请求
+     * 
+     * @param url
+     * @param parameters
+     * @return @see HttpResponseMessageVO
+     * @throws
+     * @throws
+     */
+    public static HttpResponseMessageVO sendPostByJson(String url, String parameters) throws BaseException {
+        if (StringUtils.isEmpty(url)) {
+            throw new BaseException(Constants.interfaceException.ILLEGAL_ARGUMENT.code,
+                    Constants.interfaceException.ILLEGAL_ARGUMENT.msg + ": url is illegal !");
+        }
+
+        HttpResponseMessageVO httpResponseMessageVO = new HttpResponseMessageVO();
+        CloseableHttpResponse response = null;
+        HttpEntity entity = null;
+        try {
+            StringEntity params = new StringEntity(parameters, CHARSET);
+            HttpPost request = new HttpPost(url);
+            request.addHeader("Content-type", "application/json");
+            request.setEntity(params);
+            response = httpClient.execute(request);
+
+            int statusCode = response.getStatusLine().getStatusCode();
+            entity = response.getEntity();
+            httpResponseMessageVO.setHttpCode(Integer.toString(statusCode));
+            
+            if (statusCode == HttpStatus.SC_OK && entity != null) {
+                httpResponseMessageVO.setContent(EntityUtils.toString(entity, CHARSET));
+            }
+        } catch (Exception e) {
+            LOG.error("sendPostByJson error, details:", e);
+            throw new BaseException(Constants.interfaceException.INTERFACE_EXCEPTION.code,
+                    Constants.interfaceException.INTERFACE_EXCEPTION.msg);
+        }finally{
+            try{
+                if(entity != null){
+                    EntityUtils.consume(entity);
+                }
+                if(response != null){
+                    response.close();
+                }
+            }catch(Exception e){
+                
+            }
+        }
+
+        return httpResponseMessageVO;
+    }
+
+    private static Result<String> sendPostByJson(String url, Req req) {
+        Result<String> result = new Result<String>();
+        if (StringUtils.isEmpty(url)) {
+            result.setCode(Constants.interfaceException.ILLEGAL_ARGUMENT.code);
+            result.setMsg(Constants.interfaceException.ILLEGAL_ARGUMENT.msg + ":" + url);
+            return result;
+        }
+        CloseableHttpResponse response = null;
+        HttpEntity entity = null;
+        try {
+            StringEntity params = new StringEntity(new Gson().toJson(req), CHARSET);
+            HttpPost request = new HttpPost(url);
+            request.addHeader("Content-type", "application/json");
+            request.setEntity(params);
+            response = httpClient.execute(request);
+
+            int statusCode = response.getStatusLine().getStatusCode();
+            entity = response.getEntity();
+            
+            if (statusCode == HttpStatus.SC_OK && entity != null) {
+                result.setData(EntityUtils.toString(entity, CHARSET));
+            } else {
+                result.setCode(Constants.interfaceException.INTERFACE_EXCEPTION.code);
+                result.setMsg(Constants.interfaceException.INTERFACE_EXCEPTION.msg + ":" + url + ",HTTP Status Code:"
+                        + statusCode);
+            }
+        } catch (Exception e) {
+            LOG.error("sendPostByJson error, details:", e);
+            result.setCode(Constants.interfaceException.INTERFACE_EXCEPTION.code);
+            result.setMsg("发送请求异常,请检查url、参数的合法性!异常错误:" + e.getMessage());
+        }finally{
+            try{
+                if(entity != null){
+                    EntityUtils.consume(entity);
+                }
+                if(response != null){
+                    response.close();
+                }
+            }catch(Exception e){
+                
+            }
+        }
+        return result;
+    }
+
+    public static <T extends BaseResult> T sendPostByJson(String url, Req req, Class<T> clazz) {
+        Result<String> result = sendPostByJson(url, req);
+
+        if (result.getCode() == 0) {
+            Gson gson = new Gson();
+            return gson.fromJson(result.getData(), clazz);
+        }
+
+        T t = null;
+
+        try {
+            t = clazz.newInstance();
+            t.setErrorCode(result.getCode());
+            t.setErrorMessage(result.getMsg());
+        } catch (Exception e) {
+            LOG.error("sendPostByJson error, details:", e);
+        }
+
+        return t;
+    }
+
+    public static void main(String[] args) throws Exception {
+        Gson gson = new Gson();
+
+        String token = "testToken";
+        String nonce = "9890d0eb-5aa9-4f45-9a28-0b05fdfb2588";
+        long timestamp = System.currentTimeMillis();
+        String content =
+                "4FE34659FB17F8AEB8971177F9FF04B581B83A0A6E5F5271C1BA41BD112C9F3C21C8E3AF0978FEB57323B5A903997327D65F7C1D1FF6F4308B720F8E52248223CC6E693CC3029B4A9A4784C21D4A064956C883CE64DE09486F053957827D4B8F2D10AAABB9083B806B5F6507887BF8F9";
+
+        String deStr =
+                SigUtils.decodeAES(
+                        "4FE34659FB17F8AEB8971177F9FF04B581B83A0A6E5F5271C1BA41BD112C9F3C21C8E3AF0978FEB57323B5A903997327D65F7C1D1FF6F4308B720F8E52248223CC6E693CC3029B4A9A4784C21D4A064956C883CE64DE09486F053957827D4B8F2D10AAABB9083B806B5F6507887BF8F9",
+                        "x45sdf3sd1231231232xs");
+
+        System.out.println(deStr);
+
+        String sig = SigUtils.getSHA1(token, "" + timestamp, nonce, content);
+
+        Map<String, String> paramMap = new HashMap<String, String>();
+        paramMap.put("nonce", nonce);
+        paramMap.put("timeStamp", "" + timestamp);
+        paramMap.put("content", content);
+        paramMap.put("sig", sig);
+
+        String jsonStr = gson.toJson(paramMap);
+
+        System.out.println(jsonStr);
+        HttpResponseMessageVO httpResponseMessage =
+                sendPostByJson("http://localhost:8080/third-sys/parse/authorize", jsonStr);
+        System.out.println(httpResponseMessage.getContent());
+    }
+
+}

+ 271 - 0
src/main/java/com/uas/eis/utils/OpenAPIUtils.java

@@ -0,0 +1,271 @@
+package com.uas.eis.utils;
+
+
+import com.google.gson.Gson;
+import com.uas.eis.beans.AppReqParmVO;
+import com.uas.eis.beans.HttpResponseMessageVO;
+import com.uas.eis.beans.MsgReceiveParamVO;
+import com.uas.eis.beans.req.*;
+import com.uas.eis.beans.result.*;
+import com.uas.eis.exception.BaseException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 开放平台Api调用的工具类
+ * 
+ * @author huanghp
+ * @date 2015年8月28日
+ */
+public class OpenAPIUtils {
+
+    private static final Logger LOG = LoggerFactory.getLogger(OpenAPIUtils.class);
+
+    /**
+     * 环境为:https://open.fxiaoke.com
+     */
+    private static final String prefix = "https://open.fxiaoke.com";
+
+    /**
+     * 获取AppToken 实现
+     *
+     * @param appTokenReq @see AppTokenReq
+     * @return
+     * @throws Exception
+     */
+    public static AppTokenResult getAppToken(AppTokenReq appTokenReq) {
+        String url = prefix + "/cgi/appAccessToken/get";
+        return doPost(url, appTokenReq, AppTokenResult.class);
+    }
+
+    /**
+     * 获取corpAccessToken 实现
+     *
+     * @param corpAccessTokenReq @see CorpAccessTokenReq
+     * @return
+     * @throws Exception
+     */
+    public static CorpAccessTokenResult getCorpToken(CorpAccessTokenReq corpAccessTokenReq) {
+        String url = prefix + "/cgi/corpAccessToken/get/V2";
+        return doPost(url, corpAccessTokenReq, CorpAccessTokenResult.class);
+    }
+
+    /**
+     * 获取OpenUserId 实现
+     *
+     * @param openUserIdReq @see OpenUserIdReq
+     * @return
+     * @throws Exception
+     */
+    public static OpenUserIdResult getOpenUserId(OpenUserIdReq openUserIdReq) {
+        String url = prefix + "/oauth2/openUserId/get";
+        return doPost(url, openUserIdReq, OpenUserIdResult.class);
+    }
+
+    /*//**
+     * accountBind 实现
+     * 
+     * @param bindAccountArg @see BindAccountArg
+     * @return
+     * @throws Exception
+     *//*
+    public static BindAccountResult bindAccount(BindAccountArg bindAccountArg) {
+        String url = prefix + "/oauth2/accountBind";
+        return doPost(url, bindAccountArg, BindAccountResult.class);
+    }*/
+
+   /* *//**
+     * 获取用户详细信息 实现
+     * 
+     * @see UserInfoArg @see UserInfoArg
+     * @return
+     * @throws Exception
+     *//*
+    public static UserResult getUserInfo(UserInfoArg userInfoArg) {
+        String url = prefix + "/cgi/user/get";
+        return doPost(url, userInfoArg, UserResult.class);
+    }
+
+    *//**
+     * 获取部门列表 实现
+     * 
+     * @param deptListArg @see DeptListArg
+     * @return
+     * @throws Exception
+     *//*
+    public static DeptListResult getDeptList(DeptListArg deptListArg) {
+        String url = prefix + "/cgi/department/list";
+        return doPost(url, deptListArg, DeptListResult.class);
+    }
+
+    *//**
+     * 获取部门人员列表 实现
+     * 
+     * @param deptUserListArg @see DeptUserListArg
+     * @return
+     * @throws Exception
+     *//*
+    public static DeptUserListResult getDeptUserList(DeptUserListArg deptUserListArg) {
+        String url = prefix + "/cgi/user/list";
+        return doPost(url, deptUserListArg, DeptUserListResult.class);
+    }
+
+    *//**
+     * 发送文本消息 实现
+     * 
+     * @param textMsgArg @see TextMsgArg
+     * @return
+     * @throws Exception
+     *//*
+    public static TextMsgResult sendTextMsg(TextMsgArg textMsgArg) {
+        String url = prefix + "/cgi/message/send";
+        return doPost(url, textMsgArg, TextMsgResult.class);
+    }
+    
+    *//**
+     * CRM 字段描述  元数据接口
+     *//*
+    public static CrmDescResult getCrmDesc(CrmDescArg arg) {
+        String url = prefix + "/cgi/crm/object/describe";
+        return doPost(url, arg, CrmDescResult.class);
+    }
+    
+    *//**
+     * CRM 字段描述  修改负责人
+     *//*
+    public static BaseResult changeCrmOwner(CrmChangeOwnerArg arg) {
+        String url = prefix + "/cgi/crm/data/changeOwner";
+        return doPost(url, arg, BaseResult.class);
+    }*/
+    
+    /**
+     * CRM添加 元数据接口
+     */
+    public static CrmAddResult createCrmData(CrmAddReq arg) {
+        String url = prefix + "/cgi/crm/v2/data/create";
+        return doPost(url, arg, CrmAddResult.class);
+    }
+
+    /**
+     * CRM修改 元数据接口
+     */
+    public static BaseResult updateCrmData(CrmUpdateReq arg) {
+        String url = prefix + "/cgi/crm/v2/data/update";
+        return doPost(url, arg, BaseResult.class);
+    }
+
+    /**
+     * CRM作废 元数据接口
+     *//*
+    public static BaseResult dropCrmData(CrmDeleteArg arg) {
+        String url = prefix + "/cgi/crm/data/drop";
+        return doPost(url, arg, BaseResult.class);
+    }*/
+
+    /**
+     * CRM查询列表 元数据接口
+     */
+    public static CrmQueryResult queryCrmData(CrmQueryReq req) {
+        String url = prefix + "/cgi/crm/data/query";
+        return doPost(url, req, CrmQueryResult.class);
+    }
+
+    /**
+     * CRM获取详情 元数据接口
+     */
+    public static CrmGetResult getData(CrmGetReq req) {
+        String url = prefix + "/cgi/crm/data/get";
+        return doPost(url, req, CrmGetResult.class);
+    }
+
+    /**
+     * 验证消息推送请求合法性
+     * 
+     * @param msgReceiveParamVO @see MsgReceiveParamVO
+     * @param token
+     * @return true 表示验证成功,其它表示失败
+     */
+    public static boolean verifyMsgReq(MsgReceiveParamVO msgReceiveParamVO, String token) {
+        boolean verifyResult = false;
+
+        try {
+            String sha1Str = SigUtils.getSHA1(token, msgReceiveParamVO.getTimeStamp(), msgReceiveParamVO.getNonce(),
+                            msgReceiveParamVO.getContent());
+            verifyResult = sha1Str.equals(msgReceiveParamVO.getSig()) ? true : false;
+        } catch (Exception e) {
+            verifyResult = false;
+            LOG.error(" verify signature error, details:", e);
+        }
+
+        return verifyResult;
+    }
+
+    /**
+     * 验证应用跳转来源合法性
+     * 
+     * @param appReqParmVO @see AppReqParmVO
+     * @param token
+     * @return true 表示验证成功,其它表示失败
+     */
+    public static boolean verifyAppReq(AppReqParmVO appReqParmVO, String token) {
+        boolean verifyResult = false;
+
+        try {
+            String signResult = SigUtils.getSHA1(token, appReqParmVO.getCode(), appReqParmVO.getTimestamp(),
+                            appReqParmVO.getNonce());
+            verifyResult = appReqParmVO.getCodeSig().equals(signResult) ? true : false;
+        } catch (Exception e) {
+            verifyResult = false;
+            LOG.error(" verify signature error, details:", e);
+        }
+
+        return verifyResult;
+    }
+
+    private static <T extends BaseResult> T doPost(String url, Req req, Class<T> clazz) {
+        T t = null;
+        Result<String> result = doPost(url, req);
+        if (result.getCode() == 0) {
+            t = new Gson().fromJson(result.getData(), clazz);
+        }
+
+        if (t != null) {
+            return t;
+        }
+
+        try {
+            t = clazz.newInstance();
+            t.setErrorCode(result.getCode());
+            t.setErrorMessage(result.getMsg());
+        } catch (Exception e) {
+            LOG.error("doPost error, details:", e);
+        }
+        return t;
+    }
+
+    private static Result<String> doPost(String url, Req req) {
+        Result<String> result = new Result<String>();
+
+        try {
+            String reqJosn = new Gson().toJson(req);
+            //System.out.println("reqJosn"+reqJosn);
+            HttpResponseMessageVO resp = HttpTookit.sendPostByJson(url, reqJosn);
+            //System.out.println("content"+resp.getContent());
+            if ("200".equals(resp.getHttpCode())) {
+                result.setData(resp.getContent());
+            } else {
+                result.setCode(Constants.interfaceException.INTERFACE_EXCEPTION.code);
+                result.setMsg(Constants.interfaceException.INTERFACE_EXCEPTION.msg.concat(",HTTP Status Code:").concat(
+                        resp.getHttpCode()));
+            }
+        } catch (BaseException e) {
+            LOG.error("doPost error, details:", e);
+            result.setMsg(e.getMessage());
+            result.setCode(e.getCode());
+        }
+
+        return result;
+    }
+}

+ 66 - 0
src/main/java/com/uas/eis/utils/PKCS7Encoder.java

@@ -0,0 +1,66 @@
+package com.uas.eis.utils;
+
+import java.nio.charset.Charset;
+import java.util.Arrays;
+
+/**
+ * 提供基于PKCS7算法的加解密接口.
+ * 
+ * @author 黄虎平
+ * @date 2015年9月1日
+ */
+class PKCS7Encoder {
+
+    private static final Charset CHARSET = Charset.forName("utf-8");
+
+    private static final int BLOCK_SIZE = 32;
+
+    private PKCS7Encoder() {}
+
+    /**
+     * 获得对明文进行补位填充的字节.
+     * 
+     * @param count 需要进行填充补位操作的明文字节个数
+     * @return 补齐用的字节数组
+     */
+    public static byte[] encode(int count) {
+        // 计算需要填充的位数
+        int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE);
+        if (amountToPad == 0) {
+            amountToPad = BLOCK_SIZE;
+        }
+        // 获得补位所用的字符
+        char padChr = chr(amountToPad);
+        String tmp = new String();
+        for (int index = 0; index < amountToPad; index++) {
+            tmp += padChr;
+        }
+        return tmp.getBytes(CHARSET);
+    }
+
+    /**
+     * 删除解密后明文的补位字符
+     * 
+     * @param decrypted 解密后的明文
+     * @return 删除补位字符后的明文
+     */
+    public static byte[] decode(byte[] decrypted) {
+        int pad = (int) decrypted[decrypted.length - 1];
+        if (pad < 1 || pad > 32) {
+            pad = 0;
+        }
+        return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad);
+    }
+
+    /**
+     * 将数字转化成ASCII码对应的字符,用于对明文进行补码
+     * 
+     * @param a 需要转化的数字
+     * @return 转化得到的字符
+     */
+    private static char chr(int a) {
+        byte target = (byte) (a & 0xFF);
+        return (char) target;
+    }
+
+}

+ 170 - 0
src/main/java/com/uas/eis/utils/SigUtils.java

@@ -0,0 +1,170 @@
+package com.uas.eis.utils;
+
+import com.uas.eis.exception.AesException;
+import org.apache.commons.codec.binary.Base64;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.nio.charset.Charset;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
+
+/**
+ * 加解密工具类
+ * 
+ * @author huanghp
+ * @date 2015年8月28日
+ */
+public class SigUtils {
+
+    private static final Logger LOG = LoggerFactory.getLogger(SigUtils.class);
+
+    private SigUtils() {}
+
+    /**
+     * @param hexStr
+     * @return byte
+     */
+    public static byte[] parseHexStr2Byte(String hexStr) {
+        if (hexStr.length() < 1) {
+            return null;
+        }
+
+        byte[] result = new byte[hexStr.length() / 2];
+        for (int i = 0; i < hexStr.length() / 2; i++) {
+            int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
+            int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
+            result[i] = (byte) (high * 16 + low);
+        }
+
+        return result;
+    }
+
+
+    /**
+     * 还原4个字节的网络字节序
+     * 
+     * @param orderBytes
+     * @return
+     */
+    private static int recoverNetworkBytesOrder(byte[] orderBytes) {
+        int sourceNumber = 0;
+        for (int i = 0; i < 4; i++) {
+            sourceNumber <<= 8;
+            sourceNumber |= orderBytes[i] & 0xff;
+        }
+        return sourceNumber;
+    }
+
+    /**
+     * 对密文进行解密.
+     * 
+     * @param text 需要解密的密文
+     * @return 解密得到的明文
+     * @throws AesException aes解密失败
+     */
+    public static String decrypt(String text, String encodingAesKey) throws AesException {
+        byte[] original;
+        try {
+            // 设置解密模式为AES的CBC模式
+            byte[] aesKey = Base64.decodeBase64(encodingAesKey + "=");
+            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
+            SecretKeySpec key_spec = new SecretKeySpec(aesKey, "AES");
+            IvParameterSpec iv = new IvParameterSpec(Arrays.copyOfRange(aesKey, 0, 16));
+            cipher.init(Cipher.DECRYPT_MODE, key_spec, iv);
+
+            // 使用BASE64对密文进行解码
+            byte[] encrypted = Base64.decodeBase64(text);
+
+            // 解密
+            original = cipher.doFinal(encrypted);
+        } catch (Exception e) {
+            LOG.error("decrypt error, details:", e);
+            throw new AesException(AesException.DECRYPT_AES_ERROR);
+        }
+
+        String plaintext = null;
+
+        try {
+            // 去除补位字符
+            byte[] bytes = PKCS7Encoder.decode(original);
+
+            // 分离16位随机字符串,网络字节序
+            byte[] networkOrder = Arrays.copyOfRange(bytes, 16, 20);
+
+            int plainTextLength = recoverNetworkBytesOrder(networkOrder);
+
+            plaintext = new String(Arrays.copyOfRange(bytes, 20, 20 + plainTextLength), Charset.forName("utf-8"));
+
+        } catch (Exception e) {
+            LOG.error("illegal buffer, details:", e);
+            throw new AesException(AesException.ILLEGAL_BUFFER);
+        }
+        return plaintext;
+    }
+
+    /**
+     * 用SHA1算法生成安全签名
+     * 
+     * @param token 票据
+     * @param timestamp 时间戳
+     * @param nonce 随机字符串
+     * @param encrypt 密文
+     * @return 安全签名
+     * @throws NoSuchAlgorithmException
+     * @throws AesException
+     */
+    public static String getSHA1(String token, String timestamp, String nonce, String encrypt) throws Exception {
+        String[] array = new String[] {token, timestamp, nonce, encrypt};
+        StringBuilder sb = new StringBuilder();
+
+        // 字符串排序
+        Arrays.sort(array);
+        for (int i = 0; i < 4; i++) {
+            sb.append(array[i]);
+        }
+        String str = sb.toString();
+
+        // SHA1签名生成
+        MessageDigest md = MessageDigest.getInstance("SHA-1");
+        md.update(str.getBytes());
+        byte[] digest = md.digest();
+
+        StringBuilder hexstr = new StringBuilder();
+        String shaHex = "";
+
+        for (int i = 0; i < digest.length; i++) {
+            shaHex = Integer.toHexString(digest[i] & 0xFF);
+            if (shaHex.length() < 2) {
+                hexstr.append(0);
+            }
+            hexstr.append(shaHex);
+        }
+
+        return hexstr.toString();
+    }
+
+    /**
+     * 解密如出现异常,请查看 <开平API文档的接收消息时的加解密处理>章节
+     * 
+     * @param decode 密文
+     * @param keyt 密钥
+     * @return 明文
+     */
+    public static String decodeAES(String decode, String keyt) {
+        String plaintext = null;
+
+        try {
+            plaintext = SigUtils.decrypt(decode, keyt);
+        } catch (Exception e) {
+            LOG.error("decodeAES error, details:", e);
+        }
+
+        return plaintext;
+    }
+
+}

+ 1 - 1
src/main/resources/api_sign_key_mapping.properties

@@ -5,4 +5,4 @@ mesHttp=http://192.168.16.114:8080/mrs/
 syncProduct=updateItemByErp
 syncMakeBase=updateProdByErp
 syncMakeBaseDetail=updateProdBomByErp
-syncUpdateReceiveByErp=updateReceiveByErp
+syncUpdateReceiveByErp=updateReceiveByErp

+ 10 - 3
src/main/resources/application-prod.yml

@@ -2,9 +2,9 @@ spring:
     datasource:
         type: org.apache.tomcat.jdbc.pool.DataSource
         driverClassName: oracle.jdbc.OracleDriver
-        username: BOYT
+        username: DATACENTER
         password: select!#%*(
-        url: jdbc:oracle:thin:@192.168.16.243:1521:orcl
+        url: jdbc:oracle:thin:@usoft.f3322.net:11652:orcl
     redis:
         host: 10.1.81.208
         port: 26379
@@ -13,7 +13,6 @@ server:
         uri_encoding: UTF-8
     context-path:
         /EIS
-
 Task:
     SyncProductsMethod: syncProducts
     SyncProductsCron: 0 0/1 * * * ?
@@ -35,3 +34,11 @@ extral:
         uid: admin1
         pwd: 123456789
         lang: 2052
+fs:
+    appId: FSAID_131a7cb
+    appSecret: 2a21342635174202809295bd02e2acae
+    permanentCode: 62ADF2C84B8405E6155D2C054B826896
+    token: 1493db0d00b74e86a30b1457497c6988
+    encodingAesKey: YmFhZjE4YmQ5MmQ2NDE0MTg1MmJlNjZjYzJmMmQ0ZjM
+    authorize.url: https://open.fxiaoke.com/oauth2/authorize
+    openUserId: FSUID_EEB3F8D8C2186EB4AFFB5D97F1AA4FCD

+ 37 - 7
src/test/java/com/uas/eis/UasEisApplicationTests.java

@@ -1,28 +1,58 @@
 package com.uas.eis;
 
-import com.uas.eis.dto.UasEvent;
+import com.uas.eis.beans.result.Goods;
+import com.uas.eis.exception.AccessTokenException;
 import com.uas.eis.listener.UasProdInOutListener;
-import com.uas.eis.service.LingxingService;
+import com.uas.eis.manager.ProductManager;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 @RunWith(SpringRunner.class)
 @SpringBootTest(classes = {UasEisApplication.class})
 public class UasEisApplicationTests {
 	@Autowired
 	private UasProdInOutListener uasProdInOutListener;
 
+	@Autowired
+	private ProductManager productManager;
+
 	@Test
 	public void Test() {
-		UasEvent uasEvent = new UasEvent();
-		uasEvent.setOperation("POST");
-		uasEvent.setCaller("ProdInOut!Picking");
-		uasEvent.setKey(50769674);
-		uasProdInOutListener.onProdInOutPost_picking(uasEvent);
 
+		List<Map<String,Object>> sku = new ArrayList<>();
+		Map<String,Object> map = new HashMap<>();
+		List spec_and_value = new ArrayList();
+		map.put("spec_and_value",spec_and_value);
+		map.put("product_status","1");
+		map.put("unit","PCS");
+		sku.add(map);
+		Goods goods = new Goods();
+		goods.setDataObjectApiName("SPUObj");
+		goods.setUnit("PCS");
+		goods.setIs_spec(false);
+		goods.setStandard_price(2.26);
+		goods.setProduct_line("1");
+		goods.setName("测试新增202201210077");
+		goods.setCategory("6");
+		//新增时
+		//goods.setSku(sku);
+
+		//修改时必要参数
+		goods.set_id("61ea66a4f6c2910001540093");
+		try {
+			//productManager.addGoods(goods);
+			productManager.updateGoods(goods);
+		}catch (AccessTokenException e) {
+			e.printStackTrace();
+		}
 	}
 
 }