集成框架 -- 聚水潭对接

直接拿到demo运行,其他的自己封装即可

聚水潭 erp文档 聚水潭接入

token 建议放到redis 加过期时间,通过过期时间来判断是否需要刷新token,来重新续命
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


import okhttp3.*;
import java.io.*;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.*;
import java.util.Map.Entry;

import static com.taobao.api.internal.util.WebV2Utils.buildQuery;

/**
 * 〈功能描述〉<br>
 * ----- : 聚水潭
 *
 * @author xsc
 * @date 2022/11/11 17:14
 */
public class JstTest {

    private static final String SIGN_METHOD_MD5 = "md5";

    // TOP服务地址,正式环境需要设置为https://openapi.jushuitan.com
    private static final String url = "/open/shops/query";
    private static final String serverUrl = "https://dev-api.jushuitan.com";
    private static final String appKey = "b0b7d1db226d4216a3d58df9ffa2dde5"; // 可替换为您的应用的appKey
    private static final String appSecret = "99c4cef262f34ca882975a7064de0b87"; // 可替换为您的应用的appSecret
    private static final String accessToken = "b7e3b1e24e174593af8ca5c397e53dad"; // 必须替换为授权得到的真实有效accessToken
    private static final MediaType MEDIA_TYPE_TEXT = MediaType.parse("application/x-www-form-urlencoded; charset=utf-8");


    /**
     * 生成新sign  https://openweb.jushuitan.com/doc?docId=40
     *
     * @param str
     * @return
     */
    public static String createSign(String str) {
        if (str == null || str.length() == 0) {
            return null;
        }
        char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
        try {
            MessageDigest mdTemp = MessageDigest.getInstance(SIGN_METHOD_MD5);
            mdTemp.update(str.getBytes(StandardCharsets.UTF_8));

            byte[] md = mdTemp.digest();
            int j = md.length;
            char[] buf = new char[j * 2];
            int k = 0;
            int i = 0;
            while (i < j) {
                byte byte0 = md[i];
                buf[k++] = hexDigits[byte0 >>> 4 & 0xf];
                buf[k++] = hexDigits[byte0 & 0xf];
                i++;
            }
            return new String(buf);
        } catch (Exception e) {
            return null;
        }
    }


   // 签名
    public static String signTopRequest(Map<String, String> params, String secret, String signMethod) {
        // 第一步:检查参数是否已经排序
        String[] keys = params.keySet().toArray(new String[0]);
        Arrays.sort(keys);

        // 第二步:把所有参数名和参数值串在一起
        StringBuilder query = new StringBuilder();
        if (SIGN_METHOD_MD5.equals(signMethod)) {
            query.append(secret);
        }

        for (String key : keys) {
            String value = params.get(key);
            if (isNotEmpty(key) && isNotEmpty(value)) {
                query.append(key).append(value);
            }
        }
        return createSign(query.toString());
    }


