SDK
Overview
SDK é a abreviação de Software Development Kit ou, em português, Kit de Desenvolvimento de Software. Um SDK é um conjunto de ferramentas de desenvolvimento de software capaz de facilitar a integração de sistemas em diferentes linguagens de programação. Além disso, usando um SDK é possível ter mais segurança e confiabilidade no processo de integração.
Construímos a Conta Stone SDK com o objetivo de permitir que parceiros como plataformas e ERPs possam realizar o processo de abertura de conta Stone sem que seus usuários tenham que fazer o download do nosso aplicativo (iOS e Android).
Assim, de maneira segura, os usuários poderão realizar os processos de autenticação e KYC interagindo de maneira direta com a Stone, mas por meio da SDK integrada pelo parceiro.
A Conta Stone SDK funciona como ponto de entrada para os três processos abaixo:
- SDK de Autenticação (Auth SDK): responsável por executar o processo de Autenticação seguindo os padrões especificados.
- Verificação de KYC (Pegasus SDK): responsável por capturar as informações do usuário que está realizando cadastro na conta.
Após obter o seu Token de Acesso, caso deseje usar nossa SDK e disponibilizar as etapas acima descritas aos seus usuários, siga os próximos passos para instalação do kit para iOS e Android.
Integração Android
A Conta Stone SDK é responsável por todo o fluxo de login e Know Your Customer da Stone Openbank API.
Contato
Se durante a integração você encontrar algum problema ou ponto de melhoria, entre em contato com a gente através da ferramenta de suporte.
Como funciona
A Conta Stone SDK é o ponto de entrada para acesso às nossas SDKs de autenticação, aprovação e verificação de KYC (Know Your Customer).
-
A SDK de autenticação é responsável por executar todo o processo de autenticação seguindo as diretrizes do OAuth2.
-
A SDK de aprovação é responsável pelo processo de aprovação e rejeição de transações.
-
A SDK de KYC é responsável por capturar as informações do usuário que está realizando cadastro na conta.
Como Integrar com a Conta Stone SDk
Antes de começar a integração é necessário obter uma chave de acesso ao repositório, pois trata-se de um repositório privado. Para obter essa chave, entre em contato com a gente.
No arquivo build.gradle
do projeto, adicione a URL do repositório e substitua o {access-key}
pela chave fornecida.
maven { url "https://packagecloud.io/priv/${access-key}/Stone/stoneid/maven2"}
Também é preciso adicionar o Jetpack, pois usamos algumas libs que estão disponíveis nesse repositório.
maven { url 'https://jitpack.io' }
Importe a dependência da Conta Stone SDK.
implementation 'co.stone:stone-android:${latest_version}'
A Conta Stone SDK utiliza o Firebase para implementar alguns de seus serviços, logo é necessário ter um projeto no Firebase e integrá-lo no seu app. Para mais informações sobre como adicionar o Firebase ao seu projeto, acesse este link.
Sincronize o projeto e pronto, já é possível utilizar a Conta Stone SDK!
Inicializando a SDK
Uma vez que a dependência foi importada, o passo seguinte da integração é inicializar a SDK no seu Application
. Para isso é necessário especificar os parâmetros abaixo.
class App : Application() {
private val environment = Environment.SANDBOX
val stoneSdk by lazy {
Stone.init(
this,
environment,
AppInfo(
name = "YOUR_APP_NAME",
version = BuildConfig.VERSION_NAME,
buildId = "NA",
applicationId = BuildConfig.APPLICATION_ID,
themeId = R.style.YOUR_APP_THEME
),
AuthInfo(
clientId = "YOUR_CLIENT_ID",
tokenMasterKeyUri = URI("android-keystore://cssdk-sample-token-key"),
httpClientConfig = HttpClientConfig()
),
DeepLinkUris(
uriLogout = "sample://uri.logout",
uriChat = "sample://uri.chat",
uriHelp = "sample://uri.help",
uriKyc = "sample://uri.kyc",
uriUpdateApp = "sample://uri.forceupdate",
uriDashboard = "sample://uri.dashboard"
)
)
}
override fun attachBaseContext(base: Context) {
super.attachBaseContext(base)
StoneContext.setContext(base)
}
}
-
application
: Trata-se da instância doApplication
do seu app; -
environment
: Existem 3 ambientes para os quais a SDK pode apontar:HOMOLOGUE
,SANDBOX
ePRODUCTION
. Para fins de teste, use oEnvironment.SANDBOX
; -
appInfo
: Informações referentes ao app como nome, versão e buildId; -
authInfo
: Informações referentes a autenticação como clientId (fornecido pelo time de suporte OpenBank), configuração doOkHttp
e URI para a chave mestra no formatoandroid-keystore://
(será utilizada para acessar o Keystore do Android e salvar o token do usuário de forma segura); -
deepLinkUris
: URIs usadas para fazer a navegação para Activities externas à SDK. Exemplo: auriLogout
se refere à Activity para a qual o usuário deve ser redirecionado depois que ele for deslogado do app. Essa navegação é feita por deeplink; -
StoneContext.setContext()
: Precisamos ter acesso aoContext
da aplicação para realizar algumas operações internas relacionadas ao ciclo de vida do app.
Iniciando fluxo de Autenticação e verificação de KYC
Para iniciar o fluxo de autenticação e verificação de KYC, é necessário chamar o método abaixo.
stoneSdk.session
.verify(activity = this, params = SessionVerificationParams(Full))
.runAsync(
onSuccess = { result -> /* HANDLE RESULT */ },
onFailure = { error -> /* HANDLE ERROR */ }
)
Esse método inicia a Activity principal da SDK e executa os fluxos internos de autenticação e verificação de KYC. Quando o processo é finalizado, a Conta Stone SDK retorna um FlowResult
que deve ser tratado pelo app.
Lidando com o resultado da SDK
Ao finalizar o fluxo de autenticação e verificação, a SDK emite um resultado para o app informando o desfecho do fluxo. Segue abaixo um exemplo de como tratar o resultado emitido pela Conta Stone SDK e o que cada um significa.
when (result) {
is FlowResult.Completed -> handleSuccess()
is FlowResult.Cancelled -> handleCancellation()
is FlowResult.Failed -> handleError()
}
Como fazer logout
Para deslogar o usuário, podemos fazer uma chamada para o método de logout seguindo o exemplo abaixo.
stoneSdk.auth
.logout()
.runAsync(
onSuccess = { /* HANDLE SUCCESS */ },
onFailure = { error -> /* HANDLE ERROR */ }
)
Obtendo o Client autenticado
A authSDK é responsável por todo o processo de autenticação, incluindo a adição do token no header das chamadas para a API do Stone Openbank. Para isso a SDK fornece um OkHttpClient
configurado que pode ser utilizado nas chamadas HTTP do seu app. Esse client possui certificate pinning com os certificados da API do Stone OpenBank e é possível acessá-lo chamando o método stoneSdk.auth.getOkHttpClient()
.
private suspend fun getInstitutions(): List<Institution> {
val httpService = HttpService.BankingGatewaySandbox
val client = stoneSdk.auth.getOkHttpClient().run()
val request = Request.Builder()
.url("${httpService.url}/api/v1/institutions")
.get()
.build()
val response = client.newCall(request).execute()
return InstitutionMapper.toDomain(response)
}
Integração com Coroutines e RxJava
A API pública da Conta Stone SDK retorna sempre um Runnable<T>
, com ele é possível escolher de qual forma deseja executar a operação:
runAsync()
: utiliza callbacks (útil se você estiver utilizando Java)run()
erunCatching()
: sãosuspend fun
, devem ser chamadas dentro de um Coroutine Scope (recomendado para quem utiliza Kotlin)asFlow()
: retorna umFlow
do CoroutinesasSingle()
,asObservable()
,asCompletable()
easFlowable()
: integração com RxJava
Exemplo com Coroutines:
viewModelScope.launch {
val session = stoneSdk.session.getSession().run()
}
Exemplo com RxJava:
stoneSdk.session
.getSession()
.asSingle()
.subscribeBy(
onSuccess = { session -> ... },
onError = { error -> ... }
)
Integração iOS
Contato
Se durante a integração encontrar algum problema ou ponto de melhoria, entre em contato com a gente através da ferramenta de suporte.
Instalação
Requisitos
- iOS 10.0
- Xcode 11.7
Configuração
Antes de começar a usar a Conta Stone SDK, é necessário seguir alguns procedimentos:
-
Baixe o arquivo zip no link com os frameworks necessários.
-
Extraia a pasta Frameworks no diretório raiz do projeto.
-
No target do projeto, acesse a guia
General
e, emFrameworks, Libraries, and Embedded Content
, adicione os frameworks:- ContaStoneSDK.framework
- CryptoSwift.framework
- JOSESwift.framework
- TinyConstraints.framework
- XCoordinator.framework
-
Na guia
Build Settings
, emBuild Options
, selecioneNO
para a configuraçãoEnable Bitcode
. -
Na guia
Build Settings
, emRunpath Search Paths
, adicione a entrada@executable_path/Frameworks/ContaStoneSDK.framework/Frameworks/
. -
Logo abaixo em
Framework Search Paths
, adicione a entrada$(PROJECT_DIR)/Frameworks/ContaStoneSDK.framework/Frameworks/
no modo recursivo. -
Em
Build Phases
adicione um novo script chamado “Sign” (em Build Phases, clique sinal de “mais” e selecione New Run Script Phase).
pushd ${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app/Frameworks/ContaStoneSDK.framework/Frameworks
for EACH in *.framework; do
echo "-- signing ${EACH}"
/usr/bin/codesign --force --deep --sign "${EXPANDED_CODE_SIGN_IDENTITY}" --entitlements "${TARGET_TEMP_DIR}/${PRODUCT_NAME}.app.xcent" --timestamp=none
$EACH
done
popd
- Adicione dependências:
// Cocoapods
pod 'Alamofire', '4.8.2'
pod 'RxSwift', '~> 5'
pod 'RxCocoa', '~> 5'
pod 'lottie-ios', '3.1.6'
pod 'AloeStackView', '1.2.0'
// Carthage
github "Alamofire/Alamofire" "4.8.2"
github "ReactiveX/RxSwift" "5.1.1"
github "airbnb/lottie-ios" "3.1.6"
github "airbnb/AloeStackView" "v1.2.0"
USO
Configurando o AppDelegate
import UIKit
import ContaStoneSDK
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
ContaStone.configure(
id: "john.doe@openbank.com",
scopes: ["offline_access"],
environmentType: .sandbox, // .homol, .sandbox, .production
delegate: self
)
return true
}
}
extension AppDelegate: ContaStoneDelegate {
func refreshApp() {}
func sessionRevoked() {}
func loggedOut() {}
func showHelpCenter() {}
func showChat() {}
func showFrequentlyAskedQuestions() {}
}
Autenticação
import UIKit
import ContaStoneSDK
class ViewController: UIViewController {
func checkAuthenticationState() {
if ContaStone.isAuthenticated {
ContaStone.currentAcount.name // John Doe Inc
} else {
ContaStone.login(checkKYC: true) { /* callback */ }
}
}
}
Logout
import UIKit
import ContaStoneSDK
class ViewController: UIViewController {
func logout() {
ContaStone.logout { /* callback */ }
}
}
Requisições
class ViewController: UIViewController {
func fetchBalance() {
let id = ContaStone.currentAcount.id
let endpoint = Endpoint<BalanceResponse>(method: .get, path: "/api/v1/accounts/\(id)/balance")
ContaStone.performRequest(endpoint) { result in
switch result {
case .success(let response):
/* callback */
case .failure(let error):
/* callback */
}
}
}
}
Exemplo
Antes de abrir o projeto de exemplo, é necessário executar o script de bootstrap.
./bootstrap
open Sample.xcworkspace