Explorar el Código

海控会员系统对接

lhm hace 3 años
padre
commit
8d80220db9

+ 35 - 0
kmall-admin/src/main/java/com/kmall/admin/config/haikong/HaiKongConfig.java

@@ -0,0 +1,35 @@
+package com.kmall.admin.config.haikong;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.core.env.Environment;
+
+/**
+ * 海控配置类
+ * @author lhm
+ * @createDate 2021-10-27
+ */
+@Configuration
+@PropertySource(value = {"classpath:conf/haikong.properties"})
+public class HaiKongConfig {
+
+    @Autowired
+    private Environment environment;
+
+    @Bean
+    public HaiKongProperties haiKongProperties() {
+        HaiKongProperties haiKongProperties = new HaiKongProperties();
+
+        haiKongProperties.setMemberUrl(environment.getProperty("haikong.member.url"));
+        haiKongProperties.setMemberAppId(environment.getProperty("haikong.member.appId"));
+        haiKongProperties.setMemberAppSecret(environment.getProperty("haikong.member.appSecret"));
+        haiKongProperties.setRetry(Integer.parseInt(environment.getProperty("haikong.retry")));
+
+        return haiKongProperties;
+    }
+
+
+
+}

+ 50 - 0
kmall-admin/src/main/java/com/kmall/admin/config/haikong/HaiKongProperties.java

@@ -0,0 +1,50 @@
+package com.kmall.admin.config.haikong;
+
+/**
+ * 海控相关 配置
+ * @author  lhm
+ * @createDate 2021-10-27
+ */
+public class HaiKongProperties {
+
+    private String memberUrl;
+
+    private String memberAppId;
+
+    private String memberAppSecret;
+
+    private Integer retry;
+
+
+    public String getMemberUrl() {
+        return memberUrl;
+    }
+
+    public void setMemberUrl(String memberUrl) {
+        this.memberUrl = memberUrl;
+    }
+
+    public String getMemberAppId() {
+        return memberAppId;
+    }
+
+    public void setMemberAppId(String memberAppId) {
+        this.memberAppId = memberAppId;
+    }
+
+    public String getMemberAppSecret() {
+        return memberAppSecret;
+    }
+
+    public void setMemberAppSecret(String memberAppSecret) {
+        this.memberAppSecret = memberAppSecret;
+    }
+
+    public Integer getRetry() {
+        return retry;
+    }
+
+    public void setRetry(Integer retry) {
+        this.retry = retry;
+    }
+}

+ 120 - 0
kmall-admin/src/main/java/com/kmall/admin/haikong/HaiKongMemberTemplate.java

@@ -0,0 +1,120 @@
+package com.kmall.admin.haikong;
+
+import com.kmall.admin.config.haikong.HaiKongProperties;
+import com.kmall.admin.utils.haikong.OkHttpUtils;
+import com.kmall.common.constant.HaiKongMemberSystemUrlEnum;
+import okhttp3.MediaType;
+import okhttp3.Request;
+import okhttp3.RequestBody;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+
+/**
+ *
+ * @author  lhm
+ * @createDate 2021-10-27
+ */
+@Component
+public class HaiKongMemberTemplate {
+
+    @Autowired
+    private HaiKongProperties haiKongProperties;
+
+    private RequestBody requestBody(String body) {
+        return RequestBody.create(MediaType.parse(org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE), body);
+    }
+
+    /**
+     * 拼接通用查询参数
+     * @param url           接口地址
+     * @param accessToken   凭证
+     * @param sign          签名
+     * @return              拼接后的url
+     */
+    private String appendQueryParam(String url, String accessToken, String sign) {
+        return url + "?" + "access_token=" + accessToken +
+                "&" + "sign=" + sign +
+                "&" + "timestamp=" + String.valueOf(System.currentTimeMillis());
+    }
+
+    /**
+     * 获取accessToken
+     * @return  accessToken
+     */
+    public String getAccessToken() {
+        String url = HaiKongMemberSystemUrlEnum.QUERY_ACCESS_TOKEN.getUrl();
+        Request request = new Request.Builder()
+                            .url(haiKongProperties.getMemberUrl() + url)
+                            .build();
+        return OkHttpUtils.retry(request, haiKongProperties.getRetry());
+    }
+
+    /**
+     * 刷新accessToken
+     * @return  accessToken
+     */
+    public String refreshAccessToken() {
+        String url = HaiKongMemberSystemUrlEnum.REFRESH_ACCESS_TOKEN.getUrl();
+        Request request = new Request.Builder()
+                            .url(haiKongProperties.getMemberUrl() + url)
+                            .build();
+        return OkHttpUtils.retry(request, haiKongProperties.getRetry());
+    }
+
+    /**
+     * 根据手机号获取会员信息
+     * 可根据会员码或手机号或会员的open_id来获取会员信息
+     * @param body 请求体
+     * @return  会员信息
+     */
+    public String getMemberInfoByPhone(String body) {
+        Request request = new Request.Builder()
+                            .post(requestBody(body))
+                            .url(haiKongProperties.getMemberUrl() + appendQueryParam(HaiKongMemberSystemUrlEnum.QUERY_MEMBER_INFO_BY_PHONE.getUrl(), "", ""))
+                            .build();
+        return OkHttpUtils.retry(request, haiKongProperties.getRetry());
+    }
+
+    /**
+     * 根据手机号获取会员信息
+     * 可根据会员码或手机号或会员的open_id来获取会员信息
+     * @param body 请求体
+     * @return  会员信息
+     */
+    public String getMemberInfoByCode(String body) {
+        Request request = new Request.Builder()
+                            .post(requestBody(body))
+                            .url(haiKongProperties.getMemberUrl() + appendQueryParam(HaiKongMemberSystemUrlEnum.QUERY_MEMBER_INFO_BY_CODE.getUrl(), "", ""))
+                            .build();
+        return OkHttpUtils.retry(request, haiKongProperties.getRetry());
+    }
+
+    /**
+     * 获取会员优惠券详细信息
+     * 待定
+     * @param body 请求体
+     * @return  优惠券信息
+     */
+    public String getMemberCouponInfo(String body) {
+        Request request = new Request.Builder()
+                            .get()
+                            .url(haiKongProperties.getMemberUrl() + appendQueryParam(HaiKongMemberSystemUrlEnum.QUERY_MEMBER_COUPON.getUrl(), "", ""))
+                            .build();
+        return OkHttpUtils.retry(request, haiKongProperties.getRetry());
+    }
+
+    /**
+     * 积分变动接口
+     * @param body  请求体
+     * @return      响应数据
+     */
+    public String changeMemberScore(String body) {
+        Request request = new Request.Builder()
+                            .post(requestBody(body))
+                            .url(haiKongProperties.getMemberUrl() + appendQueryParam(HaiKongMemberSystemUrlEnum.CHANGE_MEMBER_SCORE.getUrl(), "", ""))
+                            .build();
+        return OkHttpUtils.retry(request, haiKongProperties.getRetry());
+    }
+
+}

