18910140161

Cocos2d-x微信登陆Demo

顺晟科技

2021-06-16 10:38:39

313

1、安卓 (安卓下,微信登陆或分享需要正确配置包名,签名,appid才能够有效果) 安卓采用调用方式,这里给出爪哇岛部分代码 注册到微信: 公共静态IWXAPI wxapi 私有静态最终字符串' APP_ID='这里写你的appid '; 受保护的无效创建(捆绑保存实例){ 超级。OnCreate(SaveDinstancestate); //注册到微信 wxapi=wxapifactory。createwxapi(this,APP_ID,true); wxapi。注册APP(APP _ ID); } 登陆方法: //登陆到微信 public static void WxLogin() { Log.v('WeiChatLogin ',' log in-'); 最终发送授权请求请求=新发送授权.req(); 请求。作用域=' SNS API _用户信息'; req.state=' weichat _ sdk _ demo wxapi。sendReq(req); } WXEntryActivity类必须要在包名目录下,如:com。测试。测试。wxapi。wxentryactivity 这里给出完整的代码: package comxxxxx

。xxxx.wxapi

导入组织。cocos2dx。CPP。AppActivity

导入安卓。内容。意图;

导入安卓。OS。捆绑;

导入安卓。util。日志;

导入安卓。小工具。吐司;

进口。com。腾讯。嗯SDK。常数。ConstantsAPI

进口。com。腾讯。嗯SDK。模型库。BaseReq

进口。com。腾讯。嗯SDK。模型库。baseresp

进口。com。腾讯。嗯SDK。模型消息。SendAuth

