所以我正在使用这个名为“moip”的支付网关(我来自巴西,条纹在这里不起作用),它接收用户的信用卡信息并制作哈希(因为敏感的数据传输等)。但由于某种原因,这段代码需要一个2长度类型的字符串表示月份和年份,当我传递这些值时它们变成可选的,因此main函数(使得哈希)不起作用并返回nil。示例代码:
func createHash() -> String? {
let creditCard = MPKCreditCard()
creditCard.number = "1234567891234567"
creditCard.expirationMonth = "01"
creditCard.expirationYear = "19"
creditCard.cvc = "123"
return MoipSDK.encryptCreditCard(creditCard)
}
这是objc中的对象MPKCreditCard:
#import <Foundation/Foundation.h>
#import "MPKCardType.h"
@interface MPKCreditCard : NSObject
@property NSString *number;
@property NSString *cvc;
@property NSString *expirationMonth;
@property NSString *expirationYear;
- (BOOL) isNumberValid;
- (BOOL) isSecurityCodeValid;
- (BOOL) isExpiryDateValid;
- (MPKCardType) cardType;
@end
属性“isEspiryDateValid”当然总是返回false,其他的都可以。
- (BOOL) isExpiryDateValid {
return [self isValidLengthExpiryDate] && [self isValidDate];
}
- (BOOL)isValidLengthExpiryDate {
return self.expirationMonth.length == 2 && (self.expirationYear.length == 2 || self.expirationYear.length == 4);
}
- (BOOL)isValidDate {
if (self.expirationMonth <= 0 || [self month] > 12) return NO;
return [self isValidWithDate:[NSDate date]];
}
这是创建哈希的函数:
+ (NSString *)encryptCreditCard:(MPKCreditCard*)creditCard {
NSString *valueToEncrypt = [NSString stringWithFormat:@"number=%@&cvc=%@&expirationMonth=%@&expirationYear=%@", creditCard.number, creditCard.cvc, creditCard.expirationMonth, creditCard.expirationYear];
NSLog(@"%@", valueToEncrypt);
NSString *encriptedData = [MPKUtilities encryptData:valueToEncrypt keyTag:kPublicKeyName];
if (encriptedData) {
return encriptedData;
}
return nil;
}
我对objc的了解不多,但该属性与其他属性没有什么不同(将值转换为可选值)。
我知道支付网关公司应该为我提供解决方案,我相信他们会,但今天(9月7日)是独立日,没有任何作用。所以我可以继续使用你的帮助,否则只是星期一:(
简而言之,我的问题是:我将未包装的非可选值传递给expirationMonth和expirationYear。但是当对象(mpkcreditcard)收到它们时,它会将它们变成可选项。
十分感谢大家!
我不太明白这个问题,但我相信你遇到的是obj-c中的所有值都可以为空,所以当桥接回到swift时,它们就变成了可选项。你只需打开它们就可以使用它们......
guard let experationMonth = creditcard.experationYear else { /* handle null */ }
print("\(experationMonth)")
这应该打印一个没有可选[“”]的展开字符串
当您想要将属性传递给Swift时,请确保将属性标记为非空。
@property (nonatomic, nonnull) NSString *number;
@property (nonatomic, nonnull) NSString *cvc;
@property (nonatomic, nonnull) NSString *expirationMonth;
@property (nonatomic, nonnull) NSString *expirationYear;
将类型标记为nonnull会在Swift中将它们导入为非可选项。