第三方平臺(tái)賬號(hào)的綁定

版本記錄

版本號(hào) 時(shí)間
V1.0 2017.05.27

前言

??很多時(shí)候,我們app的個(gè)人中心這個(gè)模塊都需要綁定QQ,微信和微博等第三方平臺(tái)的需求,我們以前的項(xiàng)目也有這方面的需求,正好我也負(fù)責(zé)這一塊,下面我就詳細(xì)的和大家說(shuō)一個(gè)這塊的實(shí)現(xiàn)方法。

詳情

一、需求展示

首先我們先看一下需求,如下圖所示:

第三方平臺(tái)綁定需求

??我這里都綁定好了,所以這里都顯示的是已綁定,正常的需求是如果沒(méi)有綁定,這里就顯示未綁定,大家湊合著看吧,知道意思即可。


二、技術(shù)方案

我這里可以想到的是兩種方案:

  • 集成QQ等需要綁定的QQ,微信等SDK,根據(jù)接口發(fā)送請(qǐng)求獲取openid,location,nickname等參數(shù),然后在給自己的服務(wù)器發(fā)送請(qǐng)求,實(shí)現(xiàn)綁定。
  • 利用第三方SDK,比如shareSDK直接可以獲取接口數(shù)據(jù)信息,然后給請(qǐng)求自己的服務(wù)器綁定。

我這里采取的是第二種方法,下面我分析下優(yōu)缺點(diǎn):

  • 優(yōu)點(diǎn):與登錄模塊使用相同的shareSDK,這里同樣用這個(gè)就減小了包的大小,同時(shí)減少了分著平臺(tái)集成的工作量,減少時(shí)間成本。
  • 缺點(diǎn):如果是分著集成,可以很自由的功能定制,使用第三方ShareSDK受限于接口規(guī)則,不能自由定制,自由度相對(duì)小,但是這里采用第二種方案已足夠,可以了。

三、方案實(shí)現(xiàn)

??下面我就給出主要的代碼實(shí)現(xiàn),至于具體的ShareSDK的集成,schemeURL的配置和跳轉(zhuǎn)我就不說(shuō)了,感興趣的可以看我的別的博客,里面都有講述,下面看代碼。

