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
|
|
|
|
}
|