【转】微信一次性订阅消息流程
前段時間項目中用到了微信的一次性消息訂閱,來引導用戶登陸微信關注公眾號。一次性消息訂閱是指,通過微信用戶授權,是的第三方應用獲得一次向微信用戶發送一次消息通知的機會;微信用戶可以不用關注公眾號,每授權一次,開發者就可以通過微信下發一次通知消息,消息將顯示在微信服務通知中。
像微信下發消息主要分為兩個步驟:
第一:微信用戶授權,獲得一次向用戶發送消息的機會。
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
總結
以上是生活随笔為你收集整理的【转】微信一次性订阅消息流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 宝可梦传说阿尔宙斯梦天连战触发方法梦天连
- 下一篇: 坦克世界浅谈实际作战中TD的职责