+ 159 - 0
kmall-admin/src/main/java/com/kmall/admin/utils/haikong/OkHttpUtils.java

@@ -0,0 +1,159 @@
+package com.kmall.admin.utils.haikong;
+
+import com.kmall.admin.utils.jackson.JacksonUtil;
+import okhttp3.MediaType;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.CollectionUtils;
+
+import javax.net.ssl.*;
+import java.io.IOException;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * @author
+ * @createDate 2021-10-27
+ */
+public class OkHttpUtils {
+
+    private static final Logger logger = LoggerFactory.getLogger(OkHttpUtils.class);
+
+    public static final MediaType XML = MediaType.parse("application/xml; charset=utf-8");
+    public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
+
+    public static final int CONNEC_TIME = 20;
+    public static final int READ_TIME = 30;
+    public static final int WRITE_TIME = 30;
+    private static OkHttpClient okHttpClientSSL = null;
+    static {
+        okHttpClientSSL = new OkHttpClient.Builder()
+                .sslSocketFactory(createSSLSocketFactory())
+                .hostnameVerifier(new TrustAllHostnameVerifier())
+                .connectTimeout(CONNEC_TIME, TimeUnit.SECONDS)
+                .readTimeout(READ_TIME, TimeUnit.SECONDS)
+                .writeTimeout(WRITE_TIME, TimeUnit.SECONDS)
+                .build();
+    }
+
+
+    /**
+     * 请求重试
+     * @param request   请求
+     * @param retry     重试次数
+     */
+    public static String retry(Request request, int retry) {
+
+        AtomicInteger count = new AtomicInteger(1);
+        while (count.get() <= retry) {
+            try {
+                String response = okHttpClientSSL.newCall(request).execute().body().string();
+                count.set(99);
+                return response;
+            } catch (IOException e) {
+                logger.error("调用接口失败!重试中......\n==========================================================\n url:{} \n header:{} \n body:{} \n retry:{}" +
+                                "\n=========================================================="
+                        , request.url().toString()
+                        , JacksonUtil.toJson(request.headers())
+                        , JacksonUtil.toJson(Objects.isNull(request.body()) ? "" : request.body().contentType())
+                        , count.get()
+                );
+                count.incrementAndGet();
+            }
+        }
+        return StringUtils.EMPTY;
+    }
+
+    /**
+     * 批量设置
+     * @param headers 请求头信息
+     * @return        Builder
+     */
+    public static Request.Builder addHeaders(Map<String, String> headers) {
+        Request.Builder builder = new Request.Builder();
+        if (CollectionUtils.isEmpty(headers)) {
+            logger.warn("请求头数据为空!返回无请求头的Builder!");
+            return builder;
+        }
+        Set<Map.Entry<String, String>> entries = headers.entrySet();
+        for (Map.Entry<String, String> entry : entries) {
+            builder.addHeader(entry.getKey(), entry.getValue());
+        }
+        return builder;
+    }
+
+
+    public static void main(String[] args) {
+
+        Request request = new Request.Builder().url("https://www.baidu.com").get().build();
+
+        String retry = retry(request, 3);
+
+        System.out.println(retry);
+
+    }
+
+    /**
+     * 证书管理
+     */
+    private static TrustManager[] getTrustManager() {
+        return new TrustManager[] {
+                new X509TrustManager() {
+                    @Override
+                    public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
+
+                    }
+
+                    @Override
+                    public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
+
+                    }
+
+                    @Override
+                    public X509Certificate[] getAcceptedIssuers() {
+                        return new X509Certificate[0];
+                    }
+                }
+        };
+    }
+
+    private static SSLSocketFactory createSSLSocketFactory() {
+        SSLSocketFactory sslSocketFactory = null;
+
+        try {
+            SSLContext sslContext = SSLContext.getInstance("TLS");
+            sslContext.init(null, getTrustManager(), new SecureRandom());
+
+            sslSocketFactory = sslContext.getSocketFactory();
+        } catch (NoSuchAlgorithmException | KeyManagementException e) {
+            logger.error("SSL初始化失败!", e);
+            throw new RuntimeException(e);
+        }
+
+        return sslSocketFactory;
+    }
+
+    /**
+     * 忽略验证
+     */
+    private static class TrustAllHostnameVerifier implements HostnameVerifier {
+
+        @Override
+        public boolean verify(String s, SSLSession sslSession) {
+            return true;
+        }
+    }
+
+
+}

