精华内容
下载资源
问答
  • 统一服务消息怎么测试
    千次阅读
    2020-05-12 08:45:23

    经过测试发现是json格式出错。

    公众微信平台下可以找到: 

    入参:{ "touser":"youropenid", "mp_template_msg":{"appid":"服务号APPID","template_id":"服务号模板编号","miniprogram":{"appid":"小程序APPID","page":"/pages/index"}}, "data":{"first":{"value":"催办"},"keyword1":{"value":"D……"},"keyword2":{"value":"2020-05-12"},"remark":{"value":"详情"}}}

    请求:{"errcode":0,"errmsg":"ok"}
     

    更多相关内容
  • 小程序统一服务消息实现

    千次阅读 2019-03-05 20:18:14
    总体思路:运营后台处理某个任务时,推送相关消息到绑定了小程序的微信账户的服务通知里。需要用到用户的openid和用户在小程序中有交互动作产生的formId。 后台表结构设计: 小程序中的代码(taro-ui): &...

    总体思路:运营后台处理某个任务时,推送相关消息到绑定了小程序的微信账户的服务通知里。需要用到用户的openid和用户在小程序中有交互动作产生的formId。

    后台表结构设计:

     

    小程序中的代码(taro-ui):

    <View className="orderInfo">
              <View
                className="infoItem"
                onClick={this.navigateTo.bind(this, '/pages/order/unHandleOrder')}
              >
                <AtForm className="tb-submitForm"
                  onSubmit={this.onSubmit.bind(this)}
                  reportSubmit
                >
                  <AtButton formType='submit'  className="num tb-submitBtn">{orderCount}</AtButton>
                </AtForm>
                <View className="infoTip">处理订单</View>
              </View>
              <View className="vLine" />
              <View className="infoItem" onClick={this.navigateTo.bind(this, '/pages/me/msgCenter')}>
                <AtForm className="tb-submitForm"
                  onSubmit={this.onSubmit.bind(this)}
                  reportSubmit
                >
                  <AtButton formType='submit'  className="num tb-submitBtn">{msgCount}</AtButton>
                </AtForm>
                <View className="infoTip">未读消息</View>
              </View>
            </View>

     

      //表单提交事件,用于采集用户form_id
      onSubmit (event) {
        this.props.dispatch(action('app/updateUserFormId', event.detail.formId));
      }

    app.js:

    *updateUserFormId({ payload }, { select, call, put }) {
          try {
            const wechatId = yield select(state => state.app.openid);
            const formId = payload;
    
            console.log('updateUserFormId print formId : ' + formId);
            console.log('updateUserFormId print wechatId : ' + wechatId);
            const data = {
              urlParms: '/sys/api/v1/user/updateUserFormId',
              bodys: { wechatId, formId },
            };
            const res = yield call(request, data);
            if (res.code == 0) {
              // nothing to do
            } else {
              Taro.showToast({
                title: res.message,
                icon: 'none',
                duration: 2000,
              });
            }
          } catch (e) {
            console.log(e);
          }
        },

    后台代码:

    1)保存formId

    /**
    	 * 更新用户的formId
    	 * @author xxx
    	 * @date 2019-03-05 17:31:57
    	 * @param formId
    	 * @param wechatId
    	 * @return
    	 */
    	@RequestMapping("/updateUserFormId")
    	@ResponseBody
    	@HttpSecurityAnnotation(typeValue = MethodType.USER_SERVICE,openLog=true)
    	public String updateUserFormId(@NotBlank(message="formId不能为空") @Bodys(value="formId")String formId,
                    @NotBlank(message="wechatId不能为空") @Bodys(value="wechatId")String wechatId){
    		try{
    			userService.updateUserFormId(wechatId,formId);
    		}catch(Exception e){
    			log.error("更新用户的formId失败!",e);
    			return JSONUtil.wrapResponse(JSONUtil.ResponseCode.FAILURE,e.getMessage());
    		}
    		return JSONUtil.wrapResponse(JSONUtil.ResponseCode.SUCCESS,"更新用户的formId成功");
    	}

    1)发送模板消息:

    if(addOperation){	//	新增对账单,发送消息到买方微信(拥有对账权限的买方账号)。
    			String open = env.getProperty("wechat.uniformMessage.open","off");
    			if("off".equals(open)){	//发送统一服务消息开关已关闭
    				return;
    			}
    			//小程序跳转页面
    			String page = env.getProperty("wechat.duizhangdan.page","pages/me/index");
    
    			//7天 = 7 * 24 = 168小时,这里去掉1小时。
    			//当前时间往前推167个小时,如果用户的的formId最后更新时间大于这个时间,则说明formId有效。
    			//formId目前有效期微信给出的是7天。
    			Date newDate = DateUtils.addHours(new Date(),-167);
    
    			List<PersonVO> personList = this.userService.getMbrCellphones(ECAuthConstant.BLANACE_ACC, blanace.getBuyerId());
    			if(!personList.isEmpty()){
    				JSONObject data = new JSONObject();
    				SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
    				Map<String,Object> keyMap1 = new HashMap<String,Object>();
    				keyMap1.put("value",blanace.getBuyerName());
    				//添加客户名称
    				data.put("keyword1",keyMap1);
    
    				Map<String,Object> keyMap2 = new HashMap<String,Object>();
    				keyMap2.put("value",blanace.getSellerName());
    				//添加卖方名称
    				data.put("keyword2",keyMap2);
    
    				Map<String,Object> keyMap3 = new HashMap<String,Object>();
    				keyMap3.put("value",blanace.getMonth());
    				//添加对账月份
    				data.put("keyword3",keyMap3);
    
    				Map<String,Object> keyMap4 = new HashMap<String,Object>();
    				keyMap4.put("value",sdf.format(blanace.getCreateTime()));
    				//添加创建时间
    				data.put("keyword4",keyMap4);
    
    				for(PersonVO personVO : personList){
    					if(StringUtils.isEmpty(personVO.getWechatFormId())){
                            logger.warn("用户的微信formId为空,不发送消息!用户名[" + personVO.getPersonName() + "]");
    						continue;
                        }
                        if(personVO.getWechatFormIdModifyTime().before(newDate)){
                            //formId认为无效了,则不用发送了。
                            logger.warn("用户的微信formId时间已失效,不发送消息!用户名[" + personVO.getPersonName() + "]");
                            continue;
    					}
    
    					final UniformMsg uniformMsg = new UniformMsg();
    					uniformMsg.setTouser(personVO.getWechatId());
    					//uniformMsg.setTouser("oZaHr4iznKdHEjGremZZfvPS3X3k");
    					uniformMsg.setForm_id(personVO.getWechatFormId());
    					//uniformMsg.setForm_id("7821c2ceb9e848f1a95a2af8ce5f5a1c");
    					uniformMsg.setTemplate_id(env.getProperty("wechat.duizhangdan.template_id"));
    					uniformMsg.setPage(page); //小程序跳转页面
    					uniformMsg.setData(data);
    					this.taskExecutor.execute(new Runnable() {
    						public void run() {
    							wechatService.sendUniformMessage(uniformMsg);
    						}
    					});
    				}
    			}
    		}

    IWechatService.java:

        @Autowired
        private Environment env;
    
        @Autowired
        private RedisTemplate redisTemplate;
    
        private volatile Boolean init = false;
    
        private String appid;
        private String secret;
    
        //获取微信accessToken接口地址
        private String accessTokenIp;
    
        //获取微信发送统一模板消息接口地址
        private String uniformMessageIp;
    
    
        private void init(){
            init = true;
            appid = env.getProperty("wechat.appid");
            secret = env.getProperty("wechat.secret");
            accessTokenIp = env.getProperty("wechat.accesstoken.ip");
            uniformMessageIp = env.getProperty("wechat.uniformMessage.ip");
        }
    
    
        @Override
        public String getAccessToken() throws Exception{
            if(!init){
                init();
            }
    
            NameValuePair[] nameValuePairs = new NameValuePair[3];
    
            NameValuePair nameValuePair = new NameValuePair();
            nameValuePair.setName("appid");
            nameValuePair.setValue(this.appid);
    
            NameValuePair nameValuePair2 = new NameValuePair();
            nameValuePair2.setName("secret");
            nameValuePair2.setValue(this.secret);
    
            NameValuePair nameValuePair3 = new NameValuePair();
            nameValuePair3.setName("grant_type");
            nameValuePair3.setValue("client_credential");
    
            nameValuePairs[0] = nameValuePair;
            nameValuePairs[1] = nameValuePair2;
            nameValuePairs[2] = nameValuePair3;
    
            HttpClient client = new HttpClient();
            GetMethod method = new GetMethod(this.accessTokenIp);
            method.addRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            method.setQueryString(nameValuePairs);
    
            client.executeMethod(method);
            String retValue = method.getResponseBodyAsString();
            method.releaseConnection();
            JSONObject jsonObject = JSONObject.parseObject(retValue);
            if(jsonObject.get("errcode") != null){
                logger.warn("微信小程序接口,获取accessToken失败,原因:{}",jsonObject.get("errmsg"));
                return null;
            }
            logger.info("打印accessToken jsonObject:{}",jsonObject.toJSONString());
    
            //将微信accessToken放入redis中
            redisTemplate.opsForValue().set("wechatAccessToken",jsonObject.get("access_token"));
            return (String)jsonObject.get("access_token");
        }
    
    
    
        @Override
        public void sendUniformMessage(UniformMsg uniformMsg) {
            if(StringUtils.isEmpty(uniformMessageIp)){
                init();
            }
            Double randomNum = Math.random();
            String redisAccesssToken = (String) redisTemplate.opsForValue().get("wechatAccessToken");
            if(StringUtils.isEmpty(redisAccesssToken)){
                try {
                    this.getAccessToken();
                } catch (Exception e) {
                    logger.error("发送统一模板消息,获取accessToken异常!",e);
                    throw new RuntimeException("发送统一模板消息,获取accessToken异常!");
                }
            }
            redisAccesssToken = (String) redisTemplate.opsForValue().get("wechatAccessToken");
    
            uniformMsg.getWeapp_template_msg().put("template_id",uniformMsg.getTemplate_id());
            uniformMsg.getWeapp_template_msg().put("page",uniformMsg.getPage());
            uniformMsg.getWeapp_template_msg().put("form_id",uniformMsg.getForm_id());
            uniformMsg.getWeapp_template_msg().put("data",uniformMsg.getData());
            uniformMsg.getWeapp_template_msg().put("emphasis_keyword","");
    
            Map<String,Object> submitMap = Maps.newHashMap();
            submitMap.put("touser",uniformMsg.getTouser());
            submitMap.put("weapp_template_msg",uniformMsg.getWeapp_template_msg());
            //请求url
            String postUrl = this.uniformMessageIp + "?access_token=" + redisAccesssToken;
            //执行请求发送
            logger.info("[" + randomNum + "]submitMap:{}", JSON.toJSONString(submitMap));
            String retValue = "";
            try{
                retValue = this.httpsRequest(postUrl,"POST",JSON.toJSONString(submitMap));
            }catch(Exception e){
                logger.error(e.getMessage(),e);
                return;
            }
            logger.info("[" + randomNum + "]打印retValue:{}",retValue);
            logger.info("[" + randomNum + "]打印accessToken:{}",redisAccesssToken);
            //得到返回结果
            JSONObject jsonObject = JSONObject.parseObject(retValue);
            if(jsonObject.get("errcode") != null && (int)jsonObject.get("errcode") != 0){
                logger.warn("[" + randomNum + "]微信小程序接口,发送统一模板消息失败,原因:{}",jsonObject.get("errmsg"));
                if(DJECConstants.WechatUniformMsgErrcodeEnum.ACCESS_TOKEN_INVALID.getCode() == (int)jsonObject.get("errcode")){
                    logger.info("[" + randomNum + "]accessToken失效,重新获取token,再调一次。");
                    try {
                        redisAccesssToken = this.getAccessToken();
                    } catch (Exception e) {
                        logger.error(e.getMessage(),e);
                        return;
                    }
                    postUrl = this.uniformMessageIp + "?access_token=" + redisAccesssToken;
                    try{
                        //retValue = this.doPost(postUrl,JSON.toJSONString(submitMap));
                        retValue = this.httpsRequest(postUrl,"POST",JSON.toJSONString(submitMap));
                    }catch(Exception e){
                        logger.error(e.getMessage(),e);
                        return;
                    }
                    logger.info("[" + randomNum + "]打印retValue(第二次):{}",retValue);
                    //得到返回结果
                    jsonObject = JSONObject.parseObject(retValue);
                    if(jsonObject.get("errcode") != null && (int)jsonObject.get("errcode") !=0) {
                        logger.warn("[" + randomNum + "]微信小程序接口,发送统一模板消息(第二次)失败,原因:{}", jsonObject.get("errmsg"));
                        return;
                    }
                    logger.info("[" + randomNum + "]发送服务消息成功(第二次)。");
                }
                return;
            }
            logger.info("[" + randomNum + "]发送服务消息成功。");
        }
    
        //通用方法,执行请求连接。
        public String httpsRequest(String requestUrl, String requestMethod, String outputStr){
            try {
                URL url = new URL(requestUrl);
                HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
                conn.setDoOutput(true);
                conn.setDoInput(true);
                conn.setUseCaches(false);
                // 设置请求方式(GET/POST)
                conn.setRequestMethod(requestMethod);
                conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");
                // 当outputStr不为null时向输出流写数据
                if (null != outputStr) {
                    OutputStream outputStream = conn.getOutputStream();
                    // 注意编码格式
                    outputStream.write(outputStr.getBytes("UTF-8"));
                    outputStream.close();
                }
                // 从输入流读取返回内容
                InputStream inputStream = conn.getInputStream();
                InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                String str = null;
                StringBuffer buffer = new StringBuffer();
                while ((str = bufferedReader.readLine()) != null) {
                    buffer.append(str);
                }
                // 释放资源
                bufferedReader.close();
                inputStreamReader.close();
                inputStream.close();
                conn.disconnect();
                return buffer.toString();
            } catch (ConnectException ce) {
                logger.error("连接超时:{}",ce);
            } catch (Exception e) {
                logger.error("https请求异常:{}",e);
            }
            return null;
        }

    方法httpsRequest参考了:https://blog.csdn.net/wave_zf/article/details/82463715

    UniformMsg.java:

    import com.alibaba.fastjson.JSONObject;
    
    /**
     * 微信小程序统一发送模板消息对象
     * @author XXXX
     * @date 2019年3月1日 18:14:15
     */
    public class UniformMsg {
    
        /**
         * 微信小程序模板ID
         */
        private String template_id;
    
        /**
         * 微信用户绑定的小程序openid
         */
        private String touser;
    
        /**
         * 跳转至小程序的页面路径
         */
        private String page;
    
        /**
         * 表单提交场景下,为 submit 事件带上的 formId
         */
        private String form_id;
    
        /**
         * 模板需要放大的关键词,不填则默认无放大
         */
        private String emphasis_keyword;
    
        private JSONObject weapp_template_msg = new JSONObject();
    
        private JSONObject data = new JSONObject();
    
        public String getTemplate_id() {
            return template_id;
        }
    
        public void setTemplate_id(String template_id) {
            this.template_id = template_id;
        }
    
        public String getTouser() {
            return touser;
        }
    
        public void setTouser(String touser) {
            this.touser = touser;
        }
    
        public String getPage() {
            return page;
        }
    
        public void setPage(String page) {
            this.page = page;
        }
    
        public String getForm_id() {
            return form_id;
        }
    
        public void setForm_id(String form_id) {
            this.form_id = form_id;
        }
    
        public String getEmphasis_keyword() {
            return emphasis_keyword;
        }
    
        public void setEmphasis_keyword(String emphasis_keyword) {
            this.emphasis_keyword = emphasis_keyword;
        }
    
        public JSONObject getData() {
            return data;
        }
    
        public void setData(JSONObject data) {
            this.data = data;
        }
    
        public JSONObject getWeapp_template_msg() {
            return weapp_template_msg;
        }
    
        public void setWeapp_template_msg(JSONObject weapp_template_msg) {
            this.weapp_template_msg = weapp_template_msg;
        }
    }

    restful工具测试:

     

    request body json结构:

    {
        "touser" : "oZaHr4iznKdHEjGremZZfvPS3X3k",
        "weapp_template_msg" : {
            "data":{
                "keyword1":{
                    "value":"娄底建材工程有限公司"
                },
                "keyword2":{
                    "value":"2019-02"
                }
            },
            "template_id":"mfFyTYNfYJhEOKxbW5hPSYOvlhcztM3qoclq6SHJ04s",
            "form_id" : "70aff62c35a64ece84a281797cad095f",
            "page" : "pages/order/statementAccount"
        }
    }

     

    微信接收效果:

    展开全文
  • Java实现微信统一服务消息

    千次阅读 2018-09-26 17:11:01
    下发小程序和公众号统一的服务消息,官方文档...统一服务消息接口能成功推送小程序模板消息,可以跳转到小程序页面。 统一服务消息接口能成功推送公众号模板消息,但是跳转小程序目前不行。经测试minipr...

    下发小程序和公众号统一的服务消息,官方文档https://developers.weixin.qq.com/miniprogram/dev/api/open-api/uniform-message/sendUniformMessage.html

    统一服务消息接口能成功推送小程序模板消息,可以跳转到小程序页面。

    统一服务消息接口能成功推送公众号模板消息,但是跳转小程序目前不行。经测试miniprogram本应该跳转到小程序页面,但未生效,而url跳转网页是可以的。有详情的为添加了url的,无详情的为未添加url只有miniprogram的。官方文档写到的参数都是必填,其实urlminiprogram都不是必填项,可参考服务号的模板消息与小程序的模板消息。

    下面是小程序模板消息效果,通过服务通知发送

    /**
    	 * 统一服务消息
    	 * 小程序模板消息,发送服务通知
    	 * @param token 小程序ACCESS_TOKEN
    	 * @param touser 用户openid,可以是小程序的openid,也可以是公众号的openid
    	 * @param template_id 小程序模板消息模板id
    	 * @param page 小程序页面路径
    	 * @param formid 小程序模板消息formid
    	 * @param data 小程序模板消息formid
    	 * @param emphasis_keyword 小程序模板放大关键词
    	 * @return
    	 * @author HGL
    	 */
    	public static JSONObject sendWeappMessage(String token,String touser,String template_id,
    			String page,String formid,JSONObject data){
    		JSONObject obj = new JSONObject();
    		JSONObject weapp_template_msg = new JSONObject();
    		JSONObject result = new JSONObject();
    		try {
    			String url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token="+token;
    			obj.put("touser", touser);
    			weapp_template_msg.put("template_id", template_id);
    			weapp_template_msg.put("page", page);
    			weapp_template_msg.put("form_id", formid);
    			weapp_template_msg.put("data", data);
    			weapp_template_msg.put("emphasis_keyword", data.getJSONObject("keyword1").getString("value"));
    			obj.put("weapp_template_msg", weapp_template_msg);
    			result = HttpClientUtil.Post(url, obj);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return result;
    	}
    	
    	/**
    	 * 统一服务消息
    	 * 公众号模板消息,发送公众号通知
    	 * @param token 小程序ACCESS_TOKEN
    	 * @param touser 用户openid,可以是小程序的openid,也可以是公众号的openid
    	 * @param appid 公众号appid
    	 * @param template_id 公众号模板消息模板id
    	 * @param url 公众号模板消息所要跳转的url
    	 * @param weappid 公众号模板消息所要跳转的小程序appid,小程序的必须与公众号具有绑定关系
    	 * @param pagepath 公众号模板消息所要跳转的小程序页面
    	 * @param data 公众号模板消息的数据
    	 * @return
    	 * @author HGL
    	 */
    	public static JSONObject sendMpMessage(String token,String touser,String appid,
    			String template_id,String url,String weappid,String pagepath,JSONObject data){
    		JSONObject result = new JSONObject();
    		JSONObject obj = new JSONObject();
    		JSONObject mp_template_msg = new JSONObject();
    		JSONObject miniprogram = new JSONObject();
    		try {
    			String path = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token="+token;
    			obj.put("touser", touser);
    			mp_template_msg.put("appid",appid);
    			mp_template_msg.put("template_id", template_id);
    			mp_template_msg.put("url",url);
    			miniprogram.put("appid", weappid);
    			miniprogram.put("pagepath", pagepath);
    			mp_template_msg.put("miniprogram", miniprogram);
    			mp_template_msg.put("data", data);
    			obj.put("mp_template_msg", mp_template_msg);
    			result = HttpClientUtil.Post(path, obj);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return result;
    	}

     

    HttpClientUtil

    package com.fh.util;
    
    import java.io.IOException;
    
    import net.sf.json.JSONObject;
    
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.config.RequestConfig;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.util.EntityUtils;
    
    public class HttpClientUtil {
    	
    	/**
    	 * 
    	 * @param url
    	 * @param jsonObj
    	 * @return
    	 * @throws ClientProtocolException
    	 * @throws IOException
    	 */
    	public static JSONObject Post(String url,JSONObject jsonObj) throws ClientProtocolException, IOException{
    		HttpPost httpPost = new HttpPost(url); 
    		StringEntity entity = new StringEntity(jsonObj.toString(), "utf-8");
    		entity.setContentEncoding("UTF-8");
    		entity.setContentType("application/json");
    		httpPost.setEntity(entity);
    		DefaultHttpClient httpClient = new DefaultHttpClient();
    		HttpResponse response=httpClient.execute(httpPost);
    		String result = EntityUtils.toString(response.getEntity(), "UTF-8");
    		//输出调用结果
    		if(response != null && response.getStatusLine().getStatusCode() == 200) { 
    			// 生成 JSON 对象
    			JSONObject obj = JSONObject.fromObject(result);
    			return obj;
    		}
    		return null;
    		
    	}
    }
    

     

    展开全文
  • 注意:新发布的小程序不在支持统一服务消息,需要使用订阅消息功能 小程序模板消息接口将于2020年1月10日下线,开发者可使用订阅消息功能 1。获取模板id 首先要公众平台 登录上小程序管理平台 找到订阅消息》 ...

    注意:新发布的小程序不在支持统一服务消息,需要使用订阅消息功能

    小程序模板消息接口将于2020年1月10日下线,开发者可使用订阅消息功能

     

    1。获取模板id

    首先要公众平台 登录上小程序管理平台

    找到订阅消息》 添加我的模

     

    添加一个 获取到模板id

    如: -QQQNKEVORnwRUmwotyQQoZ_ObaSjkA44Qfn6AtIJUx

    2 ,授权

    https://developers.weixin.qq.com/miniprogram/dev/api/open-api/subscribe-message/wx.requestSubscribeMessage.html

    通过微信 api wx.requestSubscribeMessage(Object object)

    用户授权模板可以推送消息

     

    3 .服务端发送模板消息

    subscribeMessage.send

    https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html

     

     

    # todo 获取access_token

    def get_token():

    # APPID, SECRET = 'wx8fe512646732596d', '8725fc1e12b9750e3c90a38d3201dec2'

    url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={}&secret={}'.format(APPID,

    SECRET)

    respon = requests.get(url)

    content = respon.content

     

    content = content.decode('utf-8')

    data = json.loads(content)

    return data.get("access_token")

     

     

    # 微信模板

    MessageTemplates = ["-QQQNKEVORnwRUmwotyQQoZ_ObaSjkA44Qfn6AtIJUg",]

     

    def subscribeMessage_send(touser,template_id=MessageTemplates[0],json_data=None,page=None):

    """订阅消息发送服务消息"""

    # https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html#HTTPS%20调用

    token = get_token()

    if not token:

    return False

    url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token={}".format(token)

     

    data = {}

    data["touser"] = touser

    data["template_id"] = template_id

    data["miniprogram_state"] = "formal"

     

    if page:

    data["page"] = page

     

    data["data"] = json_data

    try:

    response = requests.post(url,json=data,)

    content = response.content.decode('utf-8')

    data = json.loads(content)

    print(data)

    return data

    except Exception as e:

    return {'errcode': 2, 'errmsg': '通信失败'}

     

    测试:

     

    json_data= {

    "thing1": {

    "value": "339208499"

    },

    "thing2": {

    "value": "TIT创意园"

    },

    "date3": {

    "value": "2015年01月05日"

    }}

    subscribeMessage_send("o_Ezd4km_mrPxdMJ19ff0oU8ASuA", template_id=MessageTemplates[0], json_data=json_data, page="pages/today/today")

     

     

    展开全文
  • 它指定了通用服务,它允许诊断测试程序(客户端)停止或恢复数据链路上的非诊断消息传输。 ISO 14229的本部分不适用于两个电子控制单元之间的车辆通信数据链路上的非诊断消息传输。 然而, ISO 14229的这部分内容并...
  • 工信部统一 Android 消息推送标准

    千次阅读 2019-06-25 14:54:45
    目录 一、介绍 二、推送技术发展 1、轮询方式 2、SMS短信推送方式 ...联盟核心任务是:探索推送行业创新,促进终端生产厂商、应用开发厂商和第三方服务提供商等进行深入合作,整合行业资源,助推形成统...
  • Spring Boot消息服务

    千次阅读 2021-10-22 16:01:12
    Spring Boot消息服务 在实际项目开发中,有时候需要与其他系统进行集成完成相关业务功能,这种情况最原始的做法是程序内部相互调用,除此之外,还可以使用消息服务中间件进行业务处理,使用消息服务中间件处理业务...
  • 开发微信公众号的时候,我们经常会使用微信公众平台的测试号来进行调试,因为测试号的可用接口比较全,不然只有经过认证的服务号才可以调用比较高级的接口。 从开始搞一个微信公众平台测试号开始。 打开微信公众平台...
  • 在做服务类小程序时,通常会遇到客户在客户端下单后,接单商家需要有新订单消息提醒的功能。由于小程序模板消息已下线无法使用,而小程序中的订阅消息需要...因此最终选择的方案为统一服务消息uniformMessage.send。
  • 前言 阿里的短信服务分为三块,一是阿里云短信服务,二是云通讯,三是阿里大于,不过后期都会统一到阿里云短信服务平台的,所以这里只需要学习如何使用阿里云短信服务就可以了。 如果是个人开发者,项目呢还没上线,...
  • 最近做了个需求要求对接微信公众号,使用模板进行消息推送,今天抽时间总结一下相关的逻辑。 大概逻辑分为四个步骤: 获取微信调用接口凭证access_token。 获取微信模板列表。 使用模板进行消息推送。 公众号...
  • 文章目录Pre演进过程版本V1版本2Step1 约定统一返回格式Step2 开发统一返回对象Step3 约定接口状态码Step4 验证Step5 完善全局异常处理 @RestControllerAdvice + @ExceptionHandler版本3 (ResponseBodyAdvice)...
  • 微信小程序模板消息测试- formId 的获取 找到官方文档中 form 组件的位置: 点击“在开发工具预览” 选中 index 文件夹,右键,选择“磁盘打开”。把这个index文件夹拷贝出来并重命名为 formtest,同时把...
  • springboot 定义统一返回结果

    千次阅读 2020-09-03 16:32:15
    前后端分离项目中后端开发需要写相应的接口,定义统一的返回格式有利于提高开发效率和沟通的成本。通常返回的格式主要如下两种: ##### 1. 只返回相应的状态,格式如下: ``` { "code": "200", "msg": "SUCCESS" ...
  • 软件测试之——性能测试

    万次阅读 2021-10-25 19:24:35
    性能测试的定义 性能测试的定义:通过自动化测试工具或者代码手段,来模拟正常、峰值负载访问被测系统,来观测系统各项性能指标是否合格的过程。 性能测试的分类 基于代码的性能测试(关注点是函数或方法...
  • 整理自翟佳在 QCon2018 北京站的演讲,在本次演讲中,翟佳介绍了 Apache Pulsar 的架构、特性和其生态系统的组成,并展示了 Apache Pulsar 在消息、计算和存储三个方面进行的协调、抽象和统一。 - Messaging:...
  • --易于测试 --易于部署 存在的问题: --代码耦合,开发维护困难,提交代码频繁出现大量冲突 --主要业务和次要业务耦合,无法针对不同模块进行针对性优化 --单点容错率低,并发能力差,无法水平扩展 --技术选型...
  • redis消息队列性能测试及知识点整理

    万次阅读 2016-08-22 09:47:51
    消息队列性能测试 发送测试 接收测试 结论与比较 四.健壮性 持久化方案 RDB方式 AOF方式 优缺点 主从复制 原理 特点 配置 集群方案 一.概述 Redis是一个开源(BSD许可),内存存储的数据...
  • Android测试点和测试工具介绍

    千次阅读 2021-11-04 15:41:04
    1.测试点 2. 缓存 2.1 什么是缓存 2.2 缓存管理的适用环境 3. 适配测试 3.1 为什么需要做适配测试 3.2 适配测试的基础测试点 3.3 适配测试的方法 4.云测试 4.1 为什么需要云测试 4.2 云测试的基本流程 ...
  • SpringBoot全局异常统一处理

    千次阅读 2020-08-13 22:31:04
    文章目录1.SpringBoot默认错误统一处理机制2.全局异常统一处理3.自定义SpringBoot错误统一处理3.1 继承AbstractErrorController类3.2 实现ErrorController接口4.Filter过滤器中特殊情况下的错误处理 1.SpringBoot...
  • WebRTC Demo(测试通过)

    千次下载 热门讨论 2014-12-17 16:21:43
    上传了我本人测试通过的WebRTC Demo
  • 初识emqx消息服务器

    千次阅读 2019-04-16 18:15:17
    EMQ X R3.0 (Erlang/Enterprise/Elastic ...MQTT是一个由IBM主导开发的物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。它的核心设计...
  • Kafka、RabbitMQ、RocketMQ等 消息中间件 介绍和对比

    万次阅读 多人点赞 2019-09-05 17:59:00
    文章目录1、前言2、概念2.1、MQ简介2.2、...3.1、Kafka3.2、RabbitMQ3.3、RocketMQ4、测试4.1、测试目的4.2、测试场景4.2.1、Kafka4.2.2、RocketMQ4.2.3、RabbitMQ4.3、测试结论5、消息队列优点对比5.1、各个消息队...
  • 某型车载导航软件测试

    千次阅读 2020-02-21 11:08:05
    1.设备组成 ETst_USB系统主要由硬件部分与软件部分组成。硬件部分包括1553B板卡、RS232/422/485板卡、CAN...软件部分由测试设计软件模块、测试执行服务软件模块、测试执行客户端软件模块、设备资源管理软件模块等主...
  • 接口测试基础

    千次阅读 2021-09-24 08:58:05
    接口测试基础
  • 接口:系统与系统之间,组件与组件之间实现数据交互、传递的通道 接口类型:硬件接口和软件接口 ...接口测试:对系统或者组件之间的接口进行测试,校验传递数据正确性和逻辑依赖关系的正确性。 接口测试...
  • 前言:相信很多刚刚步入测试行业的小伙伴对于APP测试不是很熟悉,这次我为大家提供一篇宝藏文章,希望大家喜欢,谢谢! 一、APP测试基本流程 1、流程图 2、测试周期 测试周期可按项目的开发周期来确定测试时间,...
  • 移动端测试环境配置

    千次阅读 2022-01-11 20:35:59
    手机端常规测试 对于手机端测试,按照平台来分,分为Android和IOS两大主流系统, ...Android开源导致碎片化比较严重,(手机品牌众多,系统版本各异,分辨率不统一,主流手机型号上千。无法保.
  • 软件测试面试题整理(二)之测试用例集

    千次阅读 多人点赞 2020-11-02 22:13:58
    界面布局合理、风格统一、界面文字简洁好理解、没有错别字 性能测试: 打开登录页面需要几秒、点击登录跳转首页需要几秒、多次点击、多人点击 安全性: 用户名和密码是否加密发送给服务器、错误登录的次数限制...
  • 测试基础-面试

    千次阅读 2021-09-08 13:00:50
    非功能测试又可以分为性能测试、压力测试、容量测试、 健壮性测试、安全性测试、可靠性测试、恢复性测试、备份测试、协议测试、兼容性测试、可用 性测试、配置测试、GUI 测试。 2.如何写测试用例 测试用例是为了实施...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 123,357
精华内容 49,342
关键字:

统一服务消息怎么测试