1. 程式人生 > >微信一次性訂閱訊息流程

微信一次性訂閱訊息流程

前段時間專案中用到了微信的一次性訊息訂閱,來引導使用者登陸微信關注公眾號。一次性訊息訂閱是指,通過微信使用者授權,是的第三方應用獲得一次向微信使用者傳送一次訊息通知的機會;微信使用者可以不用關注公眾號,每授權一次,開發者就可以通過微信下發一次通知訊息,訊息將顯示在微信服務通知中。

像微信下發訊息主要分為兩個步驟:

第一:微信使用者授權,獲得一次向用戶傳送訊息的機會。

 Random random = new Random();
 scene = random.nextInt(10000);
 if (WXUtil.isWeixinAvilible(FreeLearnActivity.this)){
       SubscribeMessage.Req req = new SubscribeMessage.Req();
       req.scene = scene;
       req.templateID = NeoConstantCode.WX_MODEL_ID;
       iwxapi.sendReq(req);
  }else{
       showToastMes("沒有安裝微信");
  }

引數scene:開發者可以填寫0-10000之間的整形數,用來標識訂閱場值;

       templateID:訂閱訊息模板id,在開放平臺提交應用稽核通過後獲得;

       以上兩個引數是授權請求時必須要傳的引數,授權成功後,會返回使用者的openid等資訊,在授權完成後,返回的資訊需要在WXEntryActivity的onResp方法中回撥:

@Override
public void onResp(BaseResp baseResp) {
    super.onResp(baseResp);
    if (baseResp.errCode == BaseResp.ErrCode.ERR_OK){
        if (ConstantsAPI.COMMAND_SUBSCRIBE_MESSAGE == baseResp.getType()){
            Intent intent = new Intent(NeoConstantCode.REFRESH_FREELEARN);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            if (android.os.Build.VERSION.SDK_INT >= 12) {
                intent.setFlags(32 );
            }
            intent.putExtra("openid",baseResp.openId);
            NeoApplication.getContext().sendBroadcast(intent);
        }
    }
    finish();
}

對於回到資訊的接收,初寫的時候遇到 了一個小坑,就是授權完成以後,onResp()方法並沒有接收到任何訊息,當然,有人說要在onCreat方法中

iwxapi = WXAPIFactory.createWXAPI(FreeLearnActivity.this,NeoConstantCode.WX_APP_ID);
iwxapi.registerApp(NeoConstantCode.WX_APP_ID);
iwxapi.handleIntent(getIntent(),this);

但是在此要注意,一不留神就會掉入坑中,對於WXEntryActivity微信文件中說繼承自Activity,實現IWXAPIEventHandler;然後在onResp()方法中回撥資訊,但是一般工程會接入友盟等三方工具,像友盟,他們繼承自WXCallBackActivity(),已經封裝了微信文件中所說的配置,所以在接入了友盟之後,我們只需要重寫onResp()即可,一定不要忘記super.onResp(),如此即可接收到回撥資訊;當然有一點,微信opensdk接入需要5.1.6版本之後才行,否則會有respType = null的問題,在5.1.6版本後修復了這個bug;接收到回撥訊息後可以將openid傳送到自己需要操作的頁面,進行下一步操作;

第二:傳送訊息給微信使用者;

通過get請求上面介面獲得access_token,當然,如文件所說,access_token建議儲存在伺服器,不建議前端請求,因為該欄位每天請求次數有上限,使用者每請求一次就會重新整理一次,如果達到上限,將影響app使用;後臺可以通過介面下下發該欄位到前端;拿到access_token以後呼叫以下介面

http請求方式: post
https://api.weixin.qq.com/cgi-bin/message/template/subscribe?access_token=ACCESS_TOKEN

成功以後使用者即可在微信收到一條服務通知,通知的內容通過介面的引數設定;至此,一次傳送訊息的流程完整結束;

小記:一次性訊息授權後無法像分享那樣返回自己的app,我在專案中用的方法是將後臺執行的應用切換到前臺,程式碼如下,記錄一下:

/**獲取ActivityManager*/
ActivityManager activityManager = (ActivityManager) context.getSystemService(ACTIVITY_SERVICE);
/**獲得當前執行的task(任務)*/
List<ActivityManager.RunningTaskInfo> taskInfoList = activityManager.getRunningTasks(100);
for (ActivityManager.RunningTaskInfo taskInfo : taskInfoList) {
    /**找到本應用的 task,並將它切換到前臺*/
    if (taskInfo.topActivity.getPackageName().equals(context.getPackageName())) {
        activityManager.moveTaskToFront(taskInfo.id, 0);
        break;
    }
}

記錄一下自己曾經遇到的問題,總結一下,獻給每天進步一點的自己,加油!