package com.kmall.admin.haikong.client; import cn.hutool.core.map.MapUtil; import com.fasterxml.jackson.core.type.TypeReference; import com.kmall.admin.haikong.config.HaiKongProperties; import com.kmall.admin.haikong.constant.Constants; import com.kmall.admin.haikong.dto.AccessTokenDTO; import com.kmall.admin.haikong.dto.MemberInfoDTO; import com.kmall.admin.haikong.task.MemberSysAccessTokenRefreshTask; import com.kmall.admin.haikong.utils.*; import com.kmall.admin.haikong.constant.HaiKongMemberSystemUrlEnum; import com.kmall.admin.utils.jackson.JacksonUtil; import com.kmall.manager.manager.redis.JedisUtil; import okhttp3.MediaType; import okhttp3.Request; import okhttp3.RequestBody; import org.apache.http.HttpEntity; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import java.math.BigDecimal; import java.util.Map; /** * * @author lhm * @createDate 2021-10-27 */ @Component public class HaiKongMemberTemplate { private static final Logger log = LoggerFactory.getLogger(HaiKongMemberTemplate.class); @Autowired private HaiKongProperties haiKongProperties; @Autowired private MemberSysAccessTokenRefreshTask memberSysAccessTokenRefreshTask; public void setHaiKongProperties(HaiKongProperties haiKongProperties) { this.haiKongProperties = haiKongProperties; } private RequestBody requestBody(String body) { return RequestBody.create(MediaType.parse(org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE), body); } private String getCacheAccessToken() throws Exception { return memberSysAccessTokenRefreshTask.getAccessToken(); } /** * 拼接通用查询参数 * @param url 接口地址 * @param accessToken 凭证 * @return 拼接后的url */ private String appendQueryParam(String url, String accessToken) { return url + "?access_token=" + accessToken + "×tamp=" + System.currentTimeMillis(); } private String appendSign(String url, String sign) { return url + "&sign=" + sign; } private Map formatUrl(String url) { Map map = MapUtil.newHashMap(); if (StringUtils.isEmpty(url)) { return map; } int i = url.lastIndexOf("?"); String paramStr = url.substring(i+1); String[] strings = paramStr.split("&"); for (String string : strings) { int j = string.indexOf("="); String key = string.substring(0, j); if (!"sign".equalsIgnoreCase(key)) { String value = string.substring(j + 1); map.put(key, value); } } return map; } private String getSignUrl(String url, String body) throws Exception { return appendSign(url, MemberSysSignUtils.encryptParam(formatUrl(url), body, haiKongProperties.getMemberAppSecret())); } /** * 获取accessToken * @return accessToken */ public String getAccessToken() throws Exception { log.info("请求获取accessToken接口......"); String url = haiKongProperties.getMemberUrl() + HaiKongMemberSystemUrlEnum.QUERY_ACCESS_TOKEN.getUrl() + "?app_id=" + haiKongProperties.getMemberAppId() + "×tamp=" + System.currentTimeMillis(); url = getSignUrl(url, ""); Request request = new Request.Builder() .url(url) .build(); String response = OkHttpUtils.retry(request, haiKongProperties.getRetry()); log.info("请求获取accessToken接口成功......"); return response; } /** * 刷新accessToken * @param refreshToken 刷新token * @return accessToken */ public String refreshAccessToken(String refreshToken) throws Exception { log.info("请求刷新accessToken接口......"); String url = haiKongProperties.getMemberUrl() + HaiKongMemberSystemUrlEnum.REFRESH_ACCESS_TOKEN.getUrl() + "?refresh_token=" + refreshToken + "×tamp=" + System.currentTimeMillis(); url = getSignUrl(url, ""); Request request = new Request.Builder() .url(url) .build(); String response = OkHttpUtils.retry(request, haiKongProperties.getRetry()); log.info("请求刷新accessToken接口成功......"); return response; } /** * 根据手机号获取会员信息 * 可根据会员码或手机号或会员的open_id来获取会员信息 * @param body 请求体 * @return 会员信息 */ public String getMemberInfoByPhone(String body) throws Exception { log.info("请求根据手机号获取会员信息接口......"); String url = haiKongProperties.getMemberUrl() + appendQueryParam(HaiKongMemberSystemUrlEnum.QUERY_MEMBER_INFO_BY_PHONE.getUrl(), getCacheAccessToken()); url = getSignUrl(url, body); Request request = new Request.Builder() .post(requestBody(body)) .url(url) .build(); String response = OkHttpUtils.retry(request, haiKongProperties.getRetry()); log.info("请求根据手机号获取会员信息接口成功......"); return response; } /** * 根据会员码获取会员信息 * 可根据会员码或手机号或会员的open_id来获取会员信息 * @param body 请求体 * @return 会员信息 */ public String getMemberInfoByCode(String body) throws Exception { log.info("请求根据会员码获取会员信息接口......"); String url = haiKongProperties.getMemberUrl() + appendQueryParam(HaiKongMemberSystemUrlEnum.QUERY_MEMBER_INFO_BY_CODE.getUrl(), getCacheAccessToken()); url = getSignUrl(url, body); Request request = new Request.Builder() .post(requestBody(body)) .url(url) .build(); String response = OkHttpUtils.retry(request, haiKongProperties.getRetry()); log.info("请求根据会员码获取会员信息接口成功......"); return response; } /** * 获取会员优惠券详细信息 * TODO 有问题,待询问 * @param body 请求体 * @return 优惠券信息 */ public String getMemberCouponInfo(String body) throws Exception { log.info("请求获取会员优惠券详细信息接口......"); String url = haiKongProperties.getMemberUrl() + appendQueryParam(HaiKongMemberSystemUrlEnum.QUERY_MEMBER_COUPON.getUrl(), getCacheAccessToken()); url = getSignUrl(url, body); HttpGetWithEntity httpGet = new HttpGetWithEntity(url); HttpEntity httpEntity = new StringEntity(body, ContentType.APPLICATION_JSON); httpGet.setEntity(httpEntity); String response = ApacheHttpUtils.retry(httpGet, haiKongProperties.getRetry()); log.info("请求获取会员优惠券详细信息接口成功......"); return response; } /** * 积分变动接口 * @param body 请求体 * @return 响应数据 */ public String changeMemberScore(String body) throws Exception { log.info("请求会员积分变动接口......"); String url = haiKongProperties.getMemberUrl() + appendQueryParam(HaiKongMemberSystemUrlEnum.CHANGE_MEMBER_SCORE.getUrl(), getCacheAccessToken()); url = getSignUrl(url, body); Request request = new Request.Builder() .post(requestBody(body)) .url(url) .build(); String response = OkHttpUtils.retry(request, haiKongProperties.getRetry()); log.info("请求会员积分变动接口成功......"); return response; } /** * 消费订单同步会员系统 * @param body 请求体 * @return 结果 */ public String memberOrderSync(String body) throws Exception { log.info("请求同步会员订单消费信息接口......"); String url = haiKongProperties.getMemberUrl() + appendQueryParam(HaiKongMemberSystemUrlEnum.MEMBER_ORDER_SYNC.getUrl(), getCacheAccessToken()); url = getSignUrl(url, body); Request request = new Request.Builder() .post(requestBody(body)) .url(url) .build(); String response = OkHttpUtils.retry(request, haiKongProperties.getRetry()); log.info("请求同步会员订单消费信息接口成功......"); return response; } /** * 会员积分回退接口 * @param body 请求体 * @return 结果 */ public String rollbackMemberScore(String body) throws Exception { log.info("请求会员积分回退接口......"); String url = haiKongProperties.getMemberUrl() + appendQueryParam(HaiKongMemberSystemUrlEnum.ROLLBACK_MEMBER_SCORE.getUrl(), getCacheAccessToken()); url = getSignUrl(url, body); Request request = new Request.Builder() .post(requestBody(body)) .url(url) .build(); String response = OkHttpUtils.retry(request, haiKongProperties.getRetry()); log.info("请求会员积分回退接口......"); return response; } public static void main(String[] args) throws Exception { HaiKongMemberTemplate haiKongMemberTemplate = new HaiKongMemberTemplate(); HaiKongProperties haiKongProperties = new HaiKongProperties(); haiKongProperties.setMemberUrl("https://test-ump.greedc.com"); haiKongProperties.setMemberAppId("mianshuitestzhanxiao"); haiKongProperties.setMemberAppSecret("mianshuitestzhanxiao1029"); haiKongProperties.setRetry(3); haiKongMemberTemplate.setHaiKongProperties(haiKongProperties); // String accessToken = haiKongMemberTemplate.getAccessToken(); // System.out.println(accessToken); String accessToken = "at9528E3271080F8A3C5AE9FD9C8EBC9D9"; String refreshToken = "rt6D6F3077B2CDFA31BB294CF0662194F3"; String body = "{\"phone\": \"13726271499\"}"; // String refreshAccessToken = haiKongMemberTemplate.refreshAccessToken(refreshToken); // System.out.println(refreshAccessToken); log.info("请求获取会员优惠券详细信息接口......"); String url = haiKongProperties.getMemberUrl() + haiKongMemberTemplate.appendQueryParam(HaiKongMemberSystemUrlEnum.QUERY_MEMBER_INFO_BY_PHONE.getUrl(), accessToken); url = haiKongMemberTemplate.getSignUrl(url, body); Request build = new Request.Builder().url(url).post(haiKongMemberTemplate.requestBody(body)).build(); String retry = OkHttpUtils.retry(build, 3); System.out.println(retry); Response response = JacksonUtil.fromListJson(retry, new TypeReference>() { }); System.out.println("会员积分========>" + response.getData().getScore() + "会员码========>" + response.getData().getOpenId()); // HttpGetWithEntity httpGet = new HttpGetWithEntity(url); // HttpEntity httpEntity = new StringEntity(body, ContentType.APPLICATION_JSON); // httpGet.setEntity(httpEntity); // // String response = ApacheHttpUtils.retry(httpGet, haiKongProperties.getRetry()); // System.out.println(response); // log.info("请求获取会员优惠券详细信息接口成功......"); } }