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