微信登录与分享
微信开发平台-移动应用微信登录开发指南
1、首先导入微信的SDK
2、导入需要的framework
3、添加URL Type
4、在plist文件里添加iOS9 URL Schemes 白名单
LSApplicationQueriesSchemes
wechat
weixin
sinaweibohd
sinaweibo
sinaweibosso
weibosdk
weibosdk2.5
mqqapi
mqq
mqqOpensdkSSoLogin
mqqconnect
mqqopensdkdataline
mqqopensdkgrouptribeshare
mqqopensdkfriend
mqqopensdkapi
mqqopensdkapiV2
mqqopensdkapiV3
mqzoneopensdk
wtloginmqq
wtloginmqq2
mqqwpa
mqzone
mqzonev2
mqzoneshare
wtloginqzone
mqzonewx
mqzoneopensdkapiV2
mqzoneopensdkapi19
mqzoneopensdkapi
mqzoneopensdk
alipay
alipayshare
5、向微信终端程序注册第三方应用,并在第三方应用实现从微信返回
在AppDelegate.m中引入”WXApi.h"头文件,然后写入如下:
#import "WXApi.h"
#import "WXApiObject.h"
@interface AppDelegate () //添加代理
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[WXApi registerApp:@"WX_AppID" withDescription:@"weixin"];
return YES;
}
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options
{
[WXApi handleOpenURL:url delegate:self];
return YES;
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
[WXApi handleOpenURL:url delegate:self];
return YES;
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
[WXApi handleOpenURL:url delegate:self];
return YES;
}
6、微信分享—>在控制器里面添加分享代码
#import "WXApiObject.h"
#import “WXApi.h"
//分享文字给好友
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.text = @"测试把信息分享到微信好友";
req.bText = YES;
req.scene = WXSceneSession;//会话(WXSceneSession)或者朋友圈(WXSceneTimeline)
[WXApi sendReq:req];
//分享图片给好友
WXMediaMessage *message = [WXMediaMessage message];
message.title = @"测试把图片分享到微信好友";
[message setThumbImage:[UIImage imageNamed:@"IconWX.png"]];
WXImageObject *imageObject = [[WXImageObject alloc] init];
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"IconWX" ofType:@"png"];
imageObject.imageData = [NSData dataWithContentsOfFile:filePath];
message.mediaObject = imageObject;
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText = NO;
req.message = message;
req.scene = WXSceneSession;
[WXApi sendReq:req];
//分享网页给好友
WXMediaMessage *message = [WXMediaMessage message];
message.title = @"测试把web分享到微信好友";
[message setThumbImage:[UIImage imageNamed:@"IconWX.png"]];
WXWebpageObject *webObject = [WXWebpageObject object];
webObject.webpageUrl = @"http://www.baidu.com";
message.mediaObject = webObject;
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText = NO;
req.message = message;
req.scene = WXSceneSession;
[WXApi sendReq:req];
//分享文字到朋友圈
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.text = @"测试把信息分享到微信朋友圈";
req.bText = YES;
req.scene = WXSceneTimeline;//会话(WXSceneSession)或者朋友圈(WXSceneTimeline)
[WXApi sendReq:req];
//分享图片到朋友圈
WXMediaMessage *message = [WXMediaMessage message];
message.title = @"测试把图片分享到微信朋友圈";
[message setThumbImage:[UIImage imageNamed:@"IconWX.png"]];
WXImageObject *imageObject = [[WXImageObject alloc] init];
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"IconWX" ofType:@"png"];
imageObject.imageData = [NSData dataWithContentsOfFile:filePath];
message.mediaObject = imageObject;
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText = NO;
req.message = message;
req.scene = WXSceneTimeline;
[WXApi sendReq:req];
//分享网页到朋友圈
WXMediaMessage *message = [WXMediaMessage message];
message.title = @"测试把web分享到微信朋友圈";
message.description = @"";
[message setThumbImage:[UIImage imageNamed:@"IconWX.png"]];
WXWebpageObject *webObject = [WXWebpageObject object];
webObject.webpageUrl = @"http://www.baidu.com";
message.mediaObject = webObject;
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText = NO;
req.message = message;
req.scene = WXSceneTimeline;
[WXApi sendReq:req];
6.1、分享App消息到微信,微信点击之后能够跳转到App
static NSString *kAPPContentTitle = @"App消息";
static NSString *kAPPContentDescription = @"这种消息只有App自己才能理解,由App指定打开方式";
static NSString *kAppContentExInfo = @"extend info ";
static NSString *kAppContnetExURL = @"http://weixin.qq.com";
static NSString *kAppMessageExt = @"这是第三方带的测试字段";
static NSString *kAppMessageAction = @"dotaliTest ";
//分享本App识别的信息(会从微信调整到本App)
Byte* pBuffer = (Byte *)malloc(1024*100);
memset(pBuffer, 0, 1024*100);
NSData* data = [NSData dataWithBytes:pBuffer length:1024*100];
free(pBuffer);
UIImage *thumbImage = [UIImage imageNamed:@"res2.jpg"];
WXAppExtendObject *ext = [WXAppExtendObject object];
ext.extInfo = kAppContentExInfo;
ext.url = kAppContnetExURL;
ext.fileData = data;
WXMediaMessage *message = [WXMediaMessage message];
message.title = kAPPContentTitle;
message.description = kAPPContentDescription;
message.mediaObject = ext;
message.messageExt = kAppMessageExt;
message.messageAction = kAppMessageAction;
message.mediaTagName = nil;
[message setThumbImage:thumbImage];
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText = NO;
req.scene = WXSceneSession;
req.message = message;
[WXApi sendReq:req];
7、微信登陆 —>在AppDelegate里面添加登陆成功的通知
#pragma mark - WXApiDelegate
- (void)onResp:(BaseResp *)resp {
if ([resp isKindOfClass:[SendAuthResp class]])
{
SendAuthResp *rep = (SendAuthResp *)resp;
if (rep.errCode == 0) {
[[NSNotificationCenter defaultCenter] postNotificationName:WXLoginSuccess object:@{@"code":rep.code}];
}
}
8、微信登陆 —>在控制器里面添加登陆代码
static NSString *kAuthScope = @"snsapi_userinfo";
static NSString *kAuthOpenID = @"这个我现在没使用";
static NSString *kAuthState = @"123";
//微信登陆
- (void)onClickBtn
{
SendAuthReq *req = [[SendAuthReq alloc] init];
req.scope = kAuthScope;
req.state = kAuthState;
req.openID = kAuthOpenID;
[WXApi sendReq:req];
}
9、微信登陆—>在控制器里面实现登陆成功之后的回调
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(WXLogin:) name:WXLoginSuccess object:nil];
//登陆成功之后获取token
- (void)WXLogin:(NSNotification *)notifi
{
AFHTTPRequestOperationManager *manage = [AFHTTPRequestOperationManager manager];
manage.responseSerializer = [AFHTTPResponseSerializer serializer];
[manage GET:@"https://api.weixin.qq.com/sns/oauth2/access_token" parameters:@{@"appid":WX_AppID, @"secret":WX_AppSecret, @"code":notifi.object[@"code"], @"grant_type":@"authorization_code"} success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
/*"access_token" = "OezXcEiiBSKSxW0eoylIeBPKSgTfwua1QABCnleka9CqGYr9J4wP2NHLDEFTP0vqsiS4DFDyXNQmYSaM6dW1s8MrQi6NSC9dV6ZqqjazKWQv3kfeozrm-fbZTXU80vLaWYflw07nkDhmX3KJHsEVxQ";
"expires_in" = 7200;
openid = xxxxxxxxxxxxxxxxxxxxxxxxxx;
"refresh_token" = "OezXcEiiBSKSxW0eoylIeBPKSgTfwua1QABCnleka9CqGYr9J4wP2NHLDEFTP0vq6O1ZVOcyb8uL5dLrcuRaydRmY9BcYgJeOLqRjlLyp5HpBlYc2Ikja-RFm6ghGQ32r_iZfQfAQhtEqwk9ibf8vA";
scope = "snsapi_userinfo";
unionid = o4bo2vzI0vCvGTa11GBMkx0SbcwQ;*/
[[NSUserDefaults standardUserDefaults] setObject:dict forKey:WXSaveToken];
[self saveTokenAndRequireWXInfo];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"access_token error-->%@", error.localizedDescription);
}];
}
10、微信登陆—>在控制器里面通过token请求得到微信部分个人信息
- (void)saveTokenAndRequireWXInfo
{
NSDictionary *dict = [[NSUserDefaults standardUserDefaults] objectForKey:WXSaveToken];
AFHTTPRequestOperationManager *manage = [AFHTTPRequestOperationManager manager];
manage.responseSerializer = [AFHTTPResponseSerializer serializer];
[manage GET:@"https://api.weixin.qq.com/sns/userinfo" parameters:@{@"openid":dict[@"openid"], @"access_token":dict[@"access_token"]} success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
// NSLog(@"%@",dict);
// {
// city = "xxx";
// country = xxx;
// headimgurl = “http://wx.qlogo.cn/mmopen/xxxxxxx/0”;
// language = "zh_CN";
// nickname = xxx;
// openid = xxxxxxxxxxxxxxxxxxx; //授权用户唯一标识
// privilege = (
// );
// province = "xxx";
// sex = 0;
// unionid = xxxxxxxxxxxxxxxxxx;
// }
[[NSUserDefaults standardUserDefaults] setObject:dict forKey:WXResponse_UserInfo];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"userinfo error-->%@", error.localizedDescription);
}]; }