Files
wnmj/Classes/Mission/MissionWeiXin.cpp

248 lines
7.6 KiB
C++
Raw Normal View History

2026-02-13 14:34:15 +08:00
#include "cocos2d.h"
#include "MissionWeiXin.h"
#include "JniFun.h"
#include "Define.h"
2026-03-01 13:48:24 +08:00
#include "Utility.h"
2026-02-13 14:34:15 +08:00
USING_NS_CC;
SINGLETON_STORAGE(MissionWeiXin)
MissionWeiXin::MissionWeiXin()
:m_pJinMissionSink(NULL)
{
m_bRefreshToken = false;
}
MissionWeiXin::~MissionWeiXin()
{
}
void MissionWeiXin::logonWeiXin()
{
std::string access_token = UserDefault::getInstance()->getStringForKey("access_token");
std::string refresh_token = UserDefault::getInstance()->getStringForKey("refresh_token");
std::string openid = UserDefault::getInstance()->getStringForKey("openid","");
if (access_token != "" && openid != "")
{
Req_UserInfo(access_token, openid);
}
else
{
JniFun::longinWX("","");
}
}
void MissionWeiXin::restWeiXin()
{
UserDefault::getInstance()->setStringForKey("access_token","");
UserDefault::getInstance()->setStringForKey("refresh_token","");
}
void MissionWeiXin::setMissionSink( IWeiXinMissionSink* pJniMissionSink )
{
m_pJinMissionSink = pJniMissionSink;
}
IWeiXinMissionSink* MissionWeiXin::getMissionSink()
{
return m_pJinMissionSink;
}
void MissionWeiXin::Req_Fail_token(std::string param)
{
if (m_pJinMissionSink)
{
m_pJinMissionSink->onWxLoginFail(param);
}
}
void MissionWeiXin::Req_Access_token(std::string param)
{
std::vector<std::string> kVector = utility::split(param,":");
if (kVector.size() != 4)
{
utility::mlog("if (kVector.size() != 4)");
//"ERR_USER_CANCEL"
//"ERR_AUTH_DENIED"
//"REE_Unknow"
Scene* pScene = Director::getInstance()->getRunningScene();
if (pScene != nullptr)
{
int nTag = pScene->getTag();
if (nTag == SCENE_TAG_MAIN)
{
//"ShareFriends"
if (param.compare("ShareFriendsSuccess")==0)
{
auto dispatcher = Director::getInstance()->getEventDispatcher();
EventCustom event(WXSHARE_FRIENDS_SUCCESS);
//<2F>ɷ<EFBFBD><C9B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD>ShowScene
dispatcher->dispatchEvent(&event);
}
}
else if (SCENE_TAG_LOGON == nTag)
{
if (m_pJinMissionSink)
{
m_pJinMissionSink->onWxLoginFail(param);
}
}
}
return ;
}
std::string kUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?";
m_kWxAppId = kVector[0];
m_kWxAppSecret = kVector[1];
CWebReq::pushValue(kUrl, "appid", kVector[0]);
CWebReq::pushValue(kUrl, "secret", kVector[1]);
CWebReq::pushValue(kUrl, "code", kVector[2]);
CWebReq::pushValue(kUrl, "grant_type", kVector[3]);
// kUrl="https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx79ad4c77ea07f41e&secret=66ad79231c6954ba68811afb14fad5e2&code=031RcTgJ17gEpa028PfJ1a9VgJ1RcTgO&grant_type=authorization_code";
CWebReq::getInstance().sendRequestDocumentUrl(kUrl, CC_CALLBACK_1(MissionWeiXin::Rsp_Access_token, this), nullptr);
}
void MissionWeiXin::Rsp_Access_token(rapidjson::Document* pDoc)
{
std::string access_token = CWebReq::getDataValueStr(pDoc, "access_token");
int expires_in = CWebReq::getDataValueInt(pDoc, "expires_in");
std::string refresh_token = CWebReq::getDataValueStr(pDoc, "refresh_token");
std::string openid = CWebReq::getDataValueStr(pDoc, "openid");
std::string scope = CWebReq::getDataValueStr(pDoc, "scope");
std::string unionid = CWebReq::getDataValueStr(pDoc, "unionid");
cocos2d::log(" JNIMission access_token:%s",access_token.c_str());
cocos2d::log(" JNIMission expires_in:%d",expires_in);
cocos2d::log(" JNIMission refresh_token:%s",refresh_token.c_str());
cocos2d::log(" JNIMission openid:%s",openid.c_str());
cocos2d::log(" JNIMission scope:%s",scope.c_str());
cocos2d::log(" JNIMission unionid:%s",unionid.c_str());
UserDefault::getInstance()->setStringForKey("access_token",access_token);
UserDefault::getInstance()->setStringForKey("refresh_token",refresh_token);
UserDefault::getInstance()->setStringForKey("openid",openid);
UserDefault::getInstance()->setStringForKey("unionid",unionid);
UserDefault::getInstance()->flush();
Req_UserInfo(access_token,openid);
}
void MissionWeiXin::Req_UserInfo(const std::string& access_token,const std::string& open_id)
{
std::string kUrl = "https://api.weixin.qq.com/sns/userinfo?";
CWebReq::pushValue(kUrl,"access_token",access_token);
CWebReq::pushValue(kUrl, "openid", open_id);
CWebReq::getInstance().sendRequestDocumentUrl(kUrl, CC_CALLBACK_1(MissionWeiXin::Rsp_UserInfo, this), nullptr);
cocos2d::log("kUrl = %s", kUrl.c_str());
}
void MissionWeiXin::Rsp_UserInfo(rapidjson::Document* pDoc)
{
int errcode = CWebReq::getDataValueInt(pDoc, "errcode");
if (errcode != 0)
{
if (m_bRefreshToken)
{
JniFun::longinWX("", "");
}
else
{
Req_RefreshToken();
}
return;
}
WxUserInfo kWxUserInfo;
kWxUserInfo.openid = CWebReq::getDataValueStr(pDoc, "openid");
kWxUserInfo.nickname = CWebReq::getDataValueStr(pDoc, "nickname");
kWxUserInfo.sex = CWebReq::getDataValueInt(pDoc, "sex");
kWxUserInfo.province = CWebReq::getDataValueStr(pDoc, "province");
kWxUserInfo.city = CWebReq::getDataValueStr(pDoc, "city");
kWxUserInfo.country = CWebReq::getDataValueStr(pDoc, "country");
kWxUserInfo.headimgurl = CWebReq::getDataValueStr(pDoc, "headimgurl");
kWxUserInfo.unionid = CWebReq::getDataValueStr(pDoc, "unionid");
cocos2d::UserDefault::getInstance()->setStringForKey("openid",kWxUserInfo.openid);
cocos2d::UserDefault::getInstance()->setStringForKey("unionid",kWxUserInfo.unionid);
cocos2d::UserDefault::getInstance()->flush();
m_bRefreshToken = false;
if (m_pJinMissionSink)
{
m_pJinMissionSink->onWxLoginSuccess(kWxUserInfo);
}
}
void MissionWeiXin::Req_RefreshToken()
{
std::string kUrl = "https://api.weixin.qq.com/sns/oauth2/refresh_token?";
std::string access_token = cocos2d::UserDefault::getInstance()->getStringForKey("access_token");
std::string refresh_token = cocos2d::UserDefault::getInstance()->getStringForKey("refresh_token");
CWebReq::pushValue(kUrl, "appid", access_token);
CWebReq::pushValue(kUrl, "grant_type", "refresh_token");
CWebReq::pushValue(kUrl, "refresh_token", refresh_token);
CWebReq::getInstance().sendRequestDocumentUrl(kUrl, CC_CALLBACK_1(MissionWeiXin::Rsp_RefreshToken, this), nullptr);
}
void MissionWeiXin::Rsp_RefreshToken(rapidjson::Document* pDoc)
{
m_bRefreshToken = true;
Rsp_Access_token(pDoc);
}
//////////////////////////////// ΢<>ŷ<EFBFBD><C5B7><EFBFBD> //////////////////////////////////////////
void MissionWeiXin::shareScreenWeiXin(std::string strImagic,int nShareType /*= SHARE_SESSION*/)
{
captureScreen(true,strImagic,nShareType);
}
void MissionWeiXin::captureScreen(bool succeed, const std::string& outputFile,int nShareType)
{
if (succeed)
{
cocos2d::log("MissionWeiXin captureScreen:%s",outputFile.c_str());
JniFun::shareImageWX(outputFile.c_str(),nShareType);
}
else
{
cocos2d::log("MissionWeiXin captureScreen failed!");
}
}
void MissionWeiXin::shareTextWeiXin(std::string kText,int nShareType /*= SHARE_SESSION*/)
{
JniFun::shareTextWX(kText.c_str(),nShareType);
}
void MissionWeiXin::shareUrlWeiXin(std::string kUrl,std::string kTitle,std::string kDesc,int nShareType)
{
2026-03-01 13:48:24 +08:00
std::string utf8Title = utility::a_u8(kTitle);
std::string utf8Desc = utility::a_u8(kDesc);
JniFun::shareUrlWX(kUrl.c_str(),utf8Title.c_str(),utf8Desc.c_str(),nShareType);
2026-02-13 14:34:15 +08:00
}
//////////////////////////////// <20><><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD> //////////////////////////////////////////
void MissionWeiXin::shareScreenXL(std::string strImagic, int nShareType /*= SHARE_SESSION*/)
{
JniFun::shareImageXL(strImagic.c_str(), nShareType);
}
void MissionWeiXin::shareTextXL(std::string kText, int nShareType /*= SHARE_SESSION*/)
{
JniFun::shareTextXL(kText.c_str(), nShareType);
}
void MissionWeiXin::shareUrlXL(std::string kUrl, std::string kTitle, std::string kDesc, int nShareType /*= SHARE_SESSION*/)
{
2026-03-01 13:48:24 +08:00
std::string utf8Title = utility::a_u8(kTitle);
std::string utf8Desc = utility::a_u8(kDesc);
JniFun::shareUrlXL(kUrl.c_str(), utf8Title.c_str(), utf8Desc.c_str(), nShareType);
2026-02-13 14:34:15 +08:00
}