1. 程式人生 > 程式設計 >使用Android開發接入第三方原生SDK實現微信登入

使用Android開發接入第三方原生SDK實現微信登入

微信開放平臺 : https://open.weixin.qq.com/

一、準備工作 :

1. Android Studio環境下:在build.gradle檔案中,新增如下依賴即可:

dependencies {
 implementation'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
}

2. 在清單檔案AndroidManifest.xml中加入許可權:

<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.WRITE_EXTERNAL_STORAGE"/>

二、接入 :

1. 註冊微信:

想要使我們的程式啟動之後,微信終端可以響應我們我們的程式的話.就必須在程式碼中像微信終端註冊我們的id

(可以在程式的入口Activity的OnCreat中註冊,也可以在MyApplication中,或者是在其他合適的地方將我們的應用id註冊到微信),此處在Application中:

// 1.宣告一個statid的IWXAPI 以及APPID
private static IWXAPI mWxApi;
private String WX_APPID = "";
 
// 2.初始化微信SDK
mWxApi = WXAPIFactory.createWXAPI(this,WX_APPID,true);
mWxApi.registerApp(WX_APPID);

2. 發起登入

if (BaseApplication.mWxApi!= null && BaseApplication.mWxApi.isWXAppInstalled()) {
 final SendAuth.Req req = new SendAuth.Req();
 req.scope = "snsapi_userinfo";
 req.state = "wechat_sdk_fth";
 BaseApplication.mWxApi.sendReq(req);
 } else {
 Toast.makeText(LoginActivity.this,"您還沒有安裝微信",Toast.LENGTH_SHORT).show();
 }

3. 新建一個包 包名為wxapi,新建一個類名為WXEntryActivity的類,這個類名和包名是微信規定的,木有辦法,必須一致了

然後在清單檔案AndroidManifest.xml中宣告該類:

<!-- 註冊微信回撥 WXEntryActivity -->
<activity
 android:name=".wxapi.WXEntryActivity"
 android:configChanges="keyboardHidden|orientation|screenSize"
 android:exported="true"
 android:screenOrientation="portrait"
 android:theme="@style/NoTitleTranslucentTheme">
</activity>

4. WxEntryActivity類程式碼如下:

public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
 
 private Bundle bundle;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 BaseApplication. mIwapi.handleIntent(getIntent(),WXEntryActivity.this); //必須呼叫此句話
 }
 
 @Override
 protected void onNewIntent(Intent intent) {
 super.onNewIntent(intent);
 BaseApplication. mIwapi.handleIntent(intent,WXEntryActivity.this);//必須呼叫此句話
 }
 
 @Override
 public void onReq(BaseReq req) {
 System. out.println();
 }
 
 /**
 * API:https://open.weixin.qq.com/ cgi- bin/showdocument ?action=dir_list&t=resource/res_list&verify=1&id=open1419317853 &lang=zh_CN
 * 在此處得到Code之後呼叫https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code 獲取到token和openID。
 * 之後再呼叫https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID 獲取使用者個人資訊
 */
 @Override
 public void onResp(BaseResp arg0) {
 bundle=getIntent().getExtras();
 SendAuth.Resp resp = new SendAuth.Resp( bundle);
 //獲取到code之後,需要呼叫介面獲取到access_token
 if (resp. errCode == BaseResp.ErrCode. ERR_OK) {
 String code = resp. token;
 if(BaseApplication. isWxLogin){
 getToken(code);
 } else{
 WXEntryActivity. this.finish();
 }
 } else{
 WXEntryActivity. this.finish();
 }
 
 }
 //這個方法會取得accesstoken 和openID
 private void getToken(String code){
 MyProgressDialog. showDialog(WXEntryActivity.this,"登陸","正在獲取使用者資訊" );
 HttpBase. get("https://api.weixin.qq.com/sns/oauth2/access_token?appid=wxd7673d08f6c1963d&secret=223d726f966031f30125d0e4e7d4aed3&code=" +code+"&grant_type=authorization_code",new JsonHttpResponseHandler(){
 @Override
 public void onSuccess( int statusCode,JSONObject response) {
 super.onSuccess(statusCode,response);
 getUserInfo(response.optString( "access_token"),response.optString( "openid"));
 }
 @Override
 public void onFailure( int statusCode,Throwable e,JSONObject errorResponse) {
 // TODO Auto-generated method stub
 super.onFailure(statusCode,e,errorResponse);
 MyProgressDialog. closeDialog();
 }
 });
 }
 
 //獲取到token和openID之後,呼叫此介面得到身份資訊
 private void getUserInfo(String token,String openID){
 HttpBase. get("https://api.weixin.qq.com/sns/userinfo?access_token=" +token+"&openid=" +openID,response);
 try {
  String nickname = response.getString("nickname");//獲取使用者微信名
  String sex = response.getInt("sex") == 1 ? "男" : "女";//獲取使用者性別
  String header = response.getString( "headimgurl");//獲取使用者頭像
 } catch (JSONException e) {
  e.printStackTrace();
 }
 }
 @Override
 public void onFailure( int statusCode,JSONObject errorResponse) {
 super.onFailure(statusCode,errorResponse);
 MyProgressDialog. closeDialog();//隱藏dialog
 HttpBase. onFailureTips(WXEntryActivity.this,errorResponse);
 }
 });
 }
}

