下面详细梳理Unity引擎中微信鉴权的完整流程,包括客户端与服务端的交互、关键技术点、常见问题和安全建议。
Unity引擎中微信鉴权流程
一、整体流程图
- 用户点击微信登录按钮
- Unity客户端调用微信SDK(原生桥接)
- 微信SDK调起微信App,用户授权
- 微信SDK回调Unity,返回
code
- Unity客户端将
code
发送到你自己的游戏服务器 - 游戏服务器用
code
向微信服务器换取access_token
和openid
- 游戏服务器校验并生成自有登录态(如JWT token),返回给客户端
- 客户端用自有token与游戏服务器通信
二、详细步骤与代码示例
1. Unity客户端调用微信SDK
1.1 C#调用原生(以Android为例)
public void WXLogin()
{
using (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
AndroidJavaObject activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaClass wxBridge = new AndroidJavaClass("com.yourcompany.wxbridge.WXBridge");
wxBridge.CallStatic("login", activity);
}
}
1.2 原生SDK调起微信授权
- 用户同意后,微信SDK会回调你的原生代码,返回
code
。
1.3 原生回调Unity
// Java
UnityPlayer.UnitySendMessage("WXLoginManager", "OnWXLoginCode", code);
// C#
public void OnWXLoginCode(string code)
{
Debug.Log("WeChat code: " + code);
StartCoroutine(PostCodeToServer(code));
}
2. 客户端将code
发送到游戏服务器
IEnumerator PostCodeToServer(string code)
{
WWWForm form = new WWWForm();
form.AddField("code", code);
using (UnityWebRequest www = UnityWebRequest.Post("https://yourserver.com/api/wxlogin", form))
{
yield return www.SendWebRequest();
if (www.result == UnityWebRequest.Result.Success)
{
Debug.Log("Server login success: " + www.downloadHandler.text);
// 解析自有token,进入游戏
}
else
{
Debug.LogError("Server login failed: " + www.error);
}
}
}
3. 服务端用code
换取access_token
和openid
3.1 请求微信服务器
# Python伪代码
import requests
def wx_login(code):
appid = "你的AppID"
secret = "你的AppSecret"
url = f"https://api.weixin.qq.com/sns/oauth2/access_token?appid={appid}&secret={secret}&code={code}&grant_type=authorization_code"
resp = requests.get(url).json()
# resp包含access_token, openid, unionid等
if "openid" in resp:
# 校验、注册/登录用户,生成自有token
return {"code": 0, "token": "your_game_token", "userInfo": resp}
else:
return {"code": 1, "msg": "微信鉴权失败"}
3.2 返回自有token给客户端
- 客户端收到后保存token,后续用作登录态。
三、常见问题与安全建议
- 不要在客户端用code换access_token,必须服务端操作,防止泄露AppSecret。
- code只能用一次,重复使用会失败。
- access_token有时效性,如需获取用户信息,需及时操作。
- 服务端要校验openid唯一性,防止账号混乱。
- 所有敏感信息(AppSecret、token生成逻辑)都必须在服务端实现。
四、流程总结
- Unity客户端只负责调起微信SDK、获取code、上传到服务端。
- 服务端负责用code换access_token/openid、生成自有token、管理用户数据。
- 客户端后续只用自有token与服务端通信。
五、参考文档
下面继续详细补充Unity引擎中微信鉴权流程的原生桥接实现、服务端完整代码示例、以及常见问题排查和优化建议,让你可以从头到尾顺利完成微信登录集成。
一、Unity与原生微信SDK的桥接实现
1. Android端
1.1 集成微信SDK
- 下载微信开放平台Android SDK。
- 在
build.gradle
中添加依赖,拷贝libammsdk.jar
到libs
目录。
1.2 实现原生桥接类
WXBridge.java(放在com.yourcompany.wxbridge
包下):
package com.yourcompany.wxbridge;
import android.app.Activity;
import com.tencent.mm.opensdk.modelmsg.SendAuth;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
import com.unity3d.player.UnityPlayer;
public class WXBridge {
private static IWXAPI wxApi;
private static final String APP_ID = "你的微信AppID";
public static void login(Activity activity) {
if (wxApi == null) {
wxApi = WXAPIFactory.createWXAPI(activity, APP_ID, true);
wxApi.registerApp(APP_ID);
}
final SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "wechat_sdk_demo";
wxApi.sendReq(req);
}
}
1.3 回调Unity
- 在
WXEntryActivity
的onResp
方法中:
@Override
public void onResp(BaseResp resp) {
if (resp instanceof SendAuth.Resp) {
String code = ((SendAuth.Resp) resp).code;
UnityPlayer.UnitySendMessage("WXLoginManager", "OnWXLoginCode", code);
}
finish();
}
2. iOS端
2.1 集成微信SDK
- 下载微信开放平台iOS SDK。
- 按文档配置
Info.plist
和URL Scheme。
2.2 Objective-C桥接
WXBridge.mm:
#import "WXApi.h"
#import <UIKit/UIKit.h>
extern "C" {
void WXLoginNative() {
SendAuthReq* req = [[SendAuthReq alloc] init];
req.scope = @"snsapi_userinfo";
req.state = @"wechat_sdk_demo";
[WXApi sendReq:req completion:nil];
}
}
// 在AppDelegate的回调中
- (void)onResp:(BaseResp *)resp {
if ([resp isKindOfClass:[SendAuthResp class]]) {
SendAuthResp *authResp = (SendAuthResp *)resp;
NSString *code = authResp.code;
UnitySendMessage("WXLoginManager", "OnWXLoginCode", [code UTF8String]);
}
}
二、服务端完整鉴权代码示例(Python Flask)
from flask import Flask, request, jsonify
import requests
app = Flask(__name__)
APPID = "你的AppID"
APPSECRET = "你的AppSecret"
@app.route('/api/wxlogin', methods=['POST'])
def wxlogin():
code = request.form.get('code')
if not code:
return jsonify({'code': 1, 'msg': '缺少code'})
# 用code换access_token和openid
url = f"https://api.weixin.qq.com/sns/oauth2/access_token?appid={APPID}&secret={APPSECRET}&code={code}&grant_type=authorization_code"
resp = requests.get(url).json()
if 'openid' not in resp:
return jsonify({'code': 2, 'msg': '微信鉴权失败', 'detail': resp})
openid = resp['openid']
access_token = resp['access_token']
# 可选:获取用户信息
userinfo_url = f"https://api.weixin.qq.com/sns/userinfo?access_token={access_token}&openid={openid}"
userinfo = requests.get(userinfo_url).json()
# 生成自有token(如JWT),并保存/更新用户信息
your_token = generate_token(openid) # 你自己的实现
return jsonify({'code': 0, 'token': your_token, 'userinfo': userinfo})
def generate_token(openid):
# 这里用openid生成你自己的登录态token
return openid + "_token" # 实际项目请用JWT等安全方式
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
三、常见问题排查与优化建议
- code只能用一次,重复提交会报错“invalid code”。
- AppID/包名/签名不一致,微信SDK会拉起失败或code无效。
- UnitySendMessage对象名/方法名拼写错误,回调不到Unity层。
- 网络超时/微信服务器不稳定,建议服务端有重试和超时处理。
- access_token过期,如需长期获取用户信息,需用refresh_token刷新。
- 安全建议:AppSecret等敏感信息绝不能放在客户端。
四、流程优化建议
- 自动化打包脚本:不同渠道包自动替换微信AppID、包名、签名。
- 灰度发布:新功能先灰度,监控登录成功率。
- 埋点监控:登录、鉴权、回调等关键节点都要有日志,便于排查问题。
- 用户体验:登录失败要有友好提示和重试机制。
五、参考资料
下面继续补充微信登录在Unity项目中的实战细节、常见问题深度解析、以及上线前后的注意事项,让你能顺利上线并高效维护。
六、Unity微信登录实战细节
1. Unity端完整流程梳理
- 用户点击微信登录按钮
- Unity调用原生微信SDK(通过AndroidJavaClass或DllImport)
- 原生SDK调起微信App,用户授权
- 微信App返回
code
到原生SDK - 原生SDK通过
UnitySendMessage
把code
传回Unity - Unity用
UnityWebRequest
把code
发到你自己的服务端 - 服务端用
code
换access_token
和openid
,生成自有token - 服务端返回自有token,Unity保存并进入游戏
2. Unity端代码结构建议
- WXLoginManager.cs:负责与原生交互、接收回调、与服务端通信
- NativeBridge(Android/iOS):负责SDK初始化、拉起微信、回调Unity
- LoginUIManager.cs:负责UI交互和登录流程控制
3. 典型代码片段
3.1 Unity端接收回调
public class WXLoginManager : MonoBehaviour
{
public void OnWXLoginCode(string code)
{
Debug.Log("Received WeChat code: " + code);
StartCoroutine(PostCodeToServer(code));
}
IEnumerator PostCodeToServer(string code)
{
WWWForm form = new WWWForm();
form.AddField("code", code);
using (UnityWebRequest www = UnityWebRequest.Post("https://yourserver.com/api/wxlogin", form))
{
yield return www.SendWebRequest();
if (www.result == UnityWebRequest.Result.Success)
{
// 解析token,进入游戏
}
else
{
// 友好提示
}
}
}
}
3.2 Android原生回调
UnityPlayer.UnitySendMessage("WXLoginManager", "OnWXLoginCode", code);
3.3 iOS原生回调
UnitySendMessage("WXLoginManager", "OnWXLoginCode", [code UTF8String]);
七、常见问题深度解析
1. code无效/重复使用
- code只能用一次,客户端和服务端都要注意避免重复提交。
- 建议服务端收到code后,立刻用微信接口换token,失败要有详细日志。
2. 微信App未安装/拉起失败
- 微信SDK有回调,需在Unity端提示“请先安装微信”。
- Android/iOS原生层可判断微信是否已安装。
3. 签名/包名/APPID不一致
- 微信开放平台后台的包名、签名、APPID必须和实际包一致。
- 多渠道包要自动化处理签名和包名。
4. UnitySendMessage回调不到
- 对象名、方法名必须和Unity场景中挂载的对象一致,且对象必须激活。
- 建议在启动时DontDestroyOnLoad挂载WXLoginManager。
5. 服务端安全
- AppSecret、token生成逻辑绝不能放在客户端。
- 服务端要校验openid唯一性,防止账号串号。
八、上线前后注意事项
1. 审核材料准备
- 登录流程录屏、隐私政策弹窗截图
- 微信开放平台后台配置截图
- SDK自测报告
2. 灰度与监控
- 先小范围灰度,监控登录成功率、异常日志
- 埋点:登录按钮点击、code获取、服务端鉴权成功/失败
3. 用户体验优化
- 登录失败友好提示(如“网络异常,请重试”)
- 支持一键重试
- 登录超时处理
4. 版本管理
- 微信SDK升级要全流程回归测试
- 多渠道包自动化打包脚本,避免手动出错
九、进阶建议
- 支持微信一键登录:可集成微信一键登录SDK,提升转化率
- 多平台兼容:安卓/iOS统一接口,便于维护
- 账号绑定:支持手机号、微信等多方式互绑,提升用户留存
- 自动化测试:用Appium等工具自动化测试登录流程
十、常用调试技巧
- 用Charles/Fiddler抓包,排查服务端与微信接口交互
- Unity Editor下可用Mock数据模拟微信登录,提升开发效率
- 日志分级,关键节点详细记录