前段時間項目中用到了微信的一次性消息訂閱,來引導用戶登陸微信關注公眾號。一次性消息訂閱是指,通過微信用戶授權,是的第三方應用獲得一次向微信用戶發送一次消息通知的機會;微信用戶可以不用關注公眾號,每授權一次,開發者就可以通過微信下發一次通知消息,消息將顯示在微信服務通知中。
像微信下發消息主要分為兩個步驟:
第一:微信用戶授權,獲得一次向用戶發送消息的機會。
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