到這裡就歐克了!

補充知識:Android接入微信sdk,使用微信授權

接入微信sdk,進行授權,第一個最基本也是最重要的步驟,需要注意應用的包名、應用簽名(如果不知道的可以使用新浪簽名工具檢視,或者微信提供的工具),app id (微信申請成功之後可以獲得) 三者必須要與微信上申請的一致,否者將會無法成功調起微信。

1、在自己的專案上建立一個按鈕

2、新建一個Constans.java的類,存放微信支付相關的引數

public class Constants {

 public static final String APP_ID = "wxxxxxxx"; //替換為申請到的app id

}

3、在MyApplication.java類裡面進行例項化

4、在登入頁面註冊點選事件 , 跳轉微信授

scope 因為是獲取使用者個人資訊所以固定填 snsapi_userinfo

state 可填可不填的引數,按官方建議最好填寫,可用於防止csrf攻擊(跨站請求偽造攻擊)

5、這時候就可以調起微信授權了,但是如果需要得到微信返回的結果,還需要以下的步驟

1)在包名下新增wxapi資料夾(這個資料夾名字是微信官方規定的,必須一致)

2)在wxapi資料夾下新增繼承於Activity並實現IWXAPIEventHandler介面的WXEntryActivity類(這個類名是微信官方規定的,必須一致)

if(baseResp instanceof SendAuth.Resp){

 SendAuth.Resp newResp = (SendAuth.Resp) baseResp;

 //獲取微信傳回的code

 final String code = newResp.code;

}

獲得的code就是微信授權成功後給的臨時票據,可以根據code獲取相關的使用者 access_token 和 openid , 然後根據 access_token 和 openid 獲取使用者資訊

6、在AndroidManifest.xml中對WXEntryActivity進行配置

1)增加許可權

2)增加WXEntryActivity的配置

其中android:exported="true" 必須加上,否則無法接收回調

7、編譯生成執行,即可發起微信登入並得到微信返回。

如果還是不行,注意是否以下問題引起:

1)app id是否正確?

2)包名是否和申請時填寫的一致?

3)應用簽名是否和申請時填寫的一致?(可以用簽名生成工具對比一下)通常可能發生的情況是,申請用的簽名包,除錯用的非簽名包,這種情況很常見。

4)WXEntryActivity.java檔案的位置是否正確

5)AndroidManifest.xml中的配置是否正確?

6)公眾號、移動應用之間統一帳號的話,可利用unionID來滿足需求,因為微信返回的openid是根據app id 進行生成的,這樣就導致瞭如果是H5授權那麼和Android得到的id不一致

最後附上微信開放平臺官方地址:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317851&token=&lang=zh_CN

以上這篇使用Android開發接入第三方原生SDK實現微信登入就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。