Cocos2d-x微信登陆Demo

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.

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值