    /**
     * 店铺授权聚水潭的URL
     *
     * @return
     */
    public static String spliceAuthorizationUrl(String state) throws IOException {
        Map<String, String> params = new HashMap<>();
        // 公共参数
        params.put("app_key", appKey);
        params.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000));
        params.put("state", state);
        params.put("charset", "utf-8");
        // 签名参数
        params.put("sign", signTopRequest(params, appSecret, SIGN_METHOD_MD5));
        String url = buildQuery(params, "utf-8");
        url = serverUrl + "/auth?" + url;
        return url;
    }


    /**
     * 验证签名
     *
     * @param params
     * @param sign
     * @return
     * @throws IOException
     */
    public static Boolean signatureVerification(Map<String, String> params, String sign) throws IOException {
        String signTopRequest = signTopRequest(params, appSecret, SIGN_METHOD_MD5);
        return sign.equals(signTopRequest);
    }


    /**
     * 获取accessToken'
     *
     * @param code
     * @return
     */
    public static String getAccessToken(String code) {
        Map<String, String> params = new HashMap<>();
        params.put("app_key", appKey);
        params.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000));
        params.put("grant_type", "authorization_code");
        params.put("charset", "utf-8");
        params.put("code", code);
        params.put("sign", signTopRequest(params, appSecret, SIGN_METHOD_MD5));

        //获取accessToken的地址
        String url = serverUrl + "/openWeb/auth/accessToken";
        return sendByPostMap(url, params);
    }


    /**
     * 刷新AccessToken
     *
     * @param refreshToken
     * @return
     */
    public static String refreshToken(String refreshToken) {
        Map<String, String> params = new HashMap<>();
        params.put("app_key", appKey);
        params.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000));
        params.put("grant_type", "refresh_token");
        params.put("charset", "utf-8");
        params.put("refresh_token", refreshToken);
        params.put("scope", "all");
        params.put("sign", signTopRequest(params, appSecret, SIGN_METHOD_MD5));

        //获取accessToken的地址
        String url = serverUrl + "/openWeb/auth/refreshToken";
        return sendByPostMap(url, params);
    }


    /**
     * post方式请求
     * <p>
     * 对于POST请求,请求参数全部放在Body里,不要把参数放在Query里。 -- 聚水潭
     *
     * @param url
     * @param params
     * @return
     */
    public static String sendByPostMap(String url, Map<String, String> params) {
        OkHttpClient client = new OkHttpClient();
        StringBuilder content = new StringBuilder();

        // 拼接请求参数
        Iterator<Entry<String, String>> iterator = params.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, String> entry = iterator.next();
            content.append(entry.getKey()).append("=").append(entry.getValue());
            if (iterator.hasNext()) {
                content.append("&");
            }
        }


        RequestBody requestBody = RequestBody.create(MEDIA_TYPE_TEXT, content.toString());
        Request request = new Request.Builder().url(url).post(requestBody).build();
        Response response;
        try {
            response = client.newCall(request).execute();
            assert response.body() != null;
            return response.body().string();

        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 发送请求
     *
     * @param accessToken
     * @param biz
     * @param requestUrl
     * @return
     */
    public static String sendRequest(String accessToken, String biz, String requestUrl) {
        // 公共请求参数
        Map<String, String> params = new HashMap<>();
        params.put("app_key", appKey);
        params.put("access_token", "b7e3b1e24e174593af8ca5c397e53dad");
        params.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000));
        params.put("version", "2");
        params.put("charset", "utf-8");
        // 业务参数
        params.put("biz", biz);
        // 签名参数
        params.put("sign", signTopRequest(params, appSecret, SIGN_METHOD_MD5));
        String url = serverUrl + requestUrl;
        return sendByPostMap(url, params);
    }


    public static boolean isNotEmpty(String value) {
        int strLen;
        if (value == null || (strLen = value.length()) == 0) {
            return false;
        }
        for (int i = 0; i < strLen; i++) {
            if ((!Character.isWhitespace(value.charAt(i)))) {
                return true;
            }
        }
        return false;
    }



    public static void main(String[] args) throws IOException {

        sendRequest(accessToken, "{\"page_index\":\"1\",\"page_size\":\"100\",\"nicks\":[\"老板\"]}", url);
    }


}





    /**
     * post方式请求  备用
     *
     * @param url
     * @param params
     * @return
     */
    public static String sendByPostMap(String url, Map<String, String> params, Map<String, String> map) {
        String result;
        OkHttpClient client = new OkHttpClient();
        StringBuilder content = new StringBuilder();

        // 拼接请求参数
        Iterator<Map.Entry<String, String>> iterator = params.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, String> entry = iterator.next();
            content.append(entry.getKey()).append("=").append(entry.getValue());
            if (iterator.hasNext()) {
                content.append("&");
            }
        }

        // 请求体
        RequestBody requestBody = RequestBody.create(MEDIA_TYPE_TEXT, content.toString());

        // 请求头 添加具有名称和值的标头。对于像“Cookie”这样的多值头文件,最好使用这种方法。
        Request.Builder builder = new Request.Builder().url(url);
        if (MapUtils.isNotEmpty(map)) {
            map.forEach(builder::addHeader);
        }


        Request request = builder.url(url).post(requestBody).build();
        Response response;
        try {
            response = client.newCall(request).execute();
            assert response.body() != null;
            result = response.body().string();
            System.out.println("result = " + result);
            return result;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SSO (单点登录) 是一种身份验证和访问控制机制,允许用户使用一组凭据(例如用户名和密码)在多个应用程序中进行身份验证。其目的是简化用户的登录过程,提高安全性,并提供无缝的访问体验。 SAP SuccessFactors(SF)是一套云端人力资源管理解决方案,提供雇佣、培训、绩效管理等功能。对接SAP SF,意味着将SSO机制集成到SF应用中。 在实施SSO对接SAP SF时,需要采取以下步骤: 1. 配置身份提供商(IdP):选择一个可信任的身份提供商,如Active Directory Federation Services(AD FS)或其他支持SAML协议的服务提供商,并配置好身份验证方法。 2. 配置SAP SF:在SAP SF中,配置SSO设置,与身份提供商建立信任关系,并提供必要的元数据(metadata)信息。 3. 配置用户映射:确保SAP SF中的用户账号与身份提供商中的用户账号进行正确映射,以保证登录时用户能够正确识别。 4. 测试和验证:测试SSO机制是否正常工作,确保用户可以使用身份提供商的凭据访问SAP SF应用,并自动登录。 5. 后续维护和支持:一旦SSO成功对接SAP SF,需要进行常规维护和支持,包括更新身份提供商凭据、更新SAP SF配置等。 总结起来,对接SSO和SAP SF的过程包括配置身份提供商、配置SAP SF、配置用户映射、测试和验证,并进行后续维护和支持。这样一来,用户就可以方便地使用单一凭据来访问并管理SAP SF应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值