首页 > 上网技巧 > 电脑小技巧 > Cocos2d-x微信登陆Demo

Cocos2d-x微信登陆Demo

时间:2020-04-13 11:37 作者:QQ地带 我要评论

1、Android
安卓下,微信登陆或分享需要正确配置包名,签名,appid才能够有效果)
安卓采用jni方式,这里给出java部分代码
注册到微信:
 
    public static IWXAPI wxapi;
    private static final String APP_ID = "这里写你的appid";
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 注册到微信
        wxapi = WXAPIFactory.createWXAPI(this, APP_ID, true);
        wxapi.registerApp(APP_ID);
    }
 
登陆方法:
 
    // 登陆到微信
    public static void WxLogin() {
        Log.v("WeiChatLogin", "login-------------");
        final SendAuth.Req req = new SendAuth.Req();
        req.scope = "snsapi_userinfo";
        req.state = "weichat_sdk_demo";
        wxapi.sendReq(req);
    }
 
WXEntryActivity类必须要在包名目录下,如:com.test.test.wxapi.WXEntryActivity
这里给出完整的代码:
 
package com.xxxxx.xxxx.wxapi;
 
 
import org.cocos2dx.cpp.AppActivity;
 
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
 
import com.tencent.mm.sdk.constants.ConstantsAPI;
import com.tencent.mm.sdk.modelbase.BaseReq;
import com.tencent.mm.sdk.modelbase.BaseResp;
import com.tencent.mm.sdk.modelmsg.SendAuth;
 
 
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.v("WeiChatLogin","WXEntryActivity  onCreate ---------");
    }
 
    @Override
    public void onReq(BaseReq req) {
        // TODO Auto-generated method stub
        Log.v("WeiChatLogin", "onReq++++++++++++");
    }
 
    @Override
    public void onResp(BaseResp resp) {
        Log.v("WeiChatLogin", "onResp-------------");
        //Bundle bundle = new Bundle();
        switch (resp.errCode) {
        case BaseResp.ErrCode.ERR_OK:
            // 可用以下两种方法获得code
            // resp.toBundle(bundle);
            // Resp sp = new Resp(bundle);
            // String code = sp.code;
            // 或者
            if (resp.getType() == ConstantsAPI.COMMAND_SENDAUTH)//登陆回调
            {
                Log.v("", "this is WXLogin callBack .... ");
                String code = ((SendAuth.Resp) resp).code; // 这里的code就是接入指南里要拿到的code
                Toast.makeText(this, "onResp------------- " + code, 6000).show();
                //这里写获取到code之后的事件
            } else if (resp.getType() == ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX)//分享回调
            {
                Log.v("", "this is share callBack .... ");
            }
            finish();//必须要有,用于点击返回游戏的时候不会留在微信
            break;
        case BaseResp.ErrCode.ERR_USER_CANCEL:
            Log.v("WeiChatLogin", "login----ERR_USER_CANCEL-");
            break;
        case BaseResp.ErrCode.ERR_AUTH_DENIED:
            Log.v("WeiChatLogin", "login----ERR_AUTH_DENIED-");
            break;
        default:
            Log.v("WeiChatLogin", "login--unknown---");
            break;
 
        }
    }
}
 
