因為近期項目需要,要在項目中實現顧客微信掃碼登陸會員。所以要做出和一號店類似的掃碼登陸,或掃碼注冊。所以研究了一下微信開放平臺的掃碼登陸(真心不容易??.....)。
微信掃碼中先需要在網頁中顯示二維碼,而這個二維碼是有時限的,不斷變化。這樣才能保證安全性。并且,二維碼的掃描頁面是根據掃描或未掃描進行變化的,如果想把二維碼放在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。小弟拙作,如有錯誤請??指出。小弟在此拜謝。