【转】微信一次性订阅消息流程

前段时间项目中用到了微信的一次性消息订阅,来引导用户登陆微信关注公众号。一次性消息订阅是指,通过微信用户授权,是的第三方应用获得一次向微信用户发送一次消息通知的机会;微信用户可以不用关注公众号,每授权一次,开发者就可以通过微信下发一次通知消息,消息将显示在微信服务通知中。

像微信下发消息主要分为两个步骤:

第一:微信用户授权,获得一次向用户发送消息的机会。

 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

原文地址:https://www.cnblogs.com/xuan52rock/p/11347198.html