1. cell的點(diǎn)擊方法

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    
    self.activityIndicatorView = [[JJUIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    self.activityIndicatorView.center = self.view.center;
    [self.view addSubview:self.activityIndicatorView];
    [self.activityIndicatorView startAnimating];
    
    if (indexPath.section == 0) {
        switch (indexPath.row) {
                
            //手機(jī)號(hào)
            case 0:
                {
                    if (self.mobileBindStr.length < 5) {
                        NSLog(@"可以綁定手機(jī)號(hào)了");
                        JJLoginNewUserRegistVC *mobileBindedVC = [[JJLoginNewUserRegistVC alloc] init];
                        mobileBindedVC.isBindPhoneNum = YES;
                        [self.navigationController pushViewController:mobileBindedVC animated:YES];
                    }
                }
                break;
                
            //QQ號(hào)
            case 1:
            {
                if (!self.isQQBinded) {
                    NSLog(@"可以綁定QQ號(hào)了");
                    
                    [SSEThirdPartyLoginHelper loginByPlatform:SSDKPlatformTypeQQ onUserSync:^(SSDKUser *user, SSEUserAssociateHandler associateHandler) {
                        [self requestLogin:user loginType:SSDKPlatformTypeQQ];
                    } onLoginResult:^(SSDKResponseState state, SSEBaseUser *user, NSError *error) {
                        if (state == SSDKResponseStateSuccess) {
                            NSLog(@"登錄成功");
                        }
                        [self.activityIndicatorView stopAnimating];
                        [self.activityIndicatorView setHidesWhenStopped:YES];
                    }];
                }
            }
                break;
                
            //微信號(hào)
                
            case 2:
            {
                if (!self.isWechatBinded) {
                    NSLog(@"可以綁定微信號(hào)了");
                    
                    [SSEThirdPartyLoginHelper loginByPlatform:SSDKPlatformTypeWechat onUserSync:^(SSDKUser *user, SSEUserAssociateHandler associateHandler) {
                        [self requestLogin:user loginType:SSDKPlatformTypeWechat];
                    } onLoginResult:^(SSDKResponseState state, SSEBaseUser *user, NSError *error) {
                        if (state == SSDKResponseStateSuccess) {
                            NSLog(@"登錄成功");
                        }
                        [self.activityIndicatorView stopAnimating];
                        [self.activityIndicatorView setHidesWhenStopped:YES];
                    }];
                }
            }
                break;
                
            //微博號(hào)
            case 3:
            {
                if (!self.isWeiboBinded) {
                    NSLog(@"可以綁定微博號(hào)了");
                    
                    [SSEThirdPartyLoginHelper loginByPlatform:SSDKPlatformTypeSinaWeibo onUserSync:^(SSDKUser *user, SSEUserAssociateHandler associateHandler) {
                        [self requestLogin:user loginType:SSDKPlatformTypeSinaWeibo];
                    } onLoginResult:^(SSDKResponseState state, SSEBaseUser *user, NSError *error) {
                        if (state == SSDKResponseStateSuccess) {
                            NSLog(@"登錄成功");
                        }
                        [self.activityIndicatorView stopAnimating];
                        [self.activityIndicatorView setHidesWhenStopped:YES];
                    }];
                }
            }
                break;
                
            default:
                break;
        }
    }
    else {
        JJLoginForgetPasswordVC *resetPasswordVC = [[JJLoginForgetPasswordVC alloc] init];
        [self.navigationController pushViewController:resetPasswordVC animated:YES];
    }
}
2. cell的顯示
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.section == 0) {
        JJPersonCenterSexCell *cell = [tableView dequeueReusableCellWithIdentifier:kJJSettingAccountSecurityVCPhoneReuseIdentify forIndexPath:indexPath];
        cell.accountSecurityStr = self.titleArr[indexPath.row];
        switch (indexPath.row) {
                
            //手機(jī)號(hào)綁定
            case 0:
                {
                    if (self.mobileBindStr.length > 5) {
                        cell.accountSecurityDetailStr = self.mobileBindStr;
                    }
                    else {
                        cell.accountSecurityDetailStr = @"未綁定";
                    }
                }
                break;
                
            //QQ綁定
            case 1:
                {
                    if (self.isQQBinded) {
                        cell.accountSecurityDetailStr = @"已綁定";
                    }
                    else{
                        cell.accountSecurityDetailStr = @"未綁定";
                    }
                }
                break;
                
            //微信綁定
            case 2:
            {
                if (self.isWechatBinded) {
                    cell.accountSecurityDetailStr = @"已綁定";
                }
                else{
                    cell.accountSecurityDetailStr = @"未綁定";
                }
            }
                break;
                
            //微博綁定
            case 3:
            {
                if (self.isWeiboBinded) {
                    cell.accountSecurityDetailStr = @"已綁定";
                }
                else{
                    cell.accountSecurityDetailStr = @"未綁定";
                }
            }
                break;
                
            default:
                break;
        }
        
        return cell;
    }
    
    JJPersonCenterSecurityCell *cell = [tableView dequeueReusableCellWithIdentifier:kJJSettingAccountSecurityVCPsdRemakeReuseIdentify forIndexPath:indexPath];
    cell.accountSecurityStr = @"重置密碼";
    return cell;
}
3. 向我們自己的服務(wù)器發(fā)送請(qǐng)求,實(shí)現(xiàn)綁定
- (void)requestLogin:(SSDKUser *)user loginType:(SSDKPlatformType)loginType
{
    [MBProgressHUD showHUDAddedTo:self.view animated:YES];
    NSMutableDictionary *paramDict = [self gainParameterWithUser:user loginType:loginType];
    [self bindThirdPartyWithParam:paramDict bindType:loginType];
}
- (NSMutableDictionary *)gainParameterWithUser:(SSDKUser *)user loginType:(SSDKPlatformType)loginType
{
    NSMutableDictionary *paramDict = [NSMutableDictionary dictionary];
    
    NSString *logAuthTypeType = nil;
    
    switch (loginType) {
            
        case SSDKPlatformTypeWechat:
        {
            logAuthTypeType = @"2";
        }
            break;
            
        case SSDKPlatformTypeQQ:
        {
            logAuthTypeType = @"3";
        }
            break;
            
        case SSDKPlatformTypeSinaWeibo:
        {
            logAuthTypeType = @"4";
        }
            break;
            
        default:
            break;
    }
    
    switch (user.gender) {
        case SSDKGenderMale:
            [paramDict setObject:@"1" forKey:@"userSex"];
            break;
        case SSDKGenderFemale:
            [paramDict setObject:@"2" forKey:@"userSex"];
            break;
        case SSDKGenderUnknown:
            [paramDict setObject:@"0" forKey:@"userSex"];
            break;
        default:
            break;
    }
    
    NSString *icon = nil;
    if (loginType == SSDKPlatformTypeQQ) {
        icon = [user.rawData valueForKey:@"figureurl_qq_2"];
    } else if(loginType == SSDKPlatformTypeSinaWeibo){
        icon = user.icon;
    } else if (loginType == SSDKPlatformTypeWechat) {
        icon = user.icon;
    }
    NSString *avatar =[NSString stringWithFormat:@"%@",icon];
   
    [paramDict setObject:user.uid?:@"" forKey:@"authOpenid"];                                       //openid
    [paramDict setObject:logAuthTypeType?:@"" forKey:@"authType"];                                  //authorType
    [paramDict setObject:[user.rawData objectForKey:@"unionid"]?:@"" forKey:@"authUnionid"];        //authUnionid
    [paramDict setObject:avatar?:@"" forKey:@"userAvatar"];                                         //userAvatar
    [paramDict setObject:[user.rawData objectForKey:@"city"]?:@"" forKey:@"userCity"];              //userCity
    [paramDict setObject:user.nickname?:@"" forKey:@"userNickname"];                                //userNickname
    [paramDict setObject:[user.rawData objectForKey:@"province"]?:@"" forKey:@"userProvince"];      //userProvince
    [paramDict setObject:user.verifyReason?:@"" forKey:@"verifiedReason"];                          //verifiedReason
    
    return paramDict;
}
//請(qǐng)求自己的服務(wù)器

