首页
/ 10分钟上手!WeDemo微信登录集成实战指南:从0到1搭建安全授权系统

10分钟上手!WeDemo微信登录集成实战指南:从0到1搭建安全授权系统

2026-01-29 12:51:44作者:范靓好Udolf

为什么选择WeDemo?开发者的3大痛点解决方案

你是否还在为以下问题困扰?

  • 微信登录授权流程复杂,官方文档分散难懂
  • 前后端加密通信实现困难,安全风险高
  • 调试过程繁琐,错误难以定位

WeDemo作为微信团队官方开源的示例项目,提供了一套完整的微信登录、分享功能解决方案。本文将带你从环境搭建到功能实现,系统掌握微信开放平台接口集成的核心技术,10分钟内完成基础授权功能开发

读完本文你将获得:

  • 微信登录授权全流程的清晰理解
  • 前后端加密通信的实战代码
  • 完整的调试技巧和问题排查方案
  • 可直接复用的生产级代码框架

项目架构概览:安全通信的核心设计

WeDemo采用分层架构设计,实现了客户端与服务器的安全通信。核心架构如下:

classDiagram
    class 客户端 {
        +iOS应用
        +微信SDK集成
        +RSA加密模块
        +SSL证书验证
    }
    class 服务器 {
        +PHP后端
        +微信API封装
        +数据存储模块
        +RSA解密模块
    }
    class 微信开放平台 {
        +登录授权接口
        +用户信息接口
        +Access Token管理
    }
    
    客户端 --> 服务器 : 加密通信
    服务器 --> 微信开放平台 : API调用
    客户端 --> 微信开放平台 : 授权请求

项目目录结构清晰,主要包含以下部分:

WeDemo/
├── iOS/                # iOS客户端代码
│   └── WeDemo/         # 主应用目录
│       ├── Service/    # 网络服务模块
│       ├── View/       # 视图组件
│       └── ViewController/ # 视图控制器
├── php/                # PHP后端代码
│   ├── demo/           # 示例代码
│   └── sdk/            # SDK核心库
└── doc/                # 文档资料

环境搭建:3步完成开发准备

1. 获取源代码

# 克隆项目仓库
git clone https://gitcode.com/gh_mirrors/we/WeDemo.git
cd WeDemo

2. 开发环境要求

环境 版本要求 推荐配置
iOS开发 Xcode 10.0+ Xcode 13.0+
PHP环境 PHP 5.6+ PHP 7.3+
Web服务器 Nginx/Apache Nginx 1.18+
微信开发者账号 已认证 企业级账号

3. 项目初始化

# iOS项目准备
cd iOS/WeDemo
pod install  # 安装依赖库

# PHP服务器准备
cd ../../php/demo
mkdir _store  # 创建数据存储目录
chmod 744 _store  # 设置目录权限

客户端配置:5分钟完成iOS工程设置

修改应用信息

  1. 打开iOS工程:open WeDemo.xcworkspace

  2. 修改Info.plist文件,配置微信App信息:

<key>WXAppInfo</key>
<dict>
    <key>AppId</key>
    <string>wx1234567890abcdef</string>  <!-- 替换为你的AppId -->
    <key>AppDescription</key>
    <string>WeDemo示例应用</string>  <!-- 替换为你的应用描述 -->
</dict>
<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>CFBundleURLName</key>
        <string>com.yourcompany.wedemo</string>  <!-- 替换为你的URL Identifier -->
        <key>CFBundleURLSchemes</key>
        <array>
            <string>wx1234567890abcdef</string>  <!-- 替换为你的AppId -->
        </array>
    </dict>
</array>
  1. 修改Bundle Identifier:

在Xcode中,选择项目目标,修改Signing & Capabilities中的Bundle Identifier为你在微信开放平台注册的应用标识。

配置服务器信息

修改BaseNetworkEngine.m文件,设置服务器地址:

// Service/BaseNetworkEngine.m
- (NSString *)host {
    if (!_host) {
        // 替换为你的服务器地址
        _host = @"https://api.yourdomain.com";
    }
    return _host;
}

