美文网首页自鉴iOS即时通讯首页投稿(暂停使用,暂停投稿)
iOS版实现微信扫码登陆(适用于店铺收银端类型App)

iOS版实现微信扫码登陆(适用于店铺收银端类型App)

作者: Billy_W | 来源:发表于2016-12-03 16:56 被阅读372次

    因为近期项目需要,要在项目中实现顾客微信扫码登陆会员。所以要做出和一号店类似的扫码登陆,或扫码注册。所以研究了一下微信开放平台的扫码登陆(真心不容易😄.....)。
    微信扫码中先需要在网页中显示二维码,而这个二维码是有时限的,不断变化。这样才能保证安全性。并且,二维码的扫描页面是根据扫描或未扫描进行变化的,如果想把二维码放在iOS项目中,就要将扫码页面做成网页。也许有更好的办法,但是项目太紧,所以我就只找到这一个办法,如果有什么错误请指出,谢谢。
    下面就说说我实现的步骤。
    1.做扫码页面需要微信平台的各种权限。所以喽,自己先申请到微信平台申请一下吧。
    微信开放平台
    Ps:因为实现的是微信网页登陆所以利用微信网站应用

    微信开放平台.png

    2.以上申请完层以后进入正题。先根据自己需求创建一个UIViewController,或者一个View。接着定义WebView

    @interface WeChatLoginViewController ()<UIWebViewDelegate>
    @property (weak, nonatomic) IBOutlet UIWebView *loginWebView;
    @property (nonatomic, strong) NSString * Url;
    @property (nonatomic, strong) AFHTTPSessionManager *mgr;
    @property (nonatomic, strong) AFHTTPSessionManager *manager;
    @end
    

    3.在页面中加载二维码网址我将WebView设置在viewDidLoad中

    - (void)viewDidLoad {
        [super viewDidLoad];
        self.loginWebView.delegate = self;
        self.Url = @"https://open.weixin.qq.com/connect/qrconnect?appid=(申请得到)&redirect_uri=(申请得到)&response_type=code&scope=snsapi_login&state=.....(具体微信API中有介绍)";
        NSURLRequest *request =[NSURLRequest requestWithURL:[NSURL URLWithString:_Url]];
        [self.loginWebView loadRequest:request];
        // Do any additional setup after loading the view from its nib.
    }
    

    4.实现WebView的delegate,可以在delegate中具体实现自己的其它需求

    #pragma mark - Delegate
    //开始加载
    - (void)webViewDidStartLoad:(UIWebView *)webView{
        NSLog(@"开始");
    }
    //加载出错
    - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{
        NSLog(@"错误");
    }
    //加载完成
    - (void)webViewDidFinishLoad:(UIWebView *)webView
    {
        NSLog(@"完成");
    }
    

    5.获取网络请求的delegate(这个步骤以后才是主要),根据获取的url进行判断,截取需要的code,进行请求access_token

    //获取url
    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
        NSString * urlString = [[request URL]absoluteString];
        NSLog(@"urlString:%@",urlString);
        if ([urlString isEqualToString:self.Url]) {
            return YES;
        }else{
            NSRange range = [urlString rangeOfString:@"&"];//匹配得到的下标
            NSString * string = nil;
            NSLog(@"rang:%@",NSStringFromRange(range));
            
            string = [urlString substringToIndex:range.location];//截取掉下标index之后的字符串
            NSLog(@"string:%@",string);
            
            NSRange range1 = [urlString rangeOfString:@"="];//匹配得到的下标
            string = [string substringFromIndex:range1.location];//截取掉下标2之前的字符串
            NSLog(@"string:%@",string);
            string = [string stringByReplacingOccurrencesOfString:@"=" withString:@""];
            NSLog(@"string:%@",string);
            [self requestWeChat:string];
            return NO;
        }
        
    }
    

    6.开始获取微信平台数据

    - (void)requestWeChat:(NSString *)code{
    
        NSString * strUrl = @"https://api.weixin.qq.com/sns/oauth2/access_token";
        NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
        parameters[@"appid"] = (自己的APPID);
        parameters[@"secret"] = (secret);
        parameters[@"code"] = code;
        parameters[@"grant_type"] = @"authorization_code";
    
        
        [self.mgr POST:strUrl parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            
            NSLog(@"%@",responseObject);
            if (responseObject[@"access_token"] != nil) {
                
                NSString * strUrl1 = @"https://api.weixin.qq.com/sns/userinfo";
                NSMutableDictionary *parameters1 = [NSMutableDictionary dictionary];
                parameters1[@"access_token"] = responseObject[@"access_token"];
                parameters1[@"openid"] = responseObject[@"openid"];
                [self.mgr POST:strUrl1 parameters:parameters1 progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
                    
                    NSLog(@"%@",responseObject);
                  //此处请求到的  responseObject就是可以拿到的客户微信开放信息,包括微信名,性别等。。。。。
                  //拿到数据以后可以按照自己项目的需求进行下一步功能。
                } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                    NSLog(@"error:%@",error);
                }];
    
            }
            
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSLog(@"error:%@",error);
        }];
    }
    

    ps:后续会上传效果gif。小弟拙作,如有错误请🙏指出。小弟在此拜谢。

    相关文章

      网友评论

      • R_yan:小弟写的不错,加油 :+1:

      本文标题:iOS版实现微信扫码登陆(适用于店铺收银端类型App)

      本文链接:https://www.haomeiwen.com/subject/gytfmttx.html