iOS开发:集成微信支付和微信授权登陆

来源:互联网 发布:数据挖掘 知乎 编辑:程序博客网 时间:2024/04/29 22:48

    微信无孔不入的插入到我们生活中,简直是烦得受不了;嘻嘻,同样是不是也方便的杠杠的,省去了我们好多繁琐的手机验证注册的事情。

因此, 在你的微信中接入微信授权登陆和微信支付,是一件让各位同学爽爽的事情;

     首先,我们谈谈微信授权登陆:

1. 到微信开发平台注册相关APP(地址:https://open.weixin.qq.com),现在是等待审核成功后才能获取到对应的key和secret;获取成功后需要单独申请开通登录和支付接口,如图

1411370441623372.png

2.下载SDK,导入工程中,如果出现以下错误,只需要用切换到Demo中的SDK即可

3.配置项目文件 (详见:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=1417694084&token=&lang=zh_CN)

4. 接下来,就是填写我们最擅长的代码了:

4.1:向微信注册:在AppDelegate.m 中引入#import "WXApi.h",并接受WXApiDelegate代理,

            然后注册:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [WXApi registerApp:@"wx9f6ca5429bd6c702" withDescription:@"Test"];
    return YES;
}

4.2:实现代理和回调语句

//第三方程序,向微信发送请求,sendReq请求调用后,会切到微信终端程序界面
- (void)onResp:(BaseResp *)resp

{

/*

    ErrCode ERR_OK = 0(用户同意)  
    ERR_AUTH_DENIED = -4(用户拒绝授权)  
    ERR_USER_CANCEL = -2(用户取消)  
    code    用户换取access_token的code,仅在ErrCode为0时有效  
    state   第三方程序发送时用来标识其请求的唯一性的标志,由第三方程序调用sendReq时传入,由微信终端回传,state字符串长度不能超过1K  
    lang    微信客户端当前语言  
    country 微信用户当前国家信息  
    */        
    SendAuthResp *aresp = (SendAuthResp *)resp;

}

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
    return [WXApi handleOpenURL:url delegate:self];
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    return [WXApi handleOpenURL:url delegate:self];
}

5.完成准备工作,我们开始 实现授权登录功能

 5.1 发送登录信息

- (IBAction)pushMessage:(id)sender {
//    对于iOS应用,考虑到iOS应用商店审核指南中的相关规定,建议开发者接入微信登录时,先检测用户手机是否已安装微信客户端(使用sdk中isWXAppInstalled函数 ),对未安装的用户隐藏微信登录按钮,只提供其他登录方式(比如手机号注册登录、游客登录等)。
    //判断是否安装微信
    [WXApi isWXAppInstalled];
    
    //第一步,请求Code; 第二步,根据Code获取token;第三步,根据token和API获取用户相关数据
    //获取token
    SendAuthReq *req = [[SendAuthReq alloc] init];
//    应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)
    //微信如何识别发起请求者,通过注册获得到得Key
    req.scope = @"snsapi_userinfo";
    req.state = @"345678";
    [WXApi sendReq:req];
}

5.2 当在微信界面点击取消或授权以后,会调用AppDelegate.m中的- (void)onResp:(BaseResp *)resp方法

在resp中会带有code信息,SendAuthResp *aresp = (SendAuthResp *)resp;    

    if (aresp.errCode== 0) {    
        NSString *code = aresp.code;       
    }
5.3 通过Code获得token

-(void)getAccess_token:(NSString *)code
{
    
//    利用GCD来获取对应的token和openID.
    //https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
    NSString *appid = @"";  //注册应用时获得的key
    NSString *sercet = @"";//注册应用时获得的sercet
    
    NSString *url = [NSString stringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code", appid, sercet, code];
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSURL *zoneUrl = [NSURL URLWithString:url];
        NSString *zoneStr = [NSString stringWithContentsOfURL:zoneUrl encoding:NSUTF8StringEncoding error:nil];
        NSData *data = [zoneStr dataUsingEncoding:NSUTF8StringEncoding];
        dispatch_async(dispatch_get_main_queue(), ^{
            if (data) {
                NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
                /*
                 {
                 "access_token" = "OezXcEiiBSKSxW0eoylIeJDUKD6z6dmr42JANLPjNN7Kaf3e4GZ2OncrCfiKnGWiusJMZwzQU8kXcnT1hNs_ykAFDfDEuNp6waj-bDdepEzooL_k1vb7EQzhP8plTbD0AgR8zCRi1It3eNS7yRyd5A";
                 "expires_in" = 7200;
                 openid = oyAaTjsDx7pl4Q42O3sDzDtA7gZs;
                 "refresh_token" = "OezXcEiiBSKSxW0eoylIeJDUKD6z6dmr42JANLPjNN7Kaf3e4GZ2OncrCfiKnGWi2ZzH_XfVVxZbmha9oSFnKAhFsS0iyARkXCa7zPu4MqVRdwyb8J16V8cWw7oNIff0l-5F-4-GJwD8MopmjHXKiA";
                 scope = "snsapi_userinfo,snsapi_base";
                 }
                 */
               
                [self getUserInfo:[dic objectForKey:@"access_token"] openid:[dic objectForKey:@"openid"]];
                
            }
        });
    });
}

5.4 根据token 和openid 获得用户跟人信息

-(void)getUserInfo:(NSString *)token openid:(NSString *)openid
{
    NSString *url =[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/userinfo?access_token=%@&openid=%@",token,openid];
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSURL *zoneUrl = [NSURL URLWithString:url];
        NSString *zoneStr = [NSString stringWithContentsOfURL:zoneUrl encoding:NSUTF8StringEncoding error:nil];
        NSData *data = [zoneStr dataUsingEncoding:NSUTF8StringEncoding];
        dispatch_async(dispatch_get_main_queue(), ^{
            if (data) {
                NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
                NSLog(@"%@",dic);
                /*
                 {
                 city = Haidian;
                 country = CN;
                 headimgurl = "http://wx.qlogo.cn/mmopen/FrdAUicrPIibcpGzxuD0kjfnvc2klwzQ62a1brlWq1sjNfWREia6W8Cf8kNCbErowsSUcGSIltXTqrhQgPEibYakpl5EokGMibMPU/0";
                 language = "zh_CN";
                 nickname = "xxx";
                 openid = oyAaTjsDx7pl4xxxxxxx;
                 privilege =     (
                 );
                 province = Beijing;
                 sex = 1;
                 unionid = oyAaTjsxxxxxxQ42O3xxxxxxs;
                 }
                 */        
            }
        });
        
    });
}

6.到此,微信授权登录,然后获得个人相关信息,介绍完毕。


———********************************************************************************************————

下边开始介绍微信支付功能

微信支付的配置方法和微信授权登陆的配置方法一样。

微信支付分为三个阶段,1.通过统一下单API生成预付订单;2.通过预付订单获得到得数据发起微信支付请求;3.处理支付回调结果,判断是否支付成功;

1.通过统一下单API生成预付订单,

   在这时候分两种两种情况,一种是有后台生成,一种时候前端生成;

2。具体使用方法,详情可以在Demo中看到。









0 0
原创粉丝点击