快速登录界面关于如何登录以及多账号列表解析以及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"):

相关推荐
爱吃喵的鲤鱼17 分钟前
linux进程的状态之环境变量
linux·运维·服务器·开发语言·c++
7年老菜鸡1 小时前
策略模式(C++)三分钟读懂
c++·qt·策略模式
Ni-Guvara1 小时前
函数对象笔记
c++·算法
似霰1 小时前
安卓智能指针sp、wp、RefBase浅析
android·c++·binder
芊寻(嵌入式)1 小时前
C转C++学习笔记--基础知识摘录总结
开发语言·c++·笔记·学习
獨枭1 小时前
C++ 项目中使用 .dll 和 .def 文件的操作指南
c++
霁月风1 小时前
设计模式——观察者模式
c++·观察者模式·设计模式
橘色的喵1 小时前
C++编程:避免因编译优化引发的多线程死锁问题
c++·多线程·memory·死锁·内存屏障·内存栅栏·memory barrier
何曾参静谧2 小时前
「C/C++」C/C++ 之 变量作用域详解
c语言·开发语言·c++
AI街潜水的八角2 小时前
基于C++的决策树C4.5机器学习算法(不调包)
c++·算法·决策树·机器学习