Skip to content

Commit c18736a

Browse files
committed
feat: login by phone number
Signed-off-by: Dylan <2894220@gmail.com>
1 parent c312ff6 commit c18736a

File tree

14 files changed

+1533
-1086
lines changed

14 files changed

+1533
-1086
lines changed

.clang-format

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1 @@
1-
BasedOnStyle: Chromium
2-
ColumnLimit: 150
3-
BreakBeforeBraces: Attach
4-
IndentWidth: 4
5-
BreakConstructorInitializers: BeforeComma
6-
ConstructorInitializerAllOnOneLineOrOnePerLine: false
7-
ConstructorInitializerIndentWidth: 4
8-
AccessModifierOffset: -4
1+
BasedOnStyle: Microsoft

app_sdk/app_sdk_define.h

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,44 @@
11
#pragma once
22
#include <functional>
33

4-
namespace app_sdk {
5-
6-
//格式化账号密码回调
7-
using OnFormatAccountAndPasswordCallback = std::function<void(bool ret, /*是否进行登录*/ const std::string& account, const std::string& password)>;
8-
//注册新账号回调
9-
using OnRegisterAccountCallback = std::function<void(int code, const std::string& err_msg)>;
10-
//获取聊天室列表回调
11-
using OnGetChatroomListCallback = std::function<void(int code, const std::vector<nim_chatroom::ChatRoomInfo>& chatroom_list)>;
12-
//获取聊天室地址回调
13-
using OnGetChatroomAddressCallback = std::function<void(int code, const std::list<std::string>& address_list)>;
14-
15-
} // namespace app_sdk
4+
namespace app_sdk
5+
{
6+
7+
// 格式化账号密码回调
8+
using OnFormatAccountAndPasswordCallback =
9+
std::function<void(bool ret, /*是否进行登录*/ const std::string &account, const std::string &password)>;
10+
// 注册新账号回调
11+
using OnRegisterAccountCallback = std::function<void(int code, const std::string &err_msg)>;
12+
// 获取聊天室列表回调
13+
using OnGetChatroomListCallback =
14+
std::function<void(int code, const std::vector<nim_chatroom::ChatRoomInfo> &chatroom_list)>;
15+
// 获取聊天室地址回调
16+
using OnGetChatroomAddressCallback = std::function<void(int code, const std::list<std::string> &address_list)>;
17+
18+
// 发送手机验证码回调
19+
using OnSendSmsCodeCallback =
20+
std::function<void(int code, bool is_first_register, const std::string &request_id, const std::string &err_msg)>;
21+
22+
// 手机验证码登录回调 - 内部使用的完整结构体
23+
struct LoginByCodeResult
24+
{
25+
std::string user;
26+
std::string access_token;
27+
std::string im_accid;
28+
std::string im_token;
29+
std::string dynamic_token;
30+
std::string avatar;
31+
std::string av_room_uid;
32+
std::string nickname;
33+
std::string account_id;
34+
std::string user_uuid;
35+
std::string user_name;
36+
std::string icon;
37+
std::string auth_type;
38+
};
39+
40+
// 对外回调只返回登录所需的账号密码
41+
using OnLoginByCodeCallback = std::function<void(int code, const std::string &im_accid, const std::string &im_token,
42+
const std::string &request_id, const std::string &err_msg)>;
43+
44+
} // namespace app_sdk

app_sdk/app_sdk_interface.cpp

Lines changed: 127 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
#include "protocol/sdk_pro.h"
77
#include "shared/xml_util.h"
88