公共类WXEntryActivity扩展活动实现IWXAPIEventHandler {

@覆盖

公共void onCreate(捆绑保存实例){

超级。OnCreate(SaveDinstancestate);

Log.v('WeiChatLogin ',' WXEntryActivity OnCreate-');

}

@覆盖

public void OnReq(BaseReq){

//TODO自动生成的方法存根

Log.v('WeiChatLogin ',' OnReq ');

}

@覆盖

esp上的公共空间(基本空间)

Log.v('WeiChatLogin ',' OnResp-');

//Bundle Bundle=new Bundle();

开关(resp.errCode) {

case BaseResp .错误代码

//可用以下两种方法获得密码

//resp。tobundle(捆绑);

//Resp sp=new Resp(bundle);

//字符串代码=sp。代码;

//或者

if(resp。GetType()==ConstantsAPI .COMMAND_SENDAUTH)//登陆回调

{

Log.v(','这是WXLogin回调.');

字符串代码=((SendAuth .Resp).代码;//这里的密码就是接入指南里要拿到的密码

Toast.makeText(这个,“onesp——”代码,6000)。show();

//这里写获取到密码之后的事件

} else if(resp。GetType()==ConstantsAPI .命令_发送消息_到_WX)//分享回调

{

Log.v(','这是分享回调.');

}

finish();//必须要有,用于点击返回游戏的时候不会留在微信

打破;

case BaseResp .错误代码。错误_用户_取消:

Log.v('WeiChatLogin ',' log in-ERR _ USER _ CANCEL-');

打破;

case BaseResp .错误代码。错误_授权_拒绝:

Log.v('WeiChatLogin ',' log in-ERR _ AUTH _ DENIED-');

打破;

默认值:

Log.v('WeiChatLogin ',' log in-unknown-');

打破;

}

}

}

因为我们是服务器去获取access_token,故此这里给出网上客户端获取access_token的方法,不保证完全正常使用:

(官方文档规定:获取access_token需要使用得到方法)

受保护的静态最终int RETURN _ OPENID _ ACCESTOKEN=0;//返回openid,accessToken消息码

受保护的静态最终int RETURN _ NICKNAME _ UID=1;//返回昵称,uid消息码

私有处理程序处理程序=新处理程序(){

@覆盖

公共无效句柄消息(消息消息){

switch (msg.what) {

case RETURN _ OPENID _ ACCESTOKEN :

捆绑包1=(捆绑包)消息。obj

字符串访问令牌=捆绑包1。getStrIng(' access _ token ');

string OpenID=bundle 1。getStrIng(' open _ id ');

getUID(openId,AccessToken);

打破;

案例返回_昵称_指南:

捆绑包2=(捆绑包)消息。obj

线昵称=bundle2.getString('昵称');

string uid=bundle 2。getStrIng(' union id ');

textview。SetText(' uid : ' uid);

' loginBtn.setText('昵称:'昵称);

打破;

默认值:

打破;

}

};

};

/**

* 获取信息访问令牌值用于后期操作

* @param代码请求码

*/

私有void getResult(最终字符串代码){

new Thread() {//开启工作线程进行网络请求

public void run() {

字符串路径='https://api.weixin.qq.com/sns/oauth2/access_token?appid='

APP_ID //这里替换成你的应用编号

秘密='

APP_SECRET //这里替换成你的密钥

代码='

密码

grant _ type=authorization _ code ';

尝试{

JSONObject jsonObject=JsonUtils。initSSLWithHttpClinet(路径);//请求安全超文本传输协议连接并得到数据结果

if (null!=jsonObject) {

字符串open id=JSonobject。GetString('打开id ')。toString().trim();

字符串访问_token=jsonObject。getString('access_token ').toString().trim();

Log.i(TAG,‘open id=’open id);

Log.i(TAG,' access _ token=' access _ token);

消息消息=处理程序。EQUIRement();

味精。what=RETURN _ OPENID _ ACCESTOKEN

Bundle Bundle=new Bundle();

bundle.putString('openid ',open id);

bundle.putString('access_token ',access _ token);

msg.obj=bundle

汉德勒。send message(msg);

}

} catch(ClientProtocoleException e){

e .printstacktrace();

} catch (IOException e) {

e .printstacktrace();

} catch (JSONException e) {

e .printstacktrace();

}

返回;

};

}.start();

}

/**

* 获取用户标识

* @param openId

* @param accessToken

*/

私有空getUID(最终字符串openId,最终字符串访问令牌){

新线程(){

@覆盖

public void run() {

字符串路径='https://api.weixin.qq.com/sns/userinfo?access_token='

accessToken ' openid=' openId

JSONObject jsonObject=null

尝试{

JSON对象=jsonutils。initsslwithtpclinet(路径);

线昵称=jsonObject.getString('昵称');

字符串联合id=JSonobject。getStrIng(' union id ');

Log.i(TAG,)昵称='昵称);

Log.i(TAG,‘union id=’union id);

消息消息=处理程序。EQUIRement();

msg.what=RETURN _ NICKNAME _ UID

Bundle Bundle=new Bundle();

bundle.putString('昵称,昵称);

bundle.putString('unionid ',union id);

msg.obj=bundle

汉德勒。send message(msg);

} catch(ClientProtocoleException e){

e .printstacktrace();

} catch (IOException e) {

e .printstacktrace();

} catch (JSONException e) {

e .printstacktrace();

}

};

}.start();

}

2、IOS

在AppController里面要做的:

注册到微信

//注册到卫初

' NSString* appID=@ '你的微信appID ';

[WXApi registereapp : appid,描述为: @ ' test '];

注册微信的回调

#pragma mark UMShare WeiChat

-(BOOL)应用程序:(ui应用程序*)应用程序openurl :(NSURL *)URL源应用程序:(NSString *)源应用程序注释:(id)注释

{

返回[WXAPI handleopenurl : URl委托:[WXAPI管理器共享管理器]];

}

-(BOOL)应用:(ui应用*)应用handleopenurls :(NSURL *)URL

{

返回[WXAPI handleopenurl : URl委托:[WXAPI管理器共享管理器]];

}

因为游戏使用C写的,需要和指挥官交互,故此这里写了工具类:

WeiChatLogin.hpp

#ifndef WeiChatLogin_hpp

#定义卫初堂登录_hpp

#包含" cocos2d.h "

使用_ NS _ CC

class WeiChatLogin {

public:

静态WeiChatLogin * GetInstance();

void SendAuthReq();//这里是微信登录方法

private:

WeiChatLogin();

~ WeiChatLogin();

静态WeiChatLogin * m _ wxLogin

};

#endif /* WeiChatLogin_hpp */

WeiChatLogin.mm

包括" WeiChatLogin.hpp "

#包含WXApiObject.h '

#包含WXApi.h '

WeiChatLogin * WeiChatLogin :m _ wxLogin=nullptr;

卫初登录:卫初登录()

{

}

潍柴登录: ~潍柴登录()

{

if (m_wxLogin) {

删除m _ wxLogin

}

m _ wxLogin=nullptr

}

潍柴登录*潍柴登录weichatlogin : getinstance()

{

if(!m_wxLogin) {

m _ wxLogin=new WeiChatLogin();

}

返回m _ wxLogin

}

无效的weichat log in :3360 SendAuthReq()

{

//构造发送授权请求结构体

SendAuthReq * req=[[[SendAuthReq alloc]init]自动释放];

请求。作用域=@ ' SNS API _用户信息';

req.state=@ ' baibianwx

[WXAPI SendReq : req];

}

WXApiManager.h

#导入基础/基础。h

#import 'WXApi.h '

@ protocol WXApiManagerDelegate n对象

@end

@接口WXApiManager : NSobjectwxapidelegate

@property (nonatomic,assign) idWXApiManagerDelegate委托;

(实例类型)共享管理器;

@end

WXApiManager.mm

#import 'WXApiManager.h '

#包括weichatlogin。HPP

#包含LoginSceneData.h '

@实现WXApiManager

#pragma标记-生命周期

(instancetype)sharedManager {

static dispatch _ once _ t once令牌;

静态WXApiManager *实例;

调度_一次(一次令牌,^{

instance=[[WxaPimanager alloc]init];

});

返回实例;

}

- (void)dealloc {

self.delegate=nil

[超级交易锁定];

}

#pragma标记- WXApiDelegate

-(void)在esp:上(base resp *)resp {

NSLog(@ ' OnResp-');

if (WXSuccess==resp.errCode) {

开关(rep.type) /*这里用于区别回调类型*/{

案例1://登录

NSLog(@ ' WeichtLogWxssuccess-');

s _ Weichat code=[((SendAuthResp *)resp).代码UTf8 StrIng];

b _ isGetCode=true

NSLog(@ s _ WeiChatCode是: %s,s _ WeiChatCode。c _ str());

打破;

案例0://共享

NSLog(@ ' share WxSuccess-');

打破;

默认值:

打破;

}

} else if(WXercode user CANCEl==resp。errcode){

NSLog(@ ' weichatLogon wxercode user cancel-');

} else if(wxercodesentfail==resp。errcode){

NSLog(@ ' weichatLogon wxercodesentfail-');

} else if(wxercode authdeny==resp。errcode){

NSLog(@ ' lWeichatLogon wXercode auth deny-');

} else {

}

}

@end

LoginSceneData.h

#包含列表

extern STD :3360字符串s _ Weichat COde

extern bool b _ isGetCode

要在游戏里面向服务器发送密码的卡片打印处理机(卡片打印处理器的缩写)中先定义STD :字符串s _ Weichat COde=";然后就可以正常使用代码。

我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航