集成框架 -- 快手接入
開放文檔
新手指南
訂單列表
授權說明
附 - 物流信息編號 -快手物流公司編號
授權說明
快手開放平臺是基于OAuth2協議的開放授權和鑒權服務,接入前需要了解標準的OAuth2的一些相關知識,可以參考文檔 THE OAUTH 2.0 AUTHORIZATION FRAMEWORK。開放平臺提供了OAuth2的兩種授權方式,授權碼code和客戶端憑證client_credentials,分別適用于需要用戶授權的授權API調用場景,以及不需要用戶授權的非授權API調用場景。
注:OAuth2相關知識是接入必備,建議提前閱讀。
授權方式
對于標識了“需用戶授權”的API,需要使用OAuth2的code授權方式,獲取用戶access_token
OAuth2的code授權流程及接口簡介
當access_token 過期時,可以使用(在有效期內的)refresh_token重新獲取新的access_token,不需要顯式的用戶授權過程,
若refresh_token也過期了,則需要再次經過用戶授權,因此需要關注refresh_token的時效,需要在時效內用此接口再換取新的refresh_token才不會出現用戶授權頻繁失效的情況。該接口只支持authorization_code模式獲取access_token刷新,刷新得到新的access_token和refresh_token, 舊的refresh_token 隨即在5分鐘內失效。
- refresh_token 長時訪問令牌,默認為180天
- access_token 臨時訪問令牌,作為調用授權API時的入參,過期時間為expires_in值 48小時
準備工作
創建應用
參考: 創建App指南
得到
- APPKEY
- APPSecret
授權 得到授權碼,或者填寫回調授權路由用于拿到授權grantCode
正文: 接入代碼
授權碼接入
@Configuration @Slf4j public class KsConfig {@Value("${spring.profiles.active}")private String activeProfile;@Value("${app.key.ks}")public String appKey ;/*** 獲取 快手客戶端** @param ksProperties* @return*/@Beanpublic AccessTokenKsMerchantClient ksMerchantClient(KsProperties ksProperties) {return new AccessTokenKsMerchantClient("https://openapi.kwaixiaodian.com",ksProperties.getAppKey(), ksProperties.getSignSecret());}} @Resource // 鑰匙private KsProperties ksProperties;@Resourceprivate RedisUtil redisUtil;/*** 獲取授權令牌* <p>* 返回結果類型,1為正確,其他為不正確* 臨時訪問令牌,作為調用授權API時的入參,過期時間為expires_in值,授權用戶、app和權限組范圍唯一決定一個access_token值* 注: access_token過期時間,單位秒,默認為172800,即48小時** @param ksShopConfig* @return*/private Map<String, String> getKsAccessToken(KsShopConfig ksShopConfig) throws KsMerchantApiException {Map<String, String> map = new HashMap<>();getShopAccess(map, 店鋪授權碼, "Ks_refreshToken", "授權店鋪名稱", "Ks_accessToken");return map;}/*** 獲取令牌** @param map* @throws KsMerchantApiException*/private void getShopAccess(Map<String, String> map, String code, String code_refreshToken, String shopName, String code_accessToken) throws KsMerchantApiException {if (StringUtil.isNotBlank(code) && redisUtil.get(code_refreshToken) == null) {KsAccessTokenResponse ksAccessTokenBuild = getKsAccessTokenBuild(code, shopName);redisUtil.set(code_refreshToken, ksAccessTokenBuild.getRefreshToken(), ksAccessTokenBuild.getRefreshTokenExpiresIn());redisUtil.set(code_accessToken, ksAccessTokenBuild.getAccessToken(), ksAccessTokenBuild.getExpiresIn());} else if (redisUtil.get(code_refreshToken) != null) {Object tokens = redisUtil.get(code_accessToken);if (tokens != null) {map.put(shopName, (String) tokens);} else {KsAccessTokenResponse ksAccessTokenResponse = refreshKsAccessToken((String) redisUtil.get(code_refreshToken), shopName);redisUtil.set(code_refreshToken, ksAccessTokenResponse.getRefreshToken(), ksAccessTokenResponse.getRefreshTokenExpiresIn());redisUtil.set(code_accessToken, ksAccessTokenResponse.getAccessToken(), ksAccessTokenResponse.getExpiresIn());map.put(shopName, ksAccessTokenResponse.getAccessToken());}}}/*** 構建快手 token獲取** @param shop* @param grantCode* @return*/private KsAccessTokenResponse getKsAccessTokenBuild(String grantCode, String shop) {//不指定服務器地址,服務器地址默認為線上OauthAccessTokenKsClient oauthAccessTokenKsClient = new OauthAccessTokenKsClient(ksProperties.getAppKey(), ksProperties.getAppSecret());// 生成AccessTokenKsAccessTokenResponse response = null;try {response = oauthAccessTokenKsClient.getAccessToken(grantCode);} catch (KsMerchantApiException e) {e.printStackTrace();}if (response == null || response.getResult() != 1) {log.info("獲取授權失敗名稱: {} code:{} 錯誤返回參數 {}", shop, grantCode, response);throw new AfterSaleException("獲取授權失敗名稱: " + shop);}return response;}/*** 刷新快手token*/private KsAccessTokenResponse refreshKsAccessToken(String refreshToken, String shop) throws KsMerchantApiException {//不指定服務器地址,服務器地址默認為線上OauthAccessTokenKsClient oauthAccessTokenKsClient= new OauthAccessTokenKsClient(ksProperties.getAppKey(), ksProperties.getAppSecret());KsAccessTokenResponse response = oauthAccessTokenKsClient.refreshAccessToken(refreshToken);if (response == null || response.getResult() != 1) {log.info("刷新店鋪授權失敗店鋪名稱: {} 錯誤返回參數 {}", shop, response);throw new AfterSaleException("獲取店鋪授權失敗店鋪名稱: " + shop);}return response;}client_credentials 憑證獲取,適用于不需要商戶授權的接口
String appKey = "your app key"; String appSecret = "your app secret"; OauthCredentialKsClient oauthCredentialKsClient = new OauthCredentialKsClient(appKey, appSecret); // 生成AccessToken try { KsCredentialResponse response = oauthAccessTokenKsClient.getAccessToken(); System.out.println(JSON.toJSONString(response)); } catch (KsMerchantApiException e) { e.printStackTrace(); }拿到token 令牌調用需要的API
總結
以上是生活随笔為你收集整理的集成框架 -- 快手接入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不足100克按100克C语言,C语言_第
- 下一篇: Pandas DataFrame 使用技