快速登录界面关于如何登录以及多账号列表解析以及config配置文件如何读取以及JsLogin模块与SdoLogin模块如何通信(4)

1、### Jslogin模块与前端以及JsLogin模块与Sdologin的交互

配置文件的读取:

xml 复制代码
	<CompanyIdForQq value="301"/>	
	<CompanyIdForWx value="300"/>
	<CompanyIdForWb value="302"/>
	<qq value="https://graph.qq.com/oauth2.0/authorize?response_type=code&amp;client_id=101531594&amp;redirect_uri=https://mygm.sdo.com/v1/oauth/authorize&amp;state=qq" />
	<wx value="https://open.weixin.qq.com/connect/qrconnect?response_type=code&amp;scope=snsapi_login&amp;appid=wxa0ef5c72c3732d26&amp;redirect_uri=https://mygm.sdo.com/v1/oauth/authorize&amp;state=wx#wechat_redirect" />
	<wb value="https://api.weibo.com/oauth2/authorize?client_id=3349601784&amp;redirect_uri=https://mygm.sdo.com/v1/oauth/authorize&amp;state=wb" />

假设url:

https://graph.qq.com/oauth2.0/authorize?response_type=code\&client_id=101531594\&redirect_uri=https://mygm.sdo.com/v1/oauth/authorize\&state=qq

然后代码里面调用:

C++ 复制代码
tstring qq_url =  CConfigManager::GetInstance()->GetClientInfoValue(L"qq");

最后被转义,所以url要被设定为:

https://graph.qq.com/oauth2.0/authorize?response_type=code\&client_id=101531594\&redirect_uri=https://mygm.sdo.com/v1/oauth/authorize\&state=qq

与前端交互接口的注册:

C++ 复制代码
SystemAction::SystemAction()
{
	TRACET();
	m_mapFunctions["Minimize"]			=	&SystemAction::Minimize;
	m_mapFunctions["Close"]				=	&SystemAction::Close;
	m_mapFunctions["Login"]				=	&SystemAction::Login;
	m_mapFunctions["IeResize"]			=	&SystemAction::IeResize;
	m_mapFunctions["CloseAgreementIE"]	=	&SystemAction::CloseAgreementIE;
	m_mapFunctions["OpenAgreementIE"]	=	&SystemAction::OpenAgreementIE;
	m_mapFunctions["IeWResize"]			=	&SystemAction::IeWResize;
	m_mapFunctions["IeHResize"]			=	&SystemAction::IeResize;
	m_mapFunctions["OpenShunWangloginIE"] =	&SystemAction::OpenShunWangloginIE;
	m_mapFunctions["CloseShunWangloginIE"]=	&SystemAction::CloseShunWangloginIE;
	m_mapFunctions["CloseAreaSetting"]  =	&SystemAction::CloseAreaSetting;
	m_mapFunctions["IeHReset"]			=	&SystemAction::IeHReset;
	m_mapFunctions["FeiHuoLoginResult"]	=	&SystemAction::FeiHuoLoginResult;
	m_mapFunctions["onCommonGeetestResult"]	=	&SystemAction::onCommonGeetestResult;
	
	//三方打开ie关闭ie
	/*m_mapFunctions["OpenThirdloginIE"] =	&SystemAction::OpenThirdloginIE;*/
	m_mapFunctions["CloseThirdloginIE"]=	&SystemAction::CloseThirdloginIE;
	通知前端登录器调用
	//m_mapFunctions["NotifyThirdlogin"]=		&SystemAction::NotifyThirdlogin;
	m_mapFunctions["IsThirdLogin"]=	&SystemAction::IsThirdLogin;
}

与前端交互接口定义:

