cocos2dx3.15接入微信SDK实现登录和分享android studio2.3.3

cocos2dx3.15接入微信SDK实现登录和分享android studio2.3.3,首先开始呢,我必须得吐槽一下网上的教程以及微信开放平台官网,网上的教程主要是太老了代码虽然都能用但是不完整有的东西已经改了,官网就不用说了,文档垃圾,是很垃圾。参考作用几乎等于没有,唯一作用就是查看返回值以及一些参数有什么用。嗯对的。没话说。

现在开始教程:

第一步:

?
1
2
3
准备好你的APP_ID这个东西不解释了。如果不知道请先去[微信开放平台](https: //open.weixin.qq.com/) 查看一下注册你的应用程序。然后登录功能是收费的,分享是免费的
  下面是注册应用程序的步骤:
      打开微信开放平台官网:

cocos2dx3.15接入微信SDK实现登录和分享android studio2.3.3_第1张图片

点击创建应用,按照提示输入好之后点击下一步。:
cocos2dx3.15接入微信SDK实现登录和分享android studio2.3.3_第2张图片

填写完了之后就提交审核,一般的话审核可能1-3天就好了
cocos2dx3.15接入微信SDK实现登录和分享android studio2.3.3_第3张图片

以安卓为例子,签名和包名必须要和你要接入的cocos项目的包名和签名一致,对于签名的获取请看下图:
cocos2dx3.15接入微信SDK实现登录和分享android studio2.3.3_第4张图片

打开 Android资源下载之后在右边下滑找到:
cocos2dx3.15接入微信SDK实现登录和分享android studio2.3.3_第5张图片

下载安装到手机上,我这里用的模拟器,然后把你们要接入的cocos项目也打包好安装的手机上之后打开之前安装的签名生成工具:
cocos2dx3.15接入微信SDK实现登录和分享android studio2.3.3_第6张图片

打开工具之后输入你的包名:
cocos2dx3.15接入微信SDK实现登录和分享android studio2.3.3_第7张图片
这个就是签名的获取

应用注册审核通过之后开始下一步

第二步:
将你的cocos项目导入到android studio2.3.3,其他环境参照相应的教程导入项目,但是推荐用android studio方便,导入方法如下:
cocos2dx3.15接入微信SDK实现登录和分享android studio2.3.3_第8张图片
cocos2dx3.15接入微信SDK实现登录和分享android studio2.3.3_第9张图片
cocos2dx3.15接入微信SDK实现登录和分享android studio2.3.3_第10张图片

项目导入之后配置一下微信SDK的环境只需要一句话就可以了,但是前提是你电脑能够联网下载微信SDK:
cocos2dx3.15接入微信SDK实现登录和分享android studio2.3.3_第11张图片

?
1
把这一句话加上就行了: 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'

接下来就可以开始写代码了,首先是Java端的代码,代码比较简单,我也不是很了解Java所以我就不逐行解释了,基本上直接复制就可以使用了。

首先打开这个文件:
cocos2dx3.15接入微信SDK实现登录和分享android studio2.3.3_第12张图片

下面是java端的代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package org.cocos2dx.cpp;
 
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
 
import com.qt.NiuBuTing.R;
import com.qt.NiuBuTing.wxapi.WXEntryActivity;
import com.tencent.mm.opensdk.modelmsg.SendAuth;
import com.tencent.mm.opensdk.modelmsg.SendMessageToWX;
import com.tencent.mm.opensdk.modelmsg.WXMediaMessage;
import com.tencent.mm.opensdk.modelmsg.WXWebpageObject;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
 
import org.cocos2dx.lib.Cocos2dxActivity;
 
import java.io.ByteArrayOutputStream;
 
public class AppActivity extends Cocos2dxActivity {
     public static final String TAG = "NiuBuTing_Weixin_SDK" ;
     public static final String APP_ID = "这里填写你的Appid" ;
     public static IWXAPI api;
     private static AppActivity instance = null ;
 
     protected void onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         instance = this ;
         // 注册到微信
         regToWx();
     }
 
     //注册到微信
     private void regToWx() {
         //工厂模式创建微信api
         api = WXAPIFactory.createWXAPI( this , APP_ID, false );
 
         //注册程序
         api.registerApp(APP_ID);
     }
 
     //启动微信
     private static boolean LaunchWX() {
         boolean ret = false ;
         if (!api.isWXAppInstalled())
         { //判断是否安装微信
             Toast.makeText(instance, "没有安装微信,请先安装微信!" , Toast.LENGTH_LONG).show();
             return ret;
         }
         if (api.openWXApp())
         { //判断打开微信是否成功
             Log.d(TAG, "微信打开成功!" );
             ret = true ;
         }
         else
         {
             Log.d(TAG, "微信打开失败!" );
             ret = false ;
         }
 
         return ret;
     }
 
     //将图片解析成一个二进制数组
     private byte [] bmpToByteArrar( final Bitmap bitmap, final boolean isRecycle){
         ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
         bitmap.compress(Bitmap.CompressFormat.PNG, 100 , outputStream);
         if (isRecycle)
         {
             bitmap.recycle();
         }
 
         byte [] result = outputStream.toByteArray();
 
         try
         {
             outputStream.close();
         }
         catch (Exception e)
         {
             e.printStackTrace();
         }
         return result;
     }
 
     //微信登录
     public static void WXLogin(){
         Log.d(TAG, "login-------------" );
         WXEntryActivity.ReqState = 0 ;
         final SendAuth.Req req = new SendAuth.Req();
         req.scope = "snsapi_userinfo" //这里不能改
         req.state = "QTNiuBuTing" //这里改成你自己的数据
         api.sendReq(req);
     }
 
     //分享到聊天窗口
     public static void WXShareMsgToFriends( final String userNickName,
                                            final String roomNum,
                                            final String inningsNum,
                                            final String peopleNum,
                                            final int playType){
         //这里的参数是看你自己你需要的话就行,但是在cocos里面调用这个方法的你也传递数值过来
 
         String strPlayType = "轮庄牛牛" ;
 
         if (playType == 1 )   //2为轮庄
         {
             strPlayType = "抢庄牛牛" ;
         }
 
         WXEntryActivity.ReqState = 1 ;
 
         //封装一个链接,点击跳转到指定网址
         WXWebpageObject webpag = new WXWebpageObject();
         webpag.webpageUrl = "https://www.0791youxi.com/" ;
 
         //封装游戏图标
         Bitmap bitmap = BitmapFactory.decodeResource(instance.getResources(), R.mipmap.icon);
         Bitmap thumb = Bitmap.createScaledBitmap(bitmap, 108 , 108 , true );
         bitmap.recycle();
 
         //封装分享内容
         WXMediaMessage msg = new WXMediaMessage(webpag);
         msg.thumbData = instance.bmpToByteArrar(thumb, true );
         msg.title = "我是 " + userNickName;  //这个是标题
         msg.description = "[" + strPlayType + "]"  //这个是描述
                 + " 房间号:" + roomNum + "。"
                 + " 局数:" + inningsNum + "。"
                 + " 人数:" + peopleNum + "人。"
                 + "约么? 我在QT牛不停创建了房间,一起来玩一玩吧!" ;
 
         //封装请求
         SendMessageToWX.Req req = new SendMessageToWX.Req();
         req.transaction = buildTransaction( "webpag" );
         req.message = msg;
         req.scene = SendMessageToWX.Req.WXSceneSession;
 
         //发送请求
         api.sendReq(req);
     }
 
     //生成一个微信唯一请求标识符
     private static String buildTransaction( final String type) {
         return (type == null ) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
     }
}

