前段时间项目中用到了微信的一次性消息订阅,来引导用户登陆微信关注公众号。一次性消息订阅是指,通过微信用户授权,是的第三方应用获得一次向微信用户发送一次消息通知的机会;微信用户可以不用关注公众号,每授权一次,开发者就可以通过微信下发一次通知消息,消息将显示在微信服务通知中。
像微信下发消息主要分为两个步骤:
第一:微信用户授权,获得一次向用户发送消息的机会。
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;
}
}
记录一下自己曾经遇到的问题,总结一下,献给每天进步一点的自己,加油!