cocos2dx3.15接入微信SDK實現登錄和分享android studio2.3.3

cocos2dx3.15接入微信SDK實現登錄和分享android studio2.3.3,首先開始呢,我必須得吐槽一下網上的教程以及微信開放平臺官網,網上的教程主要是太老了代碼雖然都能用但是不完整有的東西已經改了,官網就不用說了,文檔垃圾,是很垃圾。參考作用幾乎等於沒有,唯一作用就是查看返回值以及一些參數有什麼用。嗯對的。沒話說。

現在開始教程:

第一步:

?
1
2
3
準備好你的APP_ID這個東西不解釋了。如果不知道請先去[微信開放平臺](https: //open.weixin.qq.com/) 查看一下注冊你的應用程序。然後登錄功能是收費的,分享是免費的
  下面是註冊應用程序的步驟:
      打開微信開放平臺官網:

第一步

點擊創建應用,按照提示輸入好之後點擊下一步。:
第二步

填寫完了之後就提交審覈,一般的話審覈可能1-3天就好了
第三步

以安卓爲例子,簽名和包名必須要和你要接入的cocos項目的包名和簽名一致,對於簽名的獲取請看下圖:
第四步

打開 Android資源下載之後在右邊下滑找到:
第四步

下載安裝到手機上,我這裏用的模擬器,然後把你們要接入的cocos項目也打包好安裝的手機上之後打開之前安裝的簽名生成工具:
第五步

打開工具之後輸入你的包名:
第六步
這個就是簽名的獲取

應用註冊審覈通過之後開始下一步

第二步:
將你的cocos項目導入到android studio2.3.3,其他環境參照相應的教程導入項目,但是推薦用android studio方便,導入方法如下:
第一步
第二步
第四步

項目導入之後配置一下微信SDK的環境只需要一句話就可以了,但是前提是你電腦能夠聯網下載微信SDK:
第五步

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

接下來就可以開始寫代碼了,首先是Java端的代碼,代碼比較簡單,我也不是很瞭解Java所以我就不逐行解釋了,基本上直接複製就可以使用了。

首先打開這個文件:
第一步

下面是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類,類名也是必須這樣,沒辦法微信的要求,下面是創建的方法:
首先是創建包:
第一步
第二步
包名輸你自己的別輸我演示的這個,然後點擊OK

接下來是創建類:
第三步
類創建的時候在你剛纔新建的包名目錄下右鍵單擊就可以了

記得類名必須是WXEntryActivity!!! 其他的默認就行了

全部創建好之後文件結構是這樣的:
結果

然後雙擊打開,開始寫回調:

下面是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這個類裏面的代碼。這裏面你們要自己創建一個,創建在那個包下面都無所謂:
我是創建在這兒:
JniHelper

下面是代碼

?
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
<!--?xml version= "1.0" encoding= "utf-8" ?-->
<manifest android:installlocation= "auto" package = "com.qt.NiuBuTing" xmlns:android= "https://schemas.android.com/apk/res/android" >
 
     <uses-feature android:glesversion= "0x00020000" >
      <!--這些是微信必須的權限 -->
     <uses-permission android:name= "android.permission.INTERNET" >
     <uses-permission android:name= "android.permission.ACCESS_NETWORK_STATE" >
     <uses-permission android:name= "android.permission.ACCESS_WIFI_STATE" >
     <uses-permission android:name= "android.permission.READ_PHONE_STATE" >
     <uses-permission android:name= "android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >
     <uses-permission android:name= "android.permission.WRITE_EXTERNAL_STORAGE" >
 
     
 
         <!-- Tell Cocos2dxActivity the name of our .so -->
         <meta-data android:name= "android.app.lib_name" android:value= "MyGame" >
 
         
             <intent-filter>
                 
 
                 <category android:name= "android.intent.category.LAUNCHER" >
             </category></action></intent-filter>
         </activity>
 
         <!--註冊微信回調 WXEntryActivity -->
         
 
     </activity></meta-data></application><meta-data android:name= "android.app.lib_name" android:value= "MyGame" ><meta-data android:name= "android.app.lib_name" android:value= "MyGame" >
 
</meta-data></meta-data></uses-permission></uses-permission></uses-permission></uses-permission></uses-permission></uses-permission></uses-feature></manifest>

以上步驟完成了之後就可以還可以在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__</void(std::string>

接下來是.cpp的代碼:

?
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
相關文章
相關標籤/搜索