【轉】微信一次性訂閱消息流程


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

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

第一:微信用戶授權,獲得一次向用戶發送消息的機會。

 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發送到自己需要操作的頁面,進行下一步操作;

第二:發送消息給微信用戶;

https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

通過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;
    }
}


記錄一下自己曾經遇到的問題,總結一下,獻給每天進步一點的自己,加油!
from:https://blog.csdn.net/qiaoxiaoguang/article/details/84192491


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM