集成框架 -- 快手接入
開放文檔
新手指南
訂單列表
授權(quán)說明
附 - 物流信息編號 -快手物流公司編號
授權(quán)說明
快手開放平臺是基于OAuth2協(xié)議的開放授權(quán)和鑒權(quán)服務(wù),接入前需要了解標(biāo)準(zhǔn)的OAuth2的一些相關(guān)知識,可以參考文檔 THE OAUTH 2.0 AUTHORIZATION FRAMEWORK。開放平臺提供了OAuth2的兩種授權(quán)方式,授權(quán)碼code和客戶端憑證client_credentials,分別適用于需要用戶授權(quán)的授權(quán)API調(diào)用場景,以及不需要用戶授權(quán)的非授權(quán)API調(diào)用場景。
注:OAuth2相關(guān)知識是接入必備,建議提前閱讀。
授權(quán)方式
對于標(biāo)識了“需用戶授權(quán)”的API,需要使用OAuth2的code授權(quán)方式,獲取用戶access_token
OAuth2的code授權(quán)流程及接口簡介
當(dāng)access_token 過期時(shí),可以使用(在有效期內(nèi)的)refresh_token重新獲取新的access_token,不需要顯式的用戶授權(quán)過程,
若refresh_token也過期了,則需要再次經(jīng)過用戶授權(quán),因此需要關(guān)注refresh_token的時(shí)效,需要在時(shí)效內(nèi)用此接口再換取新的refresh_token才不會出現(xiàn)用戶授權(quán)頻繁失效的情況。該接口只支持authorization_code模式獲取access_token刷新,刷新得到新的access_token和refresh_token, 舊的refresh_token 隨即在5分鐘內(nèi)失效。
- refresh_token 長時(shí)訪問令牌,默認(rèn)為180天
- access_token 臨時(shí)訪問令牌,作為調(diào)用授權(quán)API時(shí)的入?yún)?#xff0c;過期時(shí)間為expires_in值 48小時(shí)
準(zhǔn)備工作
創(chuàng)建應(yīng)用
參考: 創(chuàng)建App指南
得到
- APPKEY
- APPSecret
授權(quán) 得到授權(quán)碼,或者填寫回調(diào)授權(quán)路由用于拿到授權(quán)grantCode
正文: 接入代碼
授權(quán)碼接入
@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;/*** 獲取授權(quán)令牌* <p>* 返回結(jié)果類型,1為正確,其他為不正確* 臨時(shí)訪問令牌,作為調(diào)用授權(quán)API時(shí)的入?yún)?#xff0c;過期時(shí)間為expires_in值,授權(quán)用戶、app和權(quán)限組范圍唯一決定一個(gè)access_token值* 注: access_token過期時(shí)間,單位秒,默認(rèn)為172800,即48小時(shí)** @param ksShopConfig* @return*/private Map<String, String> getKsAccessToken(KsShopConfig ksShopConfig) throws KsMerchantApiException {Map<String, String> map = new HashMap<>();getShopAccess(map, 店鋪授權(quán)碼, "Ks_refreshToken", "授權(quán)店鋪名稱", "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());}}}/*** 構(gòu)建快手 token獲取** @param shop* @param grantCode* @return*/private KsAccessTokenResponse getKsAccessTokenBuild(String grantCode, String shop) {//不指定服務(wù)器地址,服務(wù)器地址默認(rèn)為線上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("獲取授權(quán)失敗名稱: {} code:{} 錯(cuò)誤返回參數(shù) {}", shop, grantCode, response);throw new AfterSaleException("獲取授權(quán)失敗名稱: " + shop);}return response;}/*** 刷新快手token*/private KsAccessTokenResponse refreshKsAccessToken(String refreshToken, String shop) throws KsMerchantApiException {//不指定服務(wù)器地址,服務(wù)器地址默認(rèn)為線上OauthAccessTokenKsClient oauthAccessTokenKsClient= new OauthAccessTokenKsClient(ksProperties.getAppKey(), ksProperties.getAppSecret());KsAccessTokenResponse response = oauthAccessTokenKsClient.refreshAccessToken(refreshToken);if (response == null || response.getResult() != 1) {log.info("刷新店鋪授權(quán)失敗店鋪名稱: {} 錯(cuò)誤返回參數(shù) {}", shop, response);throw new AfterSaleException("獲取店鋪授權(quán)失敗店鋪名稱: " + shop);}return response;}client_credentials 憑證獲取,適用于不需要商戶授權(quán)的接口
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 令牌調(diào)用需要的API
總結(jié)
以上是生活随笔為你收集整理的集成框架 -- 快手接入的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不足100克按100克C语言,C语言_第
- 下一篇: ASP.NET Core使用Hangfi