工作筆記之難點記錄
最近項目中用到了Stripe進行支付典尾,我們公司主要是做一些國外的項目,當然也有國內的項目惩阶,國外的項目居多挎狸,言歸正傳,那么stripe是什么断楷?網上一搜锨匆,其實可以搜到一大堆,關于這個公司的介紹冬筒,這個公司主要是做信用卡支付的一個公司恐锣,那么我們公司的需求是是什么,第一账千,信用卡支付侥蒙,第二debit卡取現,所以我們就得用到了Stripe的SDK
相對于來匀奏,支付流程是很簡單的,因為這個sdk中為我們封裝了幾個特別好用的頁面学搜,如果沒有特殊的需求直接用這個就好了娃善。
支付的時候我們主要用到了一個“STPPaymentContext”,“STPPaymentMethodsViewController”,“STPAddCardViewController”這兩個類瑞佩,那么這兩個類是干什么的呢聚磺?第一個類其實是一個管理上下文,第二個其實就是一個選擇支付方式的controller炬丸,第三個是添加卡的一個VIewController瘫寝。其實這一切都是stripeSDK封裝好了,我們需要寫一個和我們自己后臺溝通的類遵循STPBackendAPIAdapter協(xié)議稠炬,實現協(xié)議的方法焕阿,在SDK內部會調用這些方法,獲取數據首启,這時我就不得不說這就是大神寫的澳郝拧!毅桃!思路褒纲,這種設計模式用的太恰當了准夷。強力推薦看一下源碼,這個sdk中有許多特別好的設計模式莺掠,實戰(zhàn)衫嵌。然后初始化context,初始化會用到我們剛才提到的類彻秆,基本的初始化好了之后渐扮,我們只要在需要選擇支付的地方,用context調用pushPaymentMethodsViewController或者presentPaymentMethodsViewController掖棉,就可以了墓律,接下來的事情,就是在代理方法中做了幔亥,我們發(fā)送該有token和數據等等給我們后臺耻讽,讓他們跟stripe交互,完成支付帕棉。這都有example针肥,和詳細的文檔,所以很簡單香伴,重點我要說的是第二個問題payout慰枕,自動體現。
payout 這里邊的坑真是不少啊即纲,讓我寢食難安了好多天具帮。因為什么,官網中只字未提到低斋,ios或者安卓的payout蜂厅,沒有example,這怎么辦膊畴,那就得靠自己去看源碼掘猿,有沒有關于payout的東西,自己一點一點發(fā)覺唇跨。由于這部分內容很少稠通,所以包括后臺的文檔也很少,所以我們都是在一點點的探索中弄出來的买猖,開始的時候改橘,產品需求也沒實際弄明白這部分東西,所以就給了和payment一樣的支付方式頁面政勃,和添加卡頁面唧龄,開始我和PL都以為可能payment和payout這兩個頁面是公用的,可是很快我就發(fā)現了不對勁,于是乎我通讀了文檔中后臺api文檔關于payout相關的既棺,發(fā)現大家都搞錯了讽挟,這是兩碼事,而且這個頁面也不能用一個頁面丸冕,payment的卡token和payout的token生成不一樣耽梅,并且生成方式不一樣。于是我和PL開了一個小會胖烛,怎么弄眼姐。PL說要不用分別給STPAddCardViewController,STPPaymentMethodsViewController寫個分類佩番,我覺得這種方式不行众旗,因為這兩個類里邊有很多的邏輯,寫一個分類趟畏,即使寫好多方法贡歧,也不能確定能控制以前payment的邏輯變成payout的邏輯,然后我提出用繼承赋秀,重寫有關于這部分的方法利朵,雖然也不容易控制但是畢竟會比分類好很多,但是實際情況又是不行猎莲,因為stripe在做sdk的時候有很多文件都是private的绍弟,所以不允許我們繼承,這個也不行著洼,那個也不行樟遣,這怎么辦呢,已經兩天過去了郭脂,PL也著急年碘,我也著急,之后那天晚上回家展鸡,我又仔細看了一遍文檔,突然眼前一亮埃难,有了想法莹弊,為什么我們要依賴SDK呢,我們就自己寫一個卡列表頁面涡尘,和添加卡頁面忍弛,這樣所有的邏輯都由我們自己控制了,于是第二天迫不及待的和PL提出了我的想法考抄,PL同意了說细疚,就按照你的想法做吧。很快川梅,一天搞定了這兩個東西疯兼,下面貼出重要的代碼:
ACPayoutAddCardViewController
- (void)nextPressed:(UIButton *)btn{
self.loading = YES;
STPBankAccountParams *params = [[STPBankAccountParams alloc] init];
params.accountNumber = [_accountNumCell.textField.textstringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
params.routingNumber = [_routingNumCell.textField.textstringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
params.accountHolderName = _accountNameCell.textField.text;
NSString *accountType = [_accountTypeCell.textField.textstringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
params.accountHolderType = [accountType isEqualToString:@"Individual"] ?STPBankAccountHolderTypeIndividual:STPBankAccountHolderTypeCompany;
params.currency = @"usd";
params.country = @"US";
[[STPAPIClientsharedClient]createTokenWithBankAccount:params completion:^(STPToken * _Nullable token, NSError * _Nullable error) {
if (error) {
[self handleCardTokenError:error];
} else {
[self creatPayoutBankAccountWithToken:token.tokenIdandComplete:^(NSError* _Nullable error) {
NSLog(@"%@", error.localizedDescription);
self.loading = NO;
if (error) {
[self handleCardTokenError:error];
} else {
[self.delegate payoutAddCardViewControllerDidAddCardSuccess:selfandToken:token];
}
}];
}
}];
}
ACPayoutMethodViewController
- (void)loadData {
if(!_activityIndicator) {
[selfsetUp];
}
self.activityIndicator.animating =YES;
self.tableView.hidden =YES;
[_apiAdapter retrieveCustomer:^(STPCustomer * _Nullable customer,NSError* _Nullable error) {
if(error) {
[selfshowSystemAlertViewWithTitle:@""andText:error.localizedDescription andHandle:nil];
}else{
self.tableView.hidden =NO;
self.activityIndicator.hidden =YES;
[self.activityIndicator removeFromSuperview];
STPCard *selectedCard;
NSMutableArray *cards = [NSMutableArrayarray];
for(id sourceincustomer.sources) {
if([source isKindOfClass:[STPCardclass]]) {
STPCard *card = (STPCard *)source;
[cards addObject:card];
if([card.stripeID isEqualToString:customer.defaultSource.stripeID]) {
selectedCard = card;
}
}
}
ACPayoutCardTuple *cardTuple = [ACPayoutCardTuple payoutCardTupleWithCards:cards andSelectedCard:selectedCard];
_cardTuple = cardTuple;
[self.tableView reloadData];
}
}];
}
#pragma mark - ADD Card Delegate
- (void)payoutAddCardViewControllerDidAddCardSuccess:(ACPayoutAddCardViewController *) payoutAddCardViewController andToken:(STPToken *)token{
NSMutableArray*array = [NSMutableArrayarrayWithArray:self.cardTuple.cards];
if(token.card) {
[array addObject:token.card];
}else{
STPCard *card = [[STPCard alloc] initWithID:token.bankAccount.bankAccountId brand:STPCardBrandUnknown last4:token.bankAccount.last4 expMonth:0expYear:0funding:STPCardFundingTypeDebit];
[array addObject:card];
}
[payoutAddCardViewController.navigationController popViewControllerAnimated:YES];
self.cardTuple.cards = [array mutableCopy];
[self.tableView reloadData];
}