服务器配置:PHP后端快速部署

修改配置文件

编辑php/demo/config.php文件,设置关键参数:

// 应用信息配置
define('WE_DEMO_APP_ID', 'wx1234567890abcdef');      // 替换为你的AppId
define('WE_DEMO_APP_SECRET', 'a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6');  // 替换为你的AppSecret

// 路径配置
define('WX_SDK_PATH', __DIR__ . '/../sdk/');  // SDK路径
define('WE_DEMO_STORE_PATH', __DIR__ . '/_store/');  // 数据存储路径

// 安全配置
define('WE_DEMO_RSA_PRIVATE_KEY', __DIR__ . '/_key/rsa_private.key');  // RSA私钥路径
define('WE_DEMO_SALT', 'your_secure_salt_here');  // 替换为随机字符串

生成RSA密钥对

# 创建密钥目录
mkdir php/demo/_key
cd php/demo/_key

# 生成RSA密钥对
openssl genrsa -out rsa_private.key 2048
openssl rsa -in rsa_private.key -out rsa_public.key -pubout

Nginx服务器配置

server {
    listen 443 ssl;
    server_name api.yourdomain.com;  # 替换为你的域名

    ssl_certificate /path/to/your/cert.crt;  # SSL证书路径
    ssl_certificate_key /path/to/your/private.key;  # SSL私钥路径
    
    # SSL配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384;
    
    location / {
        root /path/to/WeDemo/php/demo;
        index index.php;
        
        # PHP配置
        location ~ \.php$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    }
}

核心功能实现:微信登录授权全流程

1. 授权流程详解

微信登录授权流程如下:

sequenceDiagram
    participant 客户端
    participant 微信APP
    participant 服务器
    participant 微信开放平台
    
    客户端->>微信APP: 请求授权
    微信APP->>客户端: 返回code
    客户端->>服务器: 发送code及设备信息
    服务器->>微信开放平台: 使用code获取access_token
    微信开放平台->>服务器: 返回access_token和用户信息
    服务器->>服务器: 存储用户信息
    服务器->>客户端: 返回加密用户信息
    客户端->>客户端: 解密并显示用户信息

2. 客户端代码实现

WXLoginViewController.m中实现登录功能:

- (IBAction)wxLoginButtonClicked:(id)sender {
    // 微信登录请求
    SendAuthReq* req = [[SendAuthReq alloc] init];
    req.scope = @"snsapi_userinfo";  // 请求用户信息授权
    req.state = [NSString stringWithFormat:@"%ld", (long)[[NSDate date] timeIntervalSince1970]];  // 随机状态码
    
    // 发送授权请求
    [WXApi sendReq:req completion:^(BOOL success) {
        if (success) {
            NSLog(@"授权请求已发送");
        } else {
            NSLog(@"授权请求发送失败");
            [self showAlertWithTitle:@"错误" message:@"请检查微信是否安装"];
        }
    }];
}

处理授权回调(WXApiManager.m):

- (void)onResp:(BaseResp *)resp {
    if ([resp isKindOfClass:[SendAuthResp class]]) {
        SendAuthResp *authResp = (SendAuthResp *)resp;
        
        if (authResp.errCode == WXSuccess) {
            // 授权成功,获取code
            NSString *code = authResp.code;
            
            // 调用服务器接口获取用户信息
            [self fetchUserInfoWithCode:code];
        } else {
            // 授权失败
            NSString *errorMsg = [NSString stringWithFormat:@"授权失败: %d", authResp.errCode];
            [[NSNotificationCenter defaultCenter] postNotificationName:@"WXAuthFailed" object:errorMsg];
        }
    }
}

3. 服务器端代码实现

在PHP中处理授权请求(class.we_demo_controller_demo.php):

public function action_wxlogin() {
    $code = $_REQUEST['code'];
    if (empty($code)) {
        $this->show_error(1001, '缺少code参数');
    }
    
    // 使用code获取access_token
    $result = $this->sdk->get_access_token_by_code($code);
    
    if (is_array($result) && isset($result['access_token'])) {
        // 获取用户信息
        $user_info = $this->sdk->get_user_info($result['access_token'], $result['openid']);
        
        // 存储用户信息
        $this->db->set_item('user', $result['openid'], $user_info);
        
        // 返回结果
        $this->show_result($user_info);
    } else {
        $this->show_error(1002, '获取access_token失败');
    }
}