微信登录请求和分享请求发送后还需要创建一个类提供给微信SDK回调,现在你需要新建一个包,包名必须为wxapi,而且这个包必须要在cocos包名的目录下,比如你包名是com.csn.cocosNew 那么新建的这包就是com.csn.cocosNew.wxapi,然后在这个包下面新建一个WXEntryActivity类,类名也是必须这样,没办法微信的要求,下面是创建的方法:
首先是创建包:
cocos2dx3.15接入微信SDK实现登录和分享android studio2.3.3_第13张图片
cocos2dx3.15接入微信SDK实现登录和分享android studio2.3.3_第14张图片
包名输你自己的别输我演示的这个,然后点击OK

接下来是创建类:
cocos2dx3.15接入微信SDK实现登录和分享android studio2.3.3_第15张图片
类创建的时候在你刚才新建的包名目录下右键单击就可以了

记得类名必须是WXEntryActivity!!! 其他的默认就行了

全部创建好之后文件结构是这样的:
cocos2dx3.15接入微信SDK实现登录和分享android studio2.3.3_第16张图片

然后双击打开,开始写回调:

下面是WXEntryActivity类里面的完整代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package 你的项目包名.wxapi;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
 
import com.tencent.mm.opensdk.modelbase.BaseReq;
import com.tencent.mm.opensdk.modelbase.BaseResp;
import com.tencent.mm.opensdk.modelmsg.SendAuth;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler;
 
import org.cocos2dx.cpp.AppActivity;
import org.cocos2dx.cpp.tools.JniHelper;
 
