微信テンプレートメッセージ送信


開発プロセス全体で、私は「簡書」で完全な開発プロセスを見ました.
https://www.jianshu.com/p/eb0e9c4dcdfe
WeChatの公式インタフェースは次のとおりです.
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277
自己開発でまとめてみましたが、以下のようにして、後続の調査に便利です.
1微信のテンプレートメッセージは、実は微信の公衆番号にユーザーにプッシュされたメッセージ記録である.
開発時には、ユーザのopenId(ユーザが公衆番号に注目すると一意のopenIdが生成される)を取得し、openIdによって対応するユーザにプッシュすることで、ユーザがこのメッセージを受信できるようにする必要がある.
②サブスクリプション番号は、「テンプレートメッセージ」のインタフェース権限を取得するためにサービス番号にアップグレードする必要があり、認証を取得する必要があります.(サービス番号接続機能はもっと多いですが、群発メッセージは購読番号の毎日1本から1ヶ月4本になりました.)
③テンプレートメッセージを開設する際には、2つの業界を選択し、毎月1回しか修正できません.テンプレートを検索して、汎用テンプレートを直接使用することができます.カスタムテンプレートが必要な場合は、自分で申請する必要があります.
④微信公衆番号のtokenIdは、有効期間が2時間しかないので、タイマーで1時間50分ごとに取得するとともに、プログラムの起動が完了した後に取得する必要があります.
⑤システムユーザ登録時にオープンIDがあるか否かを判断し、ない場合はオープンIDを取得する.(我々OAシステムは微信公衆番号に開発されているので、ユーザーがシステムに登録する前から公衆番号に注目していました)
ログインインタフェースの呼び出しに成功した後、トップページインタフェースを呼び出し、インタフェースでopenIdがないと判断したら、Aインタフェース(微信が必要とするインタフェースからopenIdを取得し、テーブルに格納する)にジャンプし、Aインタフェースは最後に再びトップページを要求し、この時すでにOpenIdがあったので、トップページの内容を直接展示する.
          :
①          loginController  login_login_wechat
     weixin_index

 /**      ·   
	 * @param changeMenu:      
	 * @return
	 */
	@RequestMapping(value="/weixin_index")
	public ModelAndView login_weixin_index(HttpServletRequest request,HttpServletResponse response){
		ModelAndView mv = this.getModelAndView();
		PageData pd = new PageData();
		pd = this.getPageData();
		try{
			Session session = Jurisdiction.getSession();
			User user = (User)session.getAttribute(Const.sessionUser);				//  session      (      )
			if (user != null && user.getRole()!=null && !user.getRole().getRights().trim().equals("")) {
				session.setAttribute(Const.sessionUserName, user.getUserName());				//      session
				this.getRemortIP(user.getUserName());	//    IP
				mv.setViewName("weixin/index/main");
				mv.addObject("user", user);
				
				/*
				 *    ,  openId  ,   openId      TODO
				 */
//				String weixinOpenId = user.getWeixinOpenId();
//				if(Tools.isEmpty(weixinOpenId)){
//					String ssString = WechatUtils.getUserAuthURL(true,
//							weixinConstant.wReturnPrefix + request.getContextPath()
//							+ "/wechatLoginNoOpenId.do","0");
//					response.sendRedirect(ssString);
//				}
				
				//     ·     
				String userId = user.getId();
				List todoList  = new ArrayList<>();
				//     
 				
			}else {
				mv.setViewName("weixin/index/login");//session         
			}
		} catch(Exception e){
			mv.setViewName("weixin/index/login");
			logger.error(e.getMessage(), e);
		}
		
		mv.addObject("pd",pd);
		return mv;
	}



/**
	 *     ,  openId
	 * @return
	 */
	@RequestMapping(value="/wechatLoginNoOpenId")
	@ResponseBody
	public void wechatLoginNoOpenId(HttpServletRequest request,HttpServletResponse response){
		try {
			String code = ServletRequestUtils.getStringParameter(request, "code");
			String result = WechatUtils.getUserOpenId(code);
			if (result != null) {
				JSONObject jSONObject = JSONObject.fromObject(result);
				String openId = jSONObject.getString("openid");
				System.err.println("======================          openId:"+openId);
				User user =(User)Jurisdiction.getSession().getAttribute(Const.sessionUser);
				user.setWeixinOpenId(openId);
				userService.editU(user);
				//        ,  openId           
				response.sendRedirect(weixinConstant.wReturnPrefix + request.getContextPath()
				+ "/weixin_index.do");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

web.xml  
              tokenId。

  
  


         ,    InformController.java   goSend  

 WechatUtils.java   main  。

すべてのカンマをセミコロンに置換
"lijianbo,yangmi,li".replace(/,/g, ";" );