10分钟上手!WeDemo微信登录集成实战指南:从0到1搭建安全授权系统
为什么选择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工程设置
修改应用信息
-
打开iOS工程:
open WeDemo.xcworkspace -
修改
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>
- 修改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双层加密确保通信安全
- 提供完善的调试工具和错误处理机制
后续学习建议:
- 深入研究微信支付功能的集成
- 探索消息推送功能的实现
- 学习用户行为分析和数据统计
WeDemo项目持续更新,建议定期同步官方仓库获取最新功能和安全更新:
git pull origin master
GLM-5智谱 AI 正式发布 GLM-5,旨在应对复杂系统工程和长时域智能体任务。Jinja00
LongCat-AudioDiT-1BLongCat-AudioDiT 是一款基于扩散模型的文本转语音(TTS)模型,代表了当前该领域的最高水平(SOTA),它直接在波形潜空间中进行操作。00
jiuwenclawJiuwenClaw 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。Python0248- QQwen3.5-397B-A17BQwen3.5 实现了重大飞跃,整合了多模态学习、架构效率、强化学习规模以及全球可访问性等方面的突破性进展,旨在为开发者和企业赋予前所未有的能力与效率。Jinja00
AtomGit城市坐标计划AtomGit 城市坐标计划开启!让开源有坐标,让城市有星火。致力于与城市合伙人共同构建并长期运营一个健康、活跃的本地开发者生态。01
HivisionIDPhotos⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。Python05