9-
namespace app_sdk {
9+
namespace app_sdk
10+
{
1011
const std::map<std::string, std::tuple<std::string, NimServerConfType>> key_use_nim_server_conf = {
1112
{nim::kNIMAppKey, std::make_tuple("appkey", NimServerConfType::NimServerConfType_String)},
1213
{nim::kNIMUseHttps, std::make_tuple("https_enabled", NimServerConfType::NimServerConfType_Int)},
@@ -27,50 +28,63 @@ const std::string AppSDKInterface::kAppKey = "3e215d27b6a6a9e27dad7ef36dd5b65c";
2728
const std::string AppSDKInterface::kAppHost = "http://app.netease.im";
2829

2930
std::map<std::string, std::string> AppSDKInterface::config_map_;
30-
bool AppSDKInterface::HasconfigValue(const std::string& key, bool from_private_setting) {
31+
bool AppSDKInterface::HasconfigValue(const std::string &key, bool from_private_setting)
32+
{
3133
bool ret = false;
32-
if (config_map_.empty()) {
34+
if (config_map_.empty())
35+
{
3336
LoadConfig();
3437
}
3538
ret = (config_map_.find(key) != config_map_.end());
36-
if (!ret && from_private_setting) {
39+
if (!ret && from_private_setting)
40+
{
3741
Json::Value json_value;
3842
if (key_use_nim_server_conf.find(key) != key_use_nim_server_conf.end() &&
39-
nbase::FilePathIsExist(nbase::UTF8ToUTF16(app_sdk::AppSDKConfig::GetInstance()->GetAppConfigPath()), false) &&
40-
GetNimServerConfJsonObject(std::get<0>(key_use_nim_server_conf.find(key)->second), json_value)) {
43+
nbase::FilePathIsExist(nbase::UTF8ToUTF16(app_sdk::AppSDKConfig::GetInstance()->GetAppConfigPath()),
44+
false) &&
45+
GetNimServerConfJsonObject(std::get<0>(key_use_nim_server_conf.find(key)->second), json_value))
46+
{
4147
ret = true;
4248
}
4349
}
4450
return ret;
4551
}
46-
std::string AppSDKInterface::GetConfigValue(const std::string& key) {
52+
std::string AppSDKInterface::GetConfigValue(const std::string &key)
53+
{
4754
Json::Value json_value;
4855
if (key_use_nim_server_conf.find(key) != key_use_nim_server_conf.end() &&
4956
nbase::FilePathIsExist(nbase::UTF8ToUTF16(app_sdk::AppSDKConfig::GetInstance()->GetAppConfigPath()), false) &&
50-
app_sdk::GetNimServerConfJsonObject(std::get<0>(key_use_nim_server_conf.find(key)->second), json_value)) {
57+
app_sdk::GetNimServerConfJsonObject(std::get<0>(key_use_nim_server_conf.find(key)->second), json_value))
58+
{
5159
auto it = key_use_nim_server_conf.find(key);
5260
return GetConfigStringValueFromNimServerConf(std::get<0>(it->second), std::get<1>(it->second));
5361
}
5462
return GetConfigValueFromMap(key);
5563
}
56-
std::string AppSDKInterface::GetConfigValueFromMap(const std::string& key) {
57-
if (config_map_.empty()) {
64+
std::string AppSDKInterface::GetConfigValueFromMap(const std::string &key)
65+
{
66+
if (config_map_.empty())
67+
{
5868
LoadConfig();
5969
}
6070
if (config_map_.find(key) != config_map_.end())
6171
return config_map_[key];
6272
return "";
6373
}
64-
int AppSDKInterface::GetConfigFileVersion() {
74+
int AppSDKInterface::GetConfigFileVersion()
75+
{
6576
int version = 0;
6677
std::string value;
6778
std::wstring server_conf_path = QPath::GetAppPath();
6879
server_conf_path.append(L"global_conf.txt");
6980
TiXmlDocument document;
70-
if (shared::LoadXmlFromFile(document, server_conf_path)) {
71-
TiXmlElement* root = document.RootElement();
72-
if (root != nullptr) {
73-
if (auto pchar = root->Attribute("kConfVersion")) {
81+
if (shared::LoadXmlFromFile(document, server_conf_path))
82+
{
83+
TiXmlElement *root = document.RootElement();
84+
if (root != nullptr)
85+
{
86+
if (auto pchar = root->Attribute("kConfVersion"))
87+
{
7488
value = pchar;
7589
}
7690
}
@@ -79,23 +93,27 @@ int AppSDKInterface::GetConfigFileVersion() {
7993
nbase::StringToInt(value, &version);
8094
return version;
8195
}
82-
std::string AppSDKInterface::GetAppKey() {
96+
std::string AppSDKInterface::GetAppKey()
97+
{
8398
std::string app_key = kAppKey;
8499
std::string new_app_key = GetConfigValue(nim::kNIMAppKey);
85-
if (!new_app_key.empty()) {
100+
if (!new_app_key.empty())
101+
{
86102
app_key = new_app_key;
87103
}
88104
return app_key;
89105
}
90-
bool AppSDKInterface::IsNimDemoAppKey(const std::string& appkey) {
106+
bool AppSDKInterface::IsNimDemoAppKey(const std::string &appkey)
107+
{
91108
static const std::string kNimTestAppKey = "fe416640c8e8a72734219e1847ad2547";
92109
static const std::string kNimSGAppKey = "b88e33e57c0f2a427e19db2b8461cb55";
93110
if (appkey.compare(kNimTestAppKey) == 0 || appkey.compare(kAppKey) == 0 || appkey.compare(kNimSGAppKey) == 0)
94111
return true;
95112
return false;
96113
}
97114

98-
bool AppSDKInterface::IsSafeUrl(const std::string& safe_url) {
115+
bool AppSDKInterface::IsSafeUrl(const std::string &safe_url)
116+
{
99117
std::string temp(safe_url);
100118
std::string params;
101119
std::vector<std::string> param_list;
@@ -104,7 +122,8 @@ bool AppSDKInterface::IsSafeUrl(const std::string& safe_url) {
104122
params = temp.substr(param_pos, temp.length());
105123
nbase::LowerString(params);
106124
shared::tools::SplitString(params, "&", param_list);
107-
for (auto& it : param_list) {
125+
for (auto &it : param_list)
126+
{
108127
std::vector<std::string> param_pair;
109128
shared::tools::SplitString(it, "=", param_pair);
110129
if (param_pair.empty())
@@ -113,80 +132,128 @@ bool AppSDKInterface::IsSafeUrl(const std::string& safe_url) {
113132
}
114133
static const std::string safe_url_param_key = "_im_url";
115134
static const int safe_url_param_value = 0x00000001;
116-
if (param_pair_list.find(safe_url_param_key) != param_pair_list.end()) {
135+
if (param_pair_list.find(safe_url_param_key) != param_pair_list.end())
136+
{
117137
return (std::atoi(param_pair_list[safe_url_param_key].c_str()) & safe_url_param_value) == safe_url_param_value;
118138
}
119139
return false;
120140
}
121141

122-
std::string AppSDKInterface::GetReferrer() {
142+
std::string AppSDKInterface::GetReferrer()
143+
{
123144
// 开发者请根据自己实际情况来获取该域名地址
124145
return "http://yunxin_referer";
125146
}
126147

127-
std::string AppSDKInterface::GetAppHost() {
148+
std::string AppSDKInterface::GetAppHost()
149+
{
128150
return kAppHost;
129151
}
130-
void AppSDKInterface::InvokeFormatAccountAndPassword(const std::string& username,
131-
const std::string& password,
132-
const OnFormatAccountAndPasswordCallback& cb) {
133-
//如果是云信的demo password会进行md5编码,如果是开发者自己的应用可以引入其它方式
134-
//甚至可以转到开发者自己的应用服务器,拿到真正的accid 与password,可以异步操作,但此时 user相关数据(user目录、image目录以及日志等)并未创建
135-
bool password_use_md5 = IsNimDemoAppKey(GetAppKey());
136-
if (!password_use_md5)
137-
password_use_md5 = (HasconfigValue("kNIMPasswordMD5") && (std::atoi(GetConfigValue("kNIMPasswordMD5").c_str()) != 0));
138-
cb(!(username.empty() || password.empty()), username, (password_use_md5 ? nim::Tool::GetMd5(password) : password));
139-
}
140-
void AppSDKInterface::InvokeRegisterAccount(const std::string& username,
141-
const std::string& password,
142-
const std::string& nickname,
143-
const OnRegisterAccountCallback& cb) {
144-
//在构造函数中传入请求参数
145-
auto&& req = app_sdk::CreateHttpRequest<app_sdk_pro::RegisterAccountReq>(username, password, nickname);
152+
void AppSDKInterface::InvokeFormatAccountAndPassword(const std::string &username, const std::string &password,
153+
const OnFormatAccountAndPasswordCallback &cb)
154+
{
155+
// 如果是云信的demo password会进行md5编码,如果是开发者自己的应用可以引入其它方式
156+
// 甚至可以转到开发者自己的应用服务器,拿到真正的accid 与password,可以异步操作,但此时
157+
// user相关数据(user目录、image目录以及日志等)并未创建
158+
cb(!(username.empty() || password.empty()), username, password);
159+
}
160+
void AppSDKInterface::InvokeRegisterAccount(const std::string &username, const std::string &password,
161+
const std::string &nickname, const OnRegisterAccountCallback &cb)
162+
{
163+
// 在构造函数中传入请求参数
164+
auto &&req = app_sdk::CreateHttpRequest<app_sdk_pro::RegisterAccountReq>(username, password, nickname);
146165

147166
SDKManager::GetInstance()->Invoke_Request<app_sdk_pro::RegisterAccountReq, app_sdk_pro::RegisterAccountRsp>(
148-
req, ToWeakCallback([cb](const app_sdk_pro::RegisterAccountReq& req, const app_sdk_pro::RegisterAccountRsp& rsp) {
149-
if (cb != nullptr) {
150-
cb((rsp->GetResponseCode() == nim::kNIMResSuccess ? rsp->GetProtocolReplyCode() : rsp->GetResponseCode()), rsp->err_msg_);
167+
req,
168+
ToWeakCallback([cb](const app_sdk_pro::RegisterAccountReq &req, const app_sdk_pro::RegisterAccountRsp &rsp) {
169+
if (cb != nullptr)
170+
{
171+
cb((rsp->GetResponseCode() == nim::kNIMResSuccess ? rsp->GetProtocolReplyCode()
172+
: rsp->GetResponseCode()),
173+
rsp->err_msg_);
151174
}
152175
}));
153176
}
154-
void AppSDKInterface::InvokeGetChatroomList(const OnGetChatroomListCallback& cb) {
155-
auto&& req = app_sdk::CreateHttpRequest<app_sdk_pro::GetChatroomListReq>();
177+
void AppSDKInterface::InvokeGetChatroomList(const OnGetChatroomListCallback &cb)
178+
{
179+
auto &&req = app_sdk::CreateHttpRequest<app_sdk_pro::GetChatroomListReq>();
156180
SDKManager::GetInstance()->Invoke_Request<app_sdk_pro::GetChatroomListReq, app_sdk_pro::GetChatroomListRsp>(
157-
req, ToWeakCallback([cb](const app_sdk_pro::GetChatroomListReq& req, const app_sdk_pro::GetChatroomListRsp& rsp) {
158-
if (cb != nullptr) {
159-
cb((rsp->GetResponseCode() == nim::kNIMResSuccess ? rsp->GetProtocolReplyCode() : rsp->GetResponseCode()), rsp->chatroom_list_);
181+
req,
182+
ToWeakCallback([cb](const app_sdk_pro::GetChatroomListReq &req, const app_sdk_pro::GetChatroomListRsp &rsp) {
183+
if (cb != nullptr)
184+
{
185+
cb((rsp->GetResponseCode() == nim::kNIMResSuccess ? rsp->GetProtocolReplyCode()
186+
: rsp->GetResponseCode()),
187+
rsp->chatroom_list_);
160188
}
161189
}));
162190
}
163-
void AppSDKInterface::InvokeGetChatroomAddress(__int64 room_id, const std::string& uid, int type, const OnGetChatroomAddressCallback& cb) {
164-
auto&& req = app_sdk::CreateHttpRequest<app_sdk_pro::GetChatroomAddressReq>();
191+
void AppSDKInterface::InvokeGetChatroomAddress(__int64 room_id, const std::string &uid, int type,
192+
const OnGetChatroomAddressCallback &cb)
193+
{
194+
auto &&req = app_sdk::CreateHttpRequest<app_sdk_pro::GetChatroomAddressReq>();
165195
req->room_id_ = room_id;
166196
req->type_ = type;
167197
req->uid_ = uid;
168198
SDKManager::GetInstance()->Invoke_Request<app_sdk_pro::GetChatroomAddressReq, app_sdk_pro::GetChatroomAddressRsp>(
169-
req, ToWeakCallback([cb](const app_sdk_pro::GetChatroomAddressReq& req, const app_sdk_pro::GetChatroomAddressRsp& rsp) {
170-
if (cb != nullptr) {
171-
cb((rsp->GetResponseCode() == nim::kNIMResSuccess ? rsp->GetProtocolReplyCode() : rsp->GetResponseCode()), rsp->address_);
172-
}
173-
}));
199+
req, ToWeakCallback(
200+
[cb](const app_sdk_pro::GetChatroomAddressReq &req, const app_sdk_pro::GetChatroomAddressRsp &rsp) {
201+
if (cb != nullptr)
202+
{
203+
cb((rsp->GetResponseCode() == nim::kNIMResSuccess ? rsp->GetProtocolReplyCode()
204+
: rsp->GetResponseCode()),
205+
rsp->address_);
206+
}
207+
}));
174208
}
175-
void AppSDKInterface::LoadConfig() {
209+
void AppSDKInterface::LoadConfig()
210+
{
176211
config_map_.clear();
177212
std::wstring server_conf_path = QPath::GetAppPath();
178213
server_conf_path.append(L"global_conf.txt");
179214
TiXmlDocument document;
180-
if (shared::LoadXmlFromFile(document, server_conf_path)) {
181-
TiXmlElement* root = document.RootElement();
215+
if (shared::LoadXmlFromFile(document, server_conf_path))
216+
{
217+
TiXmlElement *root = document.RootElement();
182218
auto attribute = root->FirstAttribute();
183-
while (attribute != nullptr) {
219+
while (attribute != nullptr)
220+
{
184221
config_map_[attribute->Name()] = attribute->Value();
185222
attribute = attribute->Next();
186223
}
187224
}
188-
if (config_map_.empty()) {
225+
if (config_map_.empty())
226+
{
189227
config_map_["nim_global_conf_error"] = "nim_global_conf_error";
190228
}
191229
}
192-
} // namespace app_sdk
230+
231+
void AppSDKInterface::InvokeSendSmsCode(const std::string &mobile, const OnSendSmsCodeCallback &cb)
232+
{
233+
auto &&req = app_sdk::CreateHttpRequest<app_sdk_pro::SendSmsCodeReq>(mobile);
234+
SDKManager::GetInstance()->Invoke_Request<app_sdk_pro::SendSmsCodeReq, app_sdk_pro::SendSmsCodeRsp>(
235+
req, ToWeakCallback([cb](const app_sdk_pro::SendSmsCodeReq &req, const app_sdk_pro::SendSmsCodeRsp &rsp) {
236+
if (cb != nullptr)
237+
{
238+
cb((rsp->GetResponseCode() == nim::kNIMResSuccess ? rsp->GetProtocolReplyCode()
239+
: rsp->GetResponseCode()),
240+
rsp->is_first_register_, rsp->request_id_, rsp->err_msg_);
241+
}
242+
}));
243+
}
244+
245+
void AppSDKInterface::InvokeLoginByCode(const std::string &mobile, const std::string &sms_code,
246+
const OnLoginByCodeCallback &cb)
247+
{
248+
auto &&req = app_sdk::CreateHttpRequest<app_sdk_pro::LoginByCodeReq>(mobile, sms_code);
249+
SDKManager::GetInstance()->Invoke_Request<app_sdk_pro::LoginByCodeReq, app_sdk_pro::LoginByCodeRsp>(
250+
req, ToWeakCallback([cb](const app_sdk_pro::LoginByCodeReq &req, const app_sdk_pro::LoginByCodeRsp &rsp) {
251+
if (cb != nullptr)
252+
{
253+
cb((rsp->GetResponseCode() == nim::kNIMResSuccess ? rsp->GetProtocolReplyCode()
254+
: rsp->GetResponseCode()),
255+
rsp->result_.im_accid, rsp->result_.im_token, rsp->request_id_, rsp->err_msg_);
256+
}
257+
}));
258+
}
259+
} // namespace app_sdk

0 commit comments

Comments
 (0)