C++ 复制代码
HRESULT SystemAction::CloseThirdloginIE( DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, unsigned int* puArgErr,EXCEPINFO* pInternalExcepInfo)
{
	TRACET();

	ThirdloginReq request;
	request.m_flag = 0;

	LPWSTR  _ticket = pDispParams->rgvarg[0].bstrVal;
	wcsncpy_s(request.ticket, _ticket, _countof(request.ticket)-1);

	if(!CJsLoginExternal::GetInstance()->SendMessage(&request))
	{
		TRACEW(_T("Send CloseThirdloginIE failed."));
		return S_FALSE;
	}

	//MessageRsp response;
	//if(!CJsLoginExternal::GetInstance()->WaitResponse(&request, &response, DEFAULT_TIMEOUT))
	//{
	//	TRACEW(_T("Send CloseShunWangloginIE timeout"));
	//	return S_FALSE;
	//}

	return S_OK;
}

获取前端JS代码调用接口传过来的参数:

然后使用CJsLoginExternal::GetInstance()->SendMessage(&request)把消息发送给SdoLogin

C++ 复制代码
	case SDOL_CMD_THIRD_DIALOG_REQ:
		return new ThirdloginReq();
C++ 复制代码
LRESULT CSDOLApp::OnThirdDialogLogin(WPARAM wParam, LPARAM lParam)
{
	TRACET();

	ThirdloginReq* pReq = (ThirdloginReq*)wParam;
	ASSERT_RETURN_VALUE(pReq, -1);

	wchar_t* ticket = pReq->ticket;
	
	//m_flag为0时候可以验证QQ登录
	if (pReq->m_flag == 0)
	{
		CDataReportMaker::GetInstance()->OnCollecUserOperated("0x018");
		tstring phone, smsCode;
		CAuthenManager::GetInstance()->AsyncForThirdLogin(StringHelper::Format(ticket),all_commpany_id, phone, smsCode,"1");//区分老旧版本:extend=1表示新版本
		
		if(GetIetDlg())
		{
			GetIetDlg()->OnBtnClose();
		}

		HWND hwd = CSDOLApp::GetInstance()->GetGameWnd();
		ShowWindow(hwd,SW_RESTORE);
	}

	m_LoginModule.SendSimpleResponse(pReq, 0);

	return 0;
}

JsLogin模块参数传给前端:

C++ 复制代码
HRESULT SystemAction::IsThirdLogin(DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, unsigned int* puArgErr,EXCEPINFO* pInternalExcepInfo)
{
	TRACET();
	pVarResult->vt = VT_BOOL;
	pVarResult->boolVal = True;
	return S_OK;
}

前端调用JsLogin模块方法:web页面是在相同的浏览器环境内打开的 向这个环境内注入了方法是可以在拿到三方返回的code之后前端通过该方法把code传递给JsLogin模块的。

当出现问题根据调试工具调试:

根据传给前端的参数为false:

然后调用System.Action.CloseThirdLoginIE("ticket"):

相关推荐
点云SLAM21 分钟前
C++(C++17/20)最佳工厂写法和SLAM应用综合示例
开发语言·c++·设计模式·c++实战·注册工厂模式·c++大工程系统
Q741_14722 分钟前
C++ 队列 宽度优先搜索 BFS 力扣 662. 二叉树最大宽度 每日一题
c++·算法·leetcode·bfs·宽度优先
csdn_aspnet27 分钟前
C++跨平台开发:工程难题与解决方案深度解析
c++
余衫马1 小时前
在Win10下编译 Poppler
c++·windows·qt·pdf·poppler
王老师青少年编程1 小时前
2024年3月GESP真题及题解(C++七级): 俄罗斯方块
c++·题解·真题·gesp·csp·俄罗斯方块·七级
oioihoii1 小时前
拆解融合:测试开发,一个关于“更好”的悖论
c++
xiaoqider1 小时前
C++模板进阶
开发语言·c++
移幻漂流2 小时前
C/C++并发编程详解:如何写出优秀的并发程序
c语言·开发语言·c++
被星1砸昏头2 小时前
C++中的享元模式
开发语言·c++·算法
D_evil__3 小时前
【Effective Modern C++】第三章 转向现代C++:7. 在创建对象时注意区分()和{}
c++