#include "cocos2d.h" #include "MissionWeiXin.h" #include "JniFun.h" #include "Define.h" #include "Utility.h" 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 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); //派发创建游戏事件至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); } //////////////////////////////// 微信分享 ////////////////////////////////////////// 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) { 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); } //////////////////////////////// 闲聊分享 ////////////////////////////////////////// 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*/) { 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); }