因为我们是服务器去获取access_token,故此这里给出网上客户端获取access_token的方法,不保证完全正常使用:
(官方文档规定:获取access_token需要使用get方法)
 
    protected static final int RETURN_OPENID_ACCESSTOKEN = 0;// 返回openid,accessToken消息码
    protected static final int RETURN_NICKNAME_UID = 1; // 返回昵称,uid消息码
 
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case RETURN_OPENID_ACCESSTOKEN:
                Bundle bundle1 = (Bundle) msg.obj;
                String accessToken = bundle1.getString("access_token");
                String openId = bundle1.getString("open_id");
 
                getUID(openId, accessToken);
                break;
 
            case RETURN_NICKNAME_UID:
                Bundle bundle2 = (Bundle) msg.obj;
                String nickname = bundle2.getString("nickname");
                String uid = bundle2.getString("unionid");
                textView.setText("uid:" + uid);
                loginBtn.setText("昵称:" + nickname);
                break;
 
            default:
                break;
            }
        };
    };
 
 
    /**
     * 获取openid accessToken值用于后期操作
     * @param code 请求码
     */
    private void getResult(final String code) {
        new Thread() {// 开启工作线程进行网络请求
            public void run() {
                String path = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="
                        + APP_ID //这里替换成你的appid
                        + "&secret="
                        + APP_SECRET //这里替换成你的appsecret
                        + "&code="
                        + code
                        + "&grant_type=authorization_code";
                try {
                    JSONObject jsonObject = JsonUtils
                            .initSSLWithHttpClinet(path);// 请求https连接并得到json结果
                    if (null != jsonObject) {
                        String openid = jsonObject.getString("openid")
                                .toString().trim();
                        String access_token = jsonObject
                                .getString("access_token").toString().trim();
                        Log.i(TAG, "openid = " + openid);
                        Log.i(TAG, "access_token = " + access_token);
 
                        Message msg = handler.obtainMessage();
                        msg.what = RETURN_OPENID_ACCESSTOKEN;
                        Bundle bundle = new Bundle();
                        bundle.putString("openid", openid);
                        bundle.putString("access_token", access_token);
                        msg.obj = bundle;
                        handler.sendMessage(msg);
                    }
                } catch (ClientProtocolException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                return;
            };
        }.start();
    }
 
    /**
     * 获取用户唯一标识
     * @param openId
     * @param accessToken
     */
    private void getUID(final String openId, final String accessToken) {
        new Thread() {
            @Override
            public void run() {
                String path = "https://api.weixin.qq.com/sns/userinfo?access_token="
                        + accessToken + "&openid=" + openId;
                JSONObject jsonObject = null;
                try {
                    jsonObject = JsonUtils.initSSLWithHttpClinet(path);
                    String nickname = jsonObject.getString("nickname");
                    String unionid = jsonObject.getString("unionid");
                    Log.i(TAG, "nickname = " + nickname);
                    Log.i(TAG, "unionid = " + unionid);
 
                    Message msg = handler.obtainMessage();
                    msg.what = RETURN_NICKNAME_UID;
                    Bundle bundle = new Bundle();
                    bundle.putString("nickname", nickname);
                    bundle.putString("unionid", unionid);
                    msg.obj = bundle;
                    handler.sendMessage(msg);
                } catch (ClientProtocolException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            };
        }.start();
    }
 
2、IOS
在AppController里面要做的:
注册到微信
 
    //Register to weiChat
    NSString* appID = @"你的微信appID";
    [WXApi registerApp:appID withDescription:@"test"];
 
注册微信的回调
 
#pragma mark UMShare WeiChat
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
    return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}
 
因为游戏使用C++写的,需要和OC交互,故此这里写了工具类:
WeiChatLogin.hpp
 
#ifndef WeiChatLogin_hpp
#define WeiChatLogin_hpp
 
#include "cocos2d.h"
USING_NS_CC;
 
class WeiChatLogin{
public:
    static WeiChatLogin* getInstance();
    void sendAuthReq();//这里是微信登录方法
 
private:
    WeiChatLogin();
    ~WeiChatLogin();
 
    static WeiChatLogin* m_wxLogin;
};
 
 
#endif /* WeiChatLogin_hpp */
 
WeiChatLogin.mm
 
include "WeiChatLogin.hpp"
#include "WXApiObject.h"
#include "WXApi.h"
 
WeiChatLogin* WeiChatLogin::m_wxLogin = nullptr;
 
WeiChatLogin::WeiChatLogin()
{
 
}
 
WeiChatLogin::~WeiChatLogin()
{
    if (m_wxLogin) {
        delete m_wxLogin;
    }
    m_wxLogin = nullptr;
}
 
WeiChatLogin* WeiChatLogin::getInstance()
{
    if (!m_wxLogin) {
        m_wxLogin = new WeiChatLogin();
    }
    return m_wxLogin;
}
 
void WeiChatLogin::sendAuthReq()
{
    //构造sendAuthReq结构体
    SendAuthReq* req = [[[SendAuthReq alloc] init] autorelease];
    req.scope = @"snsapi_userinfo";
    req.state = @"baibianwx";
    [WXApi sendReq:req];
}
 
WXApiManager.h
 
#import <Foundation/Foundation.h>
#import "WXApi.h"
 
@protocol WXApiManagerDelegate <NSObject>
 
@end
 
@interface WXApiManager : NSObject<WXApiDelegate>
 
@property (nonatomic, assign) id<WXApiManagerDelegate> delegate;
 
+ (instancetype)sharedManager;
 
@end
 
WXApiManager.mm
 
#import "WXApiManager.h"
#include "WeiChatLogin.hpp"
#include "LoginSceneData.h"
 
@implementation WXApiManager
 
#pragma mark - LifeCycle
+(instancetype)sharedManager {
    static dispatch_once_t onceToken;
    static WXApiManager *instance;
    dispatch_once(&onceToken, ^{
        instance = [[WXApiManager alloc] init];
    });
    return instance;
}
 
- (void)dealloc {
    self.delegate = nil;
    [super dealloc];
}
 
#pragma mark - WXApiDelegate
- (void)onResp:(BaseResp *)resp {
    NSLog(@"onResp-------");
    if (WXSuccess == resp.errCode) {
        switch (rep.type) /*这里用于区别回调类型*/ {
            case 1://Login
                NSLog(@"weiChatLogin WXSuccess ------  ");
                s_WeiChatCode = [((SendAuthResp* )resp).code UTF8String];
                b_isGetCode = true;
                NSLog(@" s_WeiChatCode is : %s",s_WeiChatCode.c_str());
                break;
            case 0://share
                NSLog(@"share WXSuccess ------  ");
                break;
            default:
                break;
        }
 
 
    } else if (WXErrCodeUserCancel == resp.errCode){
        NSLog(@"weiChatLogin WXErrCodeUserCancel ------");
    } else if (WXErrCodeSentFail == resp.errCode){
        NSLog(@"weiChatLogin WXErrCodeSentFail ------");
    } else if (WXErrCodeAuthDeny == resp.errCode){
        NSLog(@"LweiChatLogin WXErrCodeAuthDeny ------");
    } else {
 
    }
}
@end
 
LoginSceneData.h
 
#include<string>
 
extern std::string s_WeiChatCode;
extern bool b_isGetCode;
 
要在游戏里面向服务器发送code的cpp中先定义 std::string s_WeiChatCode = “”; 然后就可以正常使用code.
 

标签: 微信 Cocos2d-x
顶一下
(0)
0%
踩一下
(0)
0%

Google提供的广告