+ 67 - 0
kmall-common/src/main/java/com/kmall/common/constant/HaiKongMemberSystemUrlEnum.java

@@ -0,0 +1,67 @@
+package com.kmall.common.constant;
+
+/**
+ * 格力地产会员系统相关API
+ * 通过开放平台调用格力地产会员平台,需要先获取格力地产会员平台appId和appSecret
+ * 通过下述方式以appId和appSecret换取accessToken后,以accessToken作为平台访问凭据进行调用。
+ * @author lhm
+ * @createDate 2021-10-27
+ */
+public enum HaiKongMemberSystemUrlEnum {
+
+    /**
+     * 获取accessToken
+     */
+    QUERY_ACCESS_TOKEN("POST", "/gw/gateway/dss.auth.token.query/v1"),
+    /**
+     * 刷新token
+     */
+    REFRESH_ACCESS_TOKEN("POST", "/gw/gateway/dss.auth.token.refresh/v1"),
+    /**
+     * 查询会员信息,根据手机号
+     */
+    QUERY_MEMBER_INFO_BY_PHONE("POST", "/gw/gateway/wk.user.info.query/v1"),
+    /**
+     * 查询会员信息,根据会员码
+     */
+    QUERY_MEMBER_INFO_BY_CODE("POST", "/gw/gateway/wk.user.code.parsing/v1"),
+    /**
+     * 更新会员积分
+     */
+    CHANGE_MEMBER_SCORE("POST", "/gw/gateway/wk.user.event.score.change/v1"),
+    /**
+     * 会员积分回退
+     */
+    ROLLBACK_MEMBER_SCORE("POST", "/gw/gateway/wk.user.event.score.rollback/v1"),
+    /**
+     * 会员积分部分回退
+     */
+    ROLLBACK_PART_MEMBER_SCORE("POST", "/gw/gateway/wk.user.event.score.rollback.part/v1"),
+    /**
+     * 查询会员优惠券
+     */
+    QUERY_MEMBER_COUPON("GET", "/gateway/wk.coupon.user.list/v1"),
+    ;
+
+    /**
+     * 请求方式
+     */
+    private final String method;
+    /**
+     * 请求地址
+     */
+    private final String url;
+
+    HaiKongMemberSystemUrlEnum(String method, String url) {
+        this.method = method;
+        this.url = url;
+    }
+
+    public String getMethod() {
+        return method;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+}

+ 40 - 0
kmall-common/src/main/java/com/kmall/common/constant/HaiKongWareSystemUrlEnum.java

@@ -0,0 +1,40 @@
+package com.kmall.common.constant;
+
+/**
+ * 海仓仓储服务系统相关API
+ *
+ * @author lhm
+ * @createDate 2021-10-27
+ */
+public enum HaiKongWareSystemUrlEnum {
+
+    /**
+     * 查询库存,多商品
+     */
+    QUERY_INVENTORY("POST", ""),
+    ;
+
+
+    /**
+     * 请求方式
+     */
+    private final String method;
+
+    /**
+     * 请求地址
+     */
+    private final String url;
+
+    HaiKongWareSystemUrlEnum(String method, String url) {
+        this.method = method;
+        this.url = url;
+    }
+
+    public String getMethod() {
+        return method;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+}

+ 14 - 0
kmall-manager/src/main/resources/conf/haikong.properties

@@ -0,0 +1,14 @@
+# \u683C\u529B\u5730\u4EA7\u4F1A\u5458\u7CFB\u7EDF
+#### \u6D4B\u8BD5\u73AF\u5883
+haikong.member.url=https://test-ump.greedc.com
+haikong.member.appId=
+haikong.member.appSecret=
+haikong.ware.url=
+haikong.retry=3
+
+#### \u751F\u4EA7\u73AF\u5883
+#haikong.member.url=https://ump.greedc.com
+#haikong.member.appId=
+#haikong.member.appSecret=
+#haikong.ware.url=
+