/**
  * Created by Administrator on 2017/6/5.
  */
 
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
     private final String TAG = "NiuBuTing_Weixin_SDK" ;
     public static int ReqState = - 1 //0为登录, 1为分享
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
 
         AppActivity.api.handleIntent( this .getIntent(), this );
         //如果没回调onResp,八成是这句没有写
     }
 
     @Override
     protected void onNewIntent(Intent intent) {
         super .onNewIntent(intent);
 
         setIntent(intent);
         AppActivity.api.handleIntent(intent, this );
     }
 
     // 微信发送请求到第三方应用时,会回调到该方法
     @Override
     public void onReq(BaseReq req) {
         finish();
     }
 
     @Override
     public void onResp(BaseResp resp) {
         Log.d(TAG, "onResp:" );
         switch (resp.errCode) {
             case BaseResp.ErrCode.ERR_OK:
                 Log.d(TAG, "请求成功" );
                 if (ReqState == 0 //这个是自己加用于判断是登录还是分享,你们可以去掉判断只要里面的代码就行了
                 {
                     SendAuth.Resp sendResp = (SendAuth.Resp) resp;
                     JniHelper.onResp(sendResp.code); //这个登录了之后用于回调cocos端函数的映射代码
                     Log.d(TAG, sendResp.code);
                 }
                 break ;
             case BaseResp.ErrCode.ERR_USER_CANCEL:
                 //发送取消
                 Toast.makeText( this , "请求取消" , Toast.LENGTH_LONG).show();
                 break ;
             case BaseResp.ErrCode.ERR_AUTH_DENIED:
                 //发送被拒绝
                 Toast.makeText( this , "请求被拒绝" , Toast.LENGTH_LONG).show();
                 break ;
             default :
                 //发送返回
                 Toast.makeText( this , "请求返回" , Toast.LENGTH_LONG).show();
                 break ;
         }
         ReqState = - 1 ;
         finish();
     }
}

这里是JniHelper这个类里面的代码。这里面你们要自己创建一个,创建在那个包下面都无所谓:
我是创建在这儿:
cocos2dx3.15接入微信SDK实现登录和分享android studio2.3.3_第17张图片

下面是代码

?
1
2
3
4
5
6
7
8
9
package org.cocos2dx.cpp.tools;
 
/**
  * Created by Administrator on 2017/6/5.
  */
 
public class JniHelper {
     public static native void onResp(String code);
}

做完这些之后还需要添加相应的权限,在AndroidMainfest.xml文件里面添加,下面附上我的文件,你们根据要求自己更改:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
"auto" package = "com.qt.NiuBuTing" xmlns:android= "https://schemas.android.com/apk/res/android" >
 
     "0x00020000" >
     
     "android.permission.INTERNET" >
     "android.permission.ACCESS_NETWORK_STATE" >
     "android.permission.ACCESS_WIFI_STATE" >
     "android.permission.READ_PHONE_STATE" >
     "android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >
     "android.permission.WRITE_EXTERNAL_STORAGE" >
 
     
 
        
         "android.app.lib_name" android:value= "MyGame" >
 
         
            
                 
 
                 "android.intent.category.LAUNCHER" >
            
        
 
        
         
 
     "android.app.lib_name" android:value= "MyGame" > "android.app.lib_name" android:value= "MyGame" >
 

以上步骤完成了之后就可以还可以在cocos里面使用了。

下面开始说cocos里面的使用,我的使用方法是新建一个类专门用访问微信的是一个单例:
下面附上完整代码,首先是.h文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#ifndef __WXAPIMANAGER_H__
#define __WXAPIMANAGER_H__
 
#include "cocos2d.h"
#include "network/HttpClient.h"
 
USING_NS_CC;
using namespace network;
 
typedef std::function< void (std::string> LastCallBack;
 
# if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)  //判断是不是安卓环境
#include "platform/android/jni/JniHelper.h"
#endif
 
typedef enum {
     REQ_ERROR = 0 ,
     REQ_SUCCESS,
     CMD_ACCESS_TOKEN,
     CMD_USER_INFO,
     DEFAULT
}reqTag;
 
class WXAPIManager : Ref
{
public :
     static WXAPIManager *getInstance();
 
     //分享到好友
     void sendToFriend( const char *userNickName, const char *roomNum, const char *inningsNum, const char *peopleNum, const int playType);
 
     //微信登录
     void loginWX();
 
public :
     static WXAPIManager *_instance;
 
     //http请求
     void WX_RequestHttp( const char *url, const std::string &data);
 
     //请求的回调
     void onResponse(HttpClient *client, HttpResponse *response);
 
     //最终回调
     void onTheEndResponse(std::string &data);
 
private :
     WXAPIManager();
     ~WXAPIManager();
 
     reqTag lastTag;
};
#endif // __WXAPIMANAGER_H__

接下来是.cpp的代码:

?

你可能感兴趣的:(cocos2dx)