安全通信:RSA+AES加密实现

WeDemo采用双层加密机制确保通信安全:

flowchart TD
    A[客户端] -->|1. 生成随机AES密钥| B(加密数据)
    B -->|2. RSA加密AES密钥| C{服务器}
    C -->|3. RSA解密AES密钥| D(解密数据)
    D -->|4. 处理请求| E[返回结果]
    E -->|5. AES加密响应| A

客户端加密实现(ADNetworkEngine.m

- (NSDictionary *)encryptRequestData:(NSDictionary *)data {
    // 生成随机AES密钥
    NSString *aesKey = [self generateRandomAESKey];
    
    // AES加密请求数据
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:data options:0 error:nil];
    NSData *encryptedData = [AES encryptData:jsonData key:aesKey];
    NSString *encryptedBase64 = [encryptedData base64EncodedStringWithOptions:0];
    
    // RSA加密AES密钥
    NSString *publicKey = [self loadRSAPublicKey];
    NSData *encryptedAESKeyData = [RSA encryptString:aesKey publicKey:publicKey];
    NSString *encryptedAESKey = [encryptedAESKeyData base64EncodedStringWithOptions:0];
    
    // 返回加密后的数据
    return @{
        @"encrypted_data": encryptedBase64,
        @"encrypted_key": encryptedAESKey
    };
}

服务器端解密实现(class.wx_sdk_handler.php

public function decrypt_request($encrypted_data, $encrypted_key) {
    // RSA解密AES密钥
    $private_key = file_get_contents(WE_DEMO_RSA_PRIVATE_KEY);
    openssl_private_decrypt(base64_decode($encrypted_key), $aes_key, $private_key);
    
    // AES解密数据
    $decrypted = $this->aes_decrypt(base64_decode($encrypted_data), $aes_key);
    
    return json_decode($decrypted, true);
}

private function aes_decrypt($data, $key) {
    $iv = substr($key, 0, 16); // 使用AES密钥前16位作为IV
    return openssl_decrypt($data, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
}

调试技巧:高效定位问题

WeDemo提供了强大的调试功能,帮助开发者快速定位问题:

1. 日志查看

通过摇一摇手势呼出日志窗口,或在调试页面查看详细日志:

// ShakeDebug.m
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
    if (motion == UIEventSubtypeMotionShake) {
        // 摇一摇触发日志页面
        LogTextViewController *logVC = [[LogTextViewController alloc] init];
        logVC.logText = [ADAccessLog sharedInstance].logString;
        UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:logVC];
        [self presentViewController:nav animated:YES completion:nil];
    }
}

2. 常见问题排查

错误 可能原因 解决方案
授权失败 -4 应用未注册 检查Info.plist中的AppId配置
无法回调 URL Scheme错误 确保URL Scheme与AppId一致
加密失败 RSA密钥不匹配 检查公钥私钥是否配对
access_token无效 权限不足 检查应用授权作用域

3. 调试配置页面

WeDemo提供了调试配置页面,可以动态修改服务器地址和其他参数,无需重新编译:

pie
    title 调试功能使用频率
    "服务器地址修改" : 45
    "日志查看" : 30
    "参数配置" : 15
    "其他功能" : 10

功能扩展:自定义开发指南

WeDemo设计灵活,便于功能扩展。以下是添加新功能的步骤:

