Configuração Inicial e Dependências
Para integrar a solução de pagamentos móvel do Alipay, é necessário configurar corretamente o ambiente de desenvolvimento. Baixe a versão mais recente do pacote oficial e posicione os arquivos necessários diretamente na pasta do projeto no seu IDE preferido.
Você deve incluir os seguintes componentes binários:
- AlipaySDK.framework
- AlipaySDK.bundle
No editor de projetos, navegue até a aba Build Phases e certifique-se de vincular as bibliotecas corretas no item Link Binary With Libraries. A configuração das dependências depende da versão do compilador:
- Para versões acima do Xcode 7.0: Adicione
libc++.tbdelibz.tbd. - Para versões anteriores ao Xcode 7.0: Utilize
libc++.dylibelibz.dylib.
Inicialização da Classe SDK
O acesso aos recursos de pagamento requer a inclusão do cabeçalho principal na classe onde a integração será disparada:
#import <AlipaySDK/AlipaySDK.h>
Construção da Payload de Transação
A criação da cadeia de pedidos segura envolve a montagem dos parâmetros exigidos pela plataforma. Embora o exemplo abaixo demonstre a lógica em cliente para fins didáticos, a prática recomendada de engenharia exige que esta operação ocorra no servidor para prtoeger as chaves privadas.
Abaixo, apresentamos uma estrutura reorganizada para gerar a cadeia de assinatura:
// Estrutura personalizada para dados do pedido
typedef NS_ENUM(NSInteger, TransactionType) {
TransactionTypeStandard = 0
};
@implementation TransactionBuilder
- (NSString *)generateTransactionString {
NSMutableDictionary *params = [NSMutableDictionary dictionaryWithCapacity:8];
// Identificação da aplicação
params[@"app_id"] = kApplicationIdentifier;
// Definição da interface de serviço
params[@"method"] = @"alipay.trade.app.pay";
params[@"charset"] = @"utf-8";
params[@"version"] = @"1.0";
params[@"sign_type"] = @"RSA2";
// Timestamp atualizado
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
[fmt setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
params[@"timestamp"] = [fmt stringFromDate:[NSDate date]];
// Conteúdo de negócios encapsulado
NSDictionary *businessInfo = @{
@"body": @"Descrição do produto ou serviço",
@"subject": kProductSubject,
@"total_amount": kProductPrice,
@"out_trade_no": [self generateUniqueOrderId],
@"timeout_express": @"60m"
};
// Serialização do conteúdo JSON
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:businessInfo options:NSJSONWritingPrettyPrinted error:nil];
params[@"biz_content"] = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
return [self assembleParameters:params];
}
- (NSString *)assembleParameters:(NSDictionary *)params {
NSMutableArray *sortedKeys = [params.allKeys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2];
}];
NSMutableString *stringToSign = [NSMutableString string];
for (NSString *key in sortedKeys) {
NSString *value = params[key];
if ([value isKindOfClass:[NSString class]]) {
[stringToSign appendFormat:@"%@=%@", key, value];
[stringToSign appendString:@"&"];
}
}
// Remove o último caractere '&'
NSRange range = [stringToSign rangeOfString:@"&"];
if(range.location != NSNotFound) {
[stringToSign deleteCharactersInRange:NSMakeRange([stringToSign length]-1, 1)];
}
return stringToSign;
}
@end
Após montar o texto base, realize a assinatura criptográfica. O processo deve ser isolado no backend para evitar vazamento de credenciais. Utilize algoritmos compatíveis (como RSA) e codifique o resultado usando Base64.
// Exemplo de chamada da API de pagamento (Simulação de Lógica)
[[AlipaySDK defaultService] payOrder:signedOrderString
fromScheme:@"myapp_scheme"
callback:^(NSDictionary *result) {
dispatch_async(dispatch_get_main_queue(), ^{
// Tratar retorno
NSLog(@"Status: %@", result);
});
}];
Manipulação de URLs e Delegados
O fluxo de retorno do aplicativo requer tratamento adequado do protocolo URI. Você deve implementar os métodos apropriados na sua classe AppDelegate para interceptar callbacks vindos do aplicativo Alipay.
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
return [[AlipaySDK defaultService] processOrderWithPaymentResult:url
standbyCallback:^(NSDictionary *resultDict) {
NSLog(@"Resultado: %@", resultDict);
}];
}
// Suporte para versões posteriores do iOS (9.0+)
- (BOOL)application:(UIApplication *)app
openURL:(NSURL *)url
options:(NSDictionary<nsstring id=""> *)options {
return [[AlipaySDK defaultService] processOrderWithPaymentResult:url
standbyCallback:^(NSDictionary *resultDict) {
NSLog(@"Processando resposta do sistema bancário.");
}];
}</nsstring>
Configure o arquivo Info.plist dentro da seção URL Types definindo um esquema exclusivo para sua aplicação. Este esquema deve corresponder à constante usada na chamada da API de pagamento para garantir o retorno correto à sua interface.
Gestão de Erros Comuns
Durante a compilação, algumas inconsistências podem surgir relacionadas a caminhos de headers e bibliotecas externas como OpenSSL. Verifique as configurações abaixo:
- Paths de Headers: Adicione o diretório raiz do projeto nas variáveis Header Search Paths se houver erros de "file not found".
- Frameworks: Garanta que
SystemConfiguration.frameworkesteja presente na lista de vinculadores. - Bibliotecas Cryptográficas: Se utilizar OpenSSL localmente para testes, verifique a estrutura de pastas e ajuste os caminhos de busca relativos ao projeto.
Referência Técnica de Métodos
| Método | Descrição |
|---|---|
+defaultService |
Retorna a instância singleton necessária para operações subsequentes. |
payOrder:fromScheme:callback: |
Inicia o processo transacional direto no cliente. Recebe uma cadeia de parâmetros assinada e define o callback para o sucesso ou falha. |
processOrderWithPaymentResult:standbyCallback: |
Essencial para apps encerrados. Lê o URL retornado pelo cliente de pagamento para validar a transação em segundo plano. |
Para implementação detalhada, recomenda-se consultar os exemlpos disponíveis nos arquivos de demonstração fornecidos pelo fornecedor, focando principalmente nas rotinas de serialização e tratamento seguro de dados sensíveis.