1、Android (安卓下,微信登陆或分享需要正确配置包名,签名,appid才能够有效果) 安卓采用jni方式,这里给出java部分代码 注册到微信: public static IWX
顺晟科技
2021-06-16 10:38:39
313
。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=";然后就可以正常使用代码。