1. 增加CGI配置(ConfigItemsMaker.h

+ (NSArray *)configItems {
    return @[
        // 现有配置...
        @{
            @"cgi_name": @"appcgi_newfeature", // 配置ID
            @"request_path": @"/wxoauth/demo/index.php?action=newfeature", // 请求路径
            @"http_method": @"POST", // HTTP方法
            @"encrypt_algorithm": @"6", // 加密算法
            @"decrypt_algorithm": @"6", // 解密算法
            @"encrypt_key_path": @"req_buffer", // 加密数据路径
            @"decrypt_key_path": @"resp_buffer", // 解密数据路径
            @"sys_err_key_path": @"errcode" // 错误码路径
        }
    ];
}

2. 实现新功能的Engine(ADNetworkEngine.m

- (void)doNewFeatureWithParam:(NSString *)param completion:(NewFeatureCallBack)completion {
    [[self.manager JSONTaskForHost:self.host
                              Para:@{
                                  @"uin": @(self.currentUin),
                                  @"req_buffer": @{
                                      @"param": param,
                                      @"timestamp": @([[NSDate date] timeIntervalSince1970])
                                  }
                              }
                     ConfigKeyPath:@"appcgi_newfeature"
                    WithCompletion:^(NSDictionary *dict, NSError *error) {
                        if (error) {
                            completion(nil, error);
                            return;
                        }
                        
                        // 处理响应数据
                        NewFeatureResult *result = [[NewFeatureResult alloc] initWithDict:dict];
                        completion(result, nil);
                    }] resume];
}

3. 服务器端实现(class.we_demo_controller_demo.php

public function action_newfeature() {
    // 获取请求参数
    $param = $this->request['param'];
    $timestamp = $this->request['timestamp'];
    
    // 业务逻辑处理
    $result = $this->business_logic->processNewFeature($param);
    
    // 返回结果
    $this->show_result($result);
}

部署上线:从开发到生产的注意事项

1. 环境切换

ADNetworkEngine.m中实现环境切换逻辑:

- (NSString *)host {
    #ifdef DEBUG
        // 开发环境
        return @"https://dev.api.yourdomain.com";
    #else
        // 生产环境
        return @"https://api.yourdomain.com";
    #endif
}

2. 安全加固

  • 证书固定(Certificate Pinning)
- (AFSecurityPolicy *)securityPolicy {
    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
    
    // 添加证书
    NSString *certPath = [[NSBundle mainBundle] pathForResource:@"server_cert" ofType:@"cer"];
    NSData *certData = [NSData dataWithContentsOfFile:certPath];
    securityPolicy.pinnedCertificates = @[certData];
    
    // 只信任证书中的主机
    securityPolicy.validatesDomainName = YES;
    
    return securityPolicy;
}
  • 敏感数据保护
// 存储敏感数据到Keychain
[ADKeyChainWrap setValue:accessToken forKey:@"access_token" service:@"com.yourcompany.wedemo"];

// 从Keychain获取敏感数据
NSString *accessToken = [ADKeyChainWrap getValueForKey:@"access_token" service:@"com.yourcompany.wedemo"];

3. 性能优化

  • 图片缓存
// 使用WeDemo内置的图片缓存
[[ImageCache sharedInstance] loadImageWithURL:imageURL completion:^(UIImage *image, NSError *error) {
    if (image) {
        self.avatarImageView.image = image;
    } else {
        self.avatarImageView.image = [UIImage imageNamed:@"default_avatar"];
    }
}];
  • 网络请求优化
// 设置请求超时时间
[self.manager.requestSerializer setTimeoutInterval:15];

// 设置请求头
[self.manager.requestSerializer setValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"];

总结与展望

通过本文的学习,你已经掌握了WeDemo的核心功能和使用方法,能够快速实现微信登录授权功能。WeDemo作为微信开放平台的官方示例,不仅提供了完整的代码实现,更展示了安全通信的最佳实践。

关键要点回顾:

  • WeDemo架构设计清晰,便于理解和扩展
  • 微信登录授权流程分为请求授权、获取code、获取access_token和获取用户信息四个步骤
  • 采用RSA+AES双层加密确保通信安全
  • 提供完善的调试工具和错误处理机制

后续学习建议:

  1. 深入研究微信支付功能的集成
  2. 探索消息推送功能的实现
  3. 学习用户行为分析和数据统计

WeDemo项目持续更新,建议定期同步官方仓库获取最新功能和安全更新:

git pull origin master
登录后查看全文
热门项目推荐
相关项目推荐