- (void)bindThirdPartyWithParam:(NSMutableDictionary *)paramDict bindType:(SSDKPlatformType)bindType
{
    if (![JJNetworkReachabilityTool sharedNetworkReachabilityTool].isReachable) {
        return;
    }
    
    [[JJNetWorkManager manager] requestByPostNetworkWithServerUrl:kPThirdPartyBind parameters:paramDict success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        NSLog(@"%@",responseObject);
        
        if ([[responseObject objectForKey:@"code"] integerValue] == 0) {
            switch (bindType) {
                    
                case SSDKPlatformTypeWechat:
                {
                    self.isWechatBinded = YES;
                }
                    break;
                    
                case SSDKPlatformTypeQQ:
                {
                    self.isQQBinded = YES;
                }
                    break;
                    
                case SSDKPlatformTypeSinaWeibo:
                {
                    self.isWeiboBinded = YES;
                }
                    break;
                    
                default:
                    break;
            }
            
            [self.tableView reloadData];
        }
        [MBProgressHUD hideHUDForView:self.view animated:YES];
        
    } error:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
        [MBProgressHUD hideHUDForView:self.view animated:YES];
        NSLog(@"error---%@",error);
        
    }];
}

??核心代碼就這么多,相信大家也都能看懂,就不多說(shuō)了,未來(lái)的三天端午假期祝大家過(guò)的愉快。


后記

??三天假期來(lái)了,大家可以休息一下了,哈哈,提前祝大家假期快樂(lè),最近幾天總是一遍遍的回顧08奧運(yùn)北京的開幕式,越看越喜歡,每次看歌唱祖國(guó)升旗的那一段,眼眶都不由得濕潤(rùn),祖國(guó)近現(xiàn)代屈辱了好幾百年,可算慢慢崛起了,希望越走越順,我大的貢獻(xiàn)做不了,希望做好我的本職工作,做到極致,我想就可以了。再次祝大家端午節(jié)快樂(lè)!!!

歌唱祖國(guó)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 由于近期工作需要自己抽時(shí)間搞了一下第三方分享,這里使用的是shareSDK的第三方,在使用的過(guò)程中有一些心得和體會(huì)...
    燦爛先森閱讀 11,340評(píng)論 29 69
  • 原標(biāo)題 : IOS集成微信支付或者支付寶支付功能小結(jié) 2016.7.1。由于蘋果強(qiáng)制要求適配ipv6,本文demo...
    Leonmmmmm閱讀 33,191評(píng)論 50 133
  • 不久之前 我遇見(jiàn)一場(chǎng)雨 一場(chǎng)溫暖和煦暖的快要溢出來(lái)的小雨 我想這場(chǎng)雨會(huì)變成一片海 而我想擁有這片海 是一直擁有 每...
    南墻先生閱讀 181評(píng)論 0 0
  • 黃崢對(duì)造假這件事的看法是什么?他打算怎么處理? 黃崢認(rèn)為假貨問(wèn)題其實(shí)是把造假和山寨問(wèn)題混在一起了,真正意義上的假貨...
    Doris_LJ閱讀 131評(píng)論 0 0
  • 無(wú)標(biāo)題,單純分享圖片,拿圖自動(dòng)點(diǎn)贊 拿圖點(diǎn)贊,小哥哥小姐姐們
    af078e110bf3閱讀 107評(píng)論 0 1