精华内容
下载资源
问答
  • 小程序通知消息推送

    千次阅读 2018-05-01 21:10:14
    最近公司在搞微信小程序:抽奖小程序,打卡小程序;...小程序的前端编写下一篇文章再写,这篇文章主要介绍小程序通知消息推送的实现; 大家可以去看小程序的官方文档: https://developers.weixin.qq.com/mini...

    最近公司在搞微信小程序:抽奖小程序,打卡小程序;自己作为项目的负责人随时跟踪进度,小程序的前端参与写了一点点2,3个简单的页面,后台系统的搭建和开发我来搞等,感觉微信小程序的前端页面等很想vue,标签和绑定等;小程序的前端编写下一篇文章再写,这篇文章主要介绍小程序的通知消息推送的实现;

    大家可以去看小程序的官方文档:

    https://developers.weixin.qq.com/miniprogram/dev/api/notice.html#%E6%A8%A1%E7%89%88%E6%B6%88%E6%81%AF%E7%AE%A1%E7%90%86

    我们先看效果:


     

    这是在微信小程序里申请的相关配置


     申请结果:

     



     这是申请需要填写的参数



     

    这是文档提供的消息模板 示例

     好了,那我们看一下如何实现:

    第一步:配置参数,如APPID,接收用户openID,appsec,模板IDtemplateid(微信里申请),url(点击消息调到小程序那个页面),form_id(前端给每次都不一样,微信防止滥发消息默认用户点击才发)等;

    第二步:获取getAccessToken;

    第三步:请求微信消息发送接口;

    很简单吧,加公众号后台申请模板ID我用了3小时,调通;代码没怎么整理,明天上班去整理一下

     

    下面是代码;

    <?php

    class IndexAction {

        private $appid;

        private $appsec;

        private $templateid;

        private $url;

        function __construct(){

            

            $this->appid = 'wxcxxxxxxxxxxxxxxxxxxxxxxxxx;

            $this->appsec = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

            

            $this->templateid = 'xxxxxxxxxxxxxxxxxxxxxx'; //微信公众号后台申请

            $this->url = '/pages/award-detail/award-detail?id=31'; //跳转地址

        }

     

        public function index()

        {

            $access_token = S("token");  //微信说7200有效,加个缓存避免频繁请求

            if(!$token){

                $access_token = $this->getAccessToken();

                S("token",$access_token,7200);

            }

          

            $data=[

                'touser'=> 'ocsi84gKLeAQj_jgNfjXxQRJnUHYKL', //陈海波 openid

                'template_id'=> $this->templateid,

                'page'=> $this->url,

                'form_id'=> 'e235b9dfbd7b156ee16b5347e912e3f6j9k7',  //前端每次点击都不一样

                'topcolor'=>"#FF0000",

                'data'=>array(

                    'keyword1'=>array('value'=>'键盘',"color"=>"#173177"),

                    'keyword2'=>array('value'=>'上海xx抽检之键盘抽检开奖通知',"color"=>"#173177")

                )

            ];

            //http请求微信发送接口

            $result = $this->curl_post_send_information($access_token,json_encode($data));

            

            dump($result);die;

        }

        

        

        // 获取 access_token

        private function getAccessToken(){

            

            $appid = $this->appid;

            $appsec = $this->appsec;

            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$appsec}";

            //$raw = curl_get($url);

            $raw = $this->curl_get_https($url);

            if(strlen($raw)>0){

                $data = json_decode($raw,true);

                if(json_last_error()==JSON_ERROR_NONE){

                    if(key_exists('access_token',$data)){

                        return $data['access_token'];

                    }else{

                        return false;

                    }

                }else{

                    return false;

                }

            }else{

                return false;

            }

        }

     

        //curl  get会话

        private function curl_get_https($url){

            $curl = curl_init(); // 启动一个CURL会话

            curl_setopt($curl, CURLOPT_URL, $url);

            curl_setopt($curl, CURLOPT_HEADER, 0);

            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查

            curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);  // 从证书中检查SSL加密算法是否存在

            $tmpInfo = curl_exec($curl);     //返回api的json对象

            //关闭URL请求

            curl_close($curl);

            return $tmpInfo;    //返回json对象

        }

        

        private function curl_post_send_information( $token,$vars,$second=120,$aHeader=array())  

        {  

            $ch = curl_init();  

            //超时时间  

            curl_setopt($ch,CURLOPT_TIMEOUT,$second);  

            curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);  

            //这里设置代理,如果有的话  

            curl_setopt($ch,CURLOPT_URL,'https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token='.$token);  

            curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);  

            curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);

            if( count($aHeader) >= 1 ){  

                curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);  

            }

            curl_setopt($ch,CURLOPT_POST, 1);  

            curl_setopt($ch,CURLOPT_POSTFIELDS,$vars);  

            $data = curl_exec($ch);  

            if($data){  

                curl_close($ch);  

                return $data;  

            }  

            else {  

                $error = curl_errno($ch);  

                curl_close($ch);  

                return $error;  

            }  

        }  

    }

    有一个比较啃爹的问题就是,只能发一个消息,多个用户需要在外面加个foreach,比较蛋疼,之前做过APP的极光推送就比较好(单发,群组发,全体通知发),大家可以去微信公众号API里看看,还是有很多有用的接口和文档的什么获取系统信息用户信息等

     

     

     

    展开全文
  • }, /** 关闭顶部通知 */ closeMsg(){ this.setData({ isHiddenMsg: true}); clearInterval(interval); }, /** 获取滚动条基本信息 */ topScroll(){ var that = this; var query = wx.createSelectorQuery(); //选择...

    先呈上效果图

    在这里插入图片描述
    滚动速度可调节,右侧关闭按钮可关闭。

    主要代码

    //wxml部分
    <view class="scroll-top" hidden="{{isHiddenMsg}}">
      <scroll-view>
        <view class="msg-icon notice-icon">
          <image src="../../../static/images/show-info/msg.png"></image>
        </view>
        <view class="scrollbar" style="transform: translateX(-{{distance}}px)">
          <text style="margin-right:{{space}}px;"></text>
          <text id="mjltest">{{announcementText}}</text>
          <text style="margin-right:{{space}}px;"></text>
          <text>{{announcementText}}</text>
        </view>
        <view class="msg-icon close-icon" catchtap="closeMsg">
          <image src="../../../static/images/show-info/close.png"></image>
        </view>
      </scroll-view>
    </view>
    //wxss部分
    /* 文字滚动 */
    .scroll-top{
      background-color: #fffbd6;
      position: fixed;
      z-index: 2;
    }
    .msg-icon{
      display: inline-block;
      width: 70rpx;
      background-color: #fffbd6;
      z-index: 2;
      text-align: center;
    }
    .notice-icon{
      position: absolute;
      left: 0;
      top: 16rpx;
    }
    .close-icon{
      position: absolute;
      left: 680rpx;
      top:16rpx;
      padding-right: 16rpx;
    }
    .msg-icon>image{
      width: 48rpx;
      height: 48rpx;  
    }
    .weui-label,.weui-input,.weui-select,.check-info-btn{
      font-size: 30rpx;
    }
    
    .scrollbar{  
      color: #e0620d;
      white-space: nowrap;
      font-size: 14px;
      height: 80rpx;
      line-height: 80rpx;
    }
    //js部分
    var interval;
    data: {
    	isHiddenMsg: false,
        announcementText: "在三证合一期间,企业税号大量变更,请自行核实开票信息,避免废票!",
        //滚动速度
        step: 1,
        //初始滚动距离
        distance: 0, 
        space: 30,
        // 时间间隔
        interval: 20, 
    }
    onLoad(){
    	this.topScroll();
    },
    
    /** 关闭顶部通知 */
      closeMsg(){
        this.setData({ isHiddenMsg: true});
        clearInterval(interval);
      },
      
     /** 获取滚动条基本信息 */
      topScroll(){
        var that = this;
        var query = wx.createSelectorQuery();
        //选择id
        query.select('#mjltest').boundingClientRect()
        query.exec(function (res) {
          var length = res[0].width;
          var windowWidth = wx.getSystemInfoSync().windowWidth; // 屏幕宽度
    
          that.setData({
            length: length,
            windowWidth: windowWidth,
            space: windowWidth
          });
          that.scrollling(); // 第一个字消失后立即从右边出现
        });
      },
      /** 向左滚动 */
      scrollling: function () {
        var that = this;
        var length = that.data.length; //滚动文字的宽度
        var windowWidth = that.data.windowWidth; //屏幕宽度
        let interval = setInterval(function () {
          var maxscrollwidth = length + that.data.space;
          var left = that.data.distance;
          if (left < maxscrollwidth) { //判断是否滚动到最大宽度
            that.setData({
              distance: left + that.data.step
            })
          } else {
            that.setData({
              distance: 0 // 直接重新滚动
            });
            clearInterval(interval);
            that.scrollling();
          }
        }, that.data.interval);
      },
    

    如果您有更好的思路,欢迎分享和交流。

    注:本文是从另一个博主稍加修改,原文地址忘记了,在此 就不注明了

    展开全文
  • 微信小程序 服务通知

    千次阅读 2019-08-27 14:45:22
    前言 实现效果 实现必要 一个微信小程序,去微信申请就可以,测试号也是可以的 代码实现 总结

    前言

    实现效果

    在这里插入图片描述

    实现必要

    1. 一个微信小程序,去微信申请就可以,测试号也是可以的
    2. 小程序里面去申请一个模板消息
    3. 在这里插入图片描述

    代码实现

    下面代码没有问题,这是我项目当中截取的部分。下面代码是我项目中直接复制过来的。仅供参考。具体实现代码在最底下

    
    import com.alibaba.fastjson.JSON;
    import com.example.community.app.user.common.HttpClient;
    import com.example.community.app.user.common.TemplateData;
    import com.example.community.common.redis.RedisService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    @Component
    public class MessagePush {
        @Autowired RedisService redisService;
    
        @Value("${customer.app.secret}")
        private String AppSecret;
        @Value("${customer.app.id}")
        private String AppId;
        @Value("${official.app.secret}")
        private String OfficialAppSecret;
        @Value("${official.app.id}")
        private String OfficialAppId;
        @Value("${service.template.message.order.payment.successful}")
        private String ServicePushOrderPayMentSuccess;
        @Value("${service.template.message.order.cancellation}")
        private String ServicePushOrderCancellation;
        @Value("${service.template.message.order.deliver}")
        private String ServicePushOrderDeliver;
    
        @Value("${official.template.message.order.payment.successful}")
        private String OfficialPushOrderPayMentSuccess;
    
    
        @Value("${wx.getAccessToken}")
        private String AccessTokenUrl;
        @Value("${wx.service.template.message.send}")
        private String ServiceTemplateMessageSendUrl;
    
    
        public Object getServiceAccessToken(){
            Object acc = redisService.get("service_push_access_token");
            if(acc == null){
                String res = HttpClient.doGet(AccessTokenUrl+"?grant_type=client_credential&appid="+AppId+"&secret="+AppSecret);
                Map mapType = JSON.parseObject(res,Map.class);
                redisService.set("service_push_access_token", mapType.get("access_token"), 7150L);
                return mapType.get("access_token");
            }
            return acc;
        }
    
        //小程序服务通知
        public String pushServiceMessage(Integer type, String touser, String form_id, List<String> keywords){
            Map<String, Object>map = new HashMap<>();
            map.put("touser", touser);
            switch (type){
                case 1:map.put("template_id", ServicePushOrderPayMentSuccess); break;//支付成功
                case 2:map.put("template_id", ServicePushOrderCancellation); break;//取消订单
                case 3:map.put("template_id", ServicePushOrderDeliver);break;//发货通知
                default:
                    map.put("template_id", ServicePushOrderPayMentSuccess); break;
            }
            map.put("form_id", form_id);
            Map<String, Object>map1 = new HashMap<>();
           for(int i = 0; i < keywords.size(); i++){
               map1.put("keyword"+(i+1), new TemplateData(keywords.get(i), null));
           }
            map.put("data", map1);
            return HttpClient.doPost(ServiceTemplateMessageSendUrl+"?access_token="+getServiceAccessToken(), map);
        }
    }
    
    

    具体实现代码,裁剪后的代码。下面的代码可以直接复制然后运行即可,缺少的包导入进去

    import com.alibaba.fastjson.JSON;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class MessagePush {
    
        private String AppSecret = “小程序密匙,在小程序管理页面可以找到”;
        private String AppId = “小程序appip,在小程序管理页面可以找到”;
        private String ServicePushOrderPayMentSuccess = "t1ictRv_Hv7-ww6TM_7BheLu02UUl_SurJxPHc09YEg";//订单支付成功的模板的id
    
        private String AccessTokenUrl = “https://api.weixin.qq.com/cgi-bin/token”;//获取小程序后台鉴权接口,可以不变
        private String ServiceTemplateMessageSendUrl = “https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send”;//发送模板消息调用的接口
    
    
        public Object getServiceAccessToken(){
                String res = HttpClient.doGet(AccessTokenUrl+"?grant_type=client_credential&appid="+AppId+"&secret="+AppSecret);
                Map mapType = JSON.parseObject(res,Map.class);
                return mapType.get("access_token");
            return acc;
        }
    
        //小程序服务通知
        //表单提交场景下,为 submit 事件带上的 formId;支付场景下,为本次支付的 prepay_id,这些对应就是form_id
        //touser微信对象的openid
        //keywords对应模板消息的各个参数的值
        public String pushServiceMessage(Integer type, String touser, String form_id, List<String> keywords){
            Map<String, Object>map = new HashMap<>();
            map.put("touser", touser);
            switch (type){
                case 1:map.put("template_id", ServicePushOrderPayMentSuccess); break;//支付成功
                default:
                    map.put("template_id", ServicePushOrderPayMentSuccess); break;
            }
            map.put("form_id", form_id);
            Map<String, Object>map1 = new HashMap<>();
           for(int i = 0; i < keywords.size(); i++){
               map1.put("keyword"+(i+1), new TemplateData(keywords.get(i), null));
           }
            map.put("data", map1);
            return HttpClient.doPost(ServiceTemplateMessageSendUrl+"?access_token="+getServiceAccessToken(), map);
        }
    }
    

    发送http请求的工具类

    package com.example.community.app.user.common;
    
    import com.alibaba.fastjson.JSONObject;
    import org.apache.http.HttpEntity;
    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.HttpClients;
    import org.apache.http.util.EntityUtils;
    
    import java.io.IOException;
    import java.util.Map;
    
    public class HttpClient {
        public static String doGet(String url) {
            CloseableHttpClient httpClient = null;
            CloseableHttpResponse response = null;
            String result = "";
            try {
                // 通过址默认配置创建一个httpClient实例
                httpClient = HttpClients.createDefault();
                // 创建httpGet远程连接实例
                HttpGet httpGet = new HttpGet(url);
    //            // 设置请求头信息,鉴权
    //            httpGet.setHeader("Authorization", "Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0");
                // 设置配置请求参数
                RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(35000)// 连接主机服务超时时间
                        .setConnectionRequestTimeout(35000)// 请求超时时间
                        .setSocketTimeout(60000)// 数据读取超时时间
                        .build();
                // 为httpGet实例设置配置
                httpGet.setConfig(requestConfig);
                // 执行get请求得到返回对象
                response = httpClient.execute(httpGet);
                // 通过返回对象获取返回数据
                HttpEntity entity = response.getEntity();
                // 通过EntityUtils中的toString方法将结果转换为字符串
                result = EntityUtils.toString(entity);
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                // 关闭资源
                if (null != response) {
                    try {
                        response.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (null != httpClient) {
                    try {
                        httpClient.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return result;
        }
        public static String doPost(String url, Map<String, Object> paramMap) {
            CloseableHttpClient httpClient = null;
            CloseableHttpResponse httpResponse = null;
            String result = "";
            // 创建httpClient实例
            httpClient = HttpClients.createDefault();
            // 创建httpPost远程连接实例
            HttpPost httpPost = new HttpPost(url);
            // 配置请求参数实例
            RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(35000)// 设置连接主机服务超时时间
                    .setConnectionRequestTimeout(35000)// 设置连接请求超时时间
                    .setSocketTimeout(60000)// 设置读取数据连接超时时间
                    .build();
            // 为httpPost实例设置配置
            httpPost.setConfig(requestConfig);
            // 设置请求头
            httpPost.addHeader("Content-Type", "application/json");
            // 封装post请求参数
    //        if (null != paramMap && paramMap.size() > 0) {
    //            List<NameValuePair> nvps = new ArrayList<NameValuePair>();
    //            // 通过map集成entrySet方法获取entity
    //            Set<Map.Entry<String, Object>> entrySet = paramMap.entrySet();
    //            // 循环遍历,获取迭代器
    //            Iterator<Map.Entry<String, Object>> iterator = entrySet.iterator();
    //            while (iterator.hasNext()) {
    //                Map.Entry<String, Object> mapEntry = iterator.next();
    //                nvps.add(new BasicNameValuePair(mapEntry.getKey(), mapEntry.getValue().toString()));
    //            }
    //            System.out.println(JSONObject.toJSONString(nvps));
    //            // 为httpPost设置封装好的请求参数
    //            try {
    //                httpPost.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8"));
    //            } catch (UnsupportedEncodingException e) {
    //                e.printStackTrace();
    //            }
    //        }
    
            httpPost.setEntity(new StringEntity(JSONObject.toJSONString(paramMap),"utf-8"));
            try {
                // httpClient对象执行post请求,并返回响应参数对象
                httpResponse = httpClient.execute(httpPost);
                // 从响应对象中获取响应内容
                HttpEntity entity = httpResponse.getEntity();
                result = EntityUtils.toString(entity);
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                // 关闭资源
                if (null != httpResponse) {
                    try {
                        httpResponse.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (null != httpClient) {
                    try {
                        httpClient.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return result;
        }
    }
    
    

    最后,在一个main方法中,调用这个pushServiceMessage方法,即可发送成功。如果发送失败有什么微信方面的错误,方法返回的字符串输出即可展示错误信息。
    在这里插入图片描述

    总结

    好像写的比较粗糙,想要写的非常清除明了,还需要努力努力啊!希望这篇文章可以对大家有用。

    展开全文
  • java发送微信小程序模版通知

    千次阅读 热门讨论 2018-10-23 16:27:28
    由于微信关闭了模版消息发送,所有改为订阅消息发送,此篇技术已经过时,请浏览最新的服务通知,新博客地址 https://blog.csdn.net/qq_34706514/article/details/103870208 首先先上官方文档 ...

    2020年1月7日10:41:51 

    由于微信关闭了模版消息发送,所有改为订阅消息发送,此篇技术已经过时,请浏览最新的服务通知,新博客地址

    https://blog.csdn.net/qq_34706514/article/details/103870208

     

    首先先上官方文档

    https://developers.weixin.qq.com/miniprogram/dev/api/open-api/template-message/sendTemplateMessage.html

    关键部分代码

    /**
         * 发送模板消息sendTemplateMessage
         * 小程序模板消息,发送服务通知
         * @param touser 接收者(用户)的 openid
         * @param template_id 所需下发的模板消息的id
         * @param page 点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。
         * @param formid 表单提交场景下,为 submit 事件带上的 formId;支付场景下,为本次支付的 prepay_id
         * @return
         */
        public static JSONObject sendTemplateMessage(String touser,String template_id,String page,String formid,Map<String,TemplateData> map){
            String accessToken = GetTokenUtil.getAccessToken();
    //        String accessToken = "14_J1q4pOmeNcQNTZijKctjByU4SNHJ9ge7eWqUPh98bpjRCzg4Inx50WMZpL06epBJ3wzVaTI9iYXDC_-glxbFYr5PQ9JVDncc67Q7NbvLn4NSW-zasZx_hFCgI8LmBGybI3a-FVjLPzyKMxlpAGFdAIAUAZ";
            sendTemplateMessage sendTemplateMessage = new sendTemplateMessage();
            //拼接数据
            sendTemplateMessage.setTouser(touser);
            sendTemplateMessage.setTemplate_id(template_id);
            sendTemplateMessage.setPage(page);
            sendTemplateMessage.setForm_id(formid);
            sendTemplateMessage.setData(map);
            sendTemplateMessage.setEmphasis_keyword("");
            String json =  JSONObject.toJSONString(sendTemplateMessage);
            log.info("##模版发送JSON数据:  "+json);
            String ret = UrlUtils.sendPost(Wechat.SEND_TEMPLATE_MESSAGE+accessToken, json);
            return JSON.parseObject(ret);
        }
    /**发送模板消息*/
        String SEND_TEMPLATE_MESSAGE = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=";

    用到的封装的实体

    TemplateData.java
    sendTemplateMessage.java
    /**
     * 发送模板消息
     * @Author: liangkesai
     * @CreateDate: 2018/9/30 16:21
     */
    public class sendTemplateMessage {
    
        private String touser; //接收者(用户)的 openid
    
        private String template_id; //所需下发的模板消息的id
    
        private String page; //点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。
    
        private String form_id; //表单提交场景下,为 submit 事件带上的 formId;支付场景下,为本次支付的 prepay_id
    
        private Map<String,TemplateData> data; //模板内容,不填则下发空模板
    
        private String emphasis_keyword; //模板需要放大的关键词,不填则默认无放大
    
        get set 省略
    }
    public class TemplateData {
    
        private String value;
    
        public String getValue() {
            return value;
        }
    
        public void setValue(String value) {
            this.value = value;
        }
    
        public TemplateData(String value) {
            this.value = value;
        }
    
        public TemplateData() {
        }
    }

    发送post请求代码

     /**
         * 发送post请求 json格式
         * @param url
         * @param param
         * @return
         */
        public static String sendPost(String url, String param) {
            PrintWriter out = null;
            BufferedReader in = null;
            String result = "";
            try {
                URL realUrl = new URL(url);
                // 打开和URL之间的连接
                URLConnection conn = realUrl.openConnection();
                // 设置通用的请求属性
                conn.setRequestProperty("Accept", "application/json");
                conn.setRequestProperty("Content-Type", "application/json");
                // 发送POST请求必须设置如下两行
                conn.setDoOutput(true);
                conn.setDoInput(true);
                // 获取URLConnection对象对应的输出流
                out = new PrintWriter(conn.getOutputStream());
                // 发送请求参数
                out.print(param);
                // flush输出流的缓冲
                out.flush();
                // 定义BufferedReader输入流来读取URL的响应
                in = new BufferedReader(
                        new InputStreamReader(conn.getInputStream()));
                String line;
                while ((line = in.readLine()) != null) {
                    result += line;
                }
            } catch (Exception e) {
                System.out.println("发送 POST 请求出现异常!"+e);
                e.printStackTrace();
            }
            //使用finally块来关闭输出流、输入流
            finally{
                try{
                    if(out!=null){
                        out.close();
                    }
                    if(in!=null){
                        in.close();
                    }
                }
                catch(IOException ex){
                    ex.printStackTrace();
                }
            }
            return result;
        }

    测试用main方法

    public static void main(String[] args) {
            Map<String,TemplateData> map = new HashMap<>();
            map.put("keyword1",new TemplateData("339208499"));
            map.put("keyword2",new TemplateData("2018年9月30日16:33:44"));
            map.put("keyword3",new TemplateData("***总部"));
            map.put("keyword4",new TemplateData("*****学院"));
            JSONObject js = sendTemplateMessage("o89rs0M0EIzrkiN9Va88mFbQyUdQ", "vAsdSQIUPI47H5K5xQVFrc36hK2zgyxioRC_rUxMF9M", "", "1539830935602",map);
            System.out.println(js);
        }

     

    有不懂的地方可以留言

     

     

     

    展开全文
  • 公司管理小程序需要做到关闭小程序后能收到审核通过或驳回得消息通知,短信推送的成本太高,查询了一下小程序的文档,有一个订阅消息,但是只能一次性订阅点一次订阅只能接收一次推送,微信没有对一般企业开放长期...
  • 在安装的Wordpress插件搜索Mini Program API插件安装,就可以连接你的网站数据同步到小程序端,无缝对接一个小程序,无需编程轻松生成一个属于的个人小程序,没有资质限制个人也可以上线。 简约精美的UI设计,独家...
  • 二、微信小程序开发代码 三、java客户端代码 一、注册小程序 后台网站 https://mp.weixin.qq.com/ 主要是需要以下几个信息: 1、模板id 网站截图 这里模板你自己添加一个,模板id记下来。 2、AppId、AppSecret ...
  • 设置小程序跳转路径 // 设置模板内容 Map < String , TemplateData > m = new HashMap ( ) ; TemplateData keyword1 = new TemplateData ( ) ; TemplateData keyword2 = new TemplateData ( ) ; ...
  • 微信小程序消息订阅 一次授权 多次接收 发送微信服务通知消息 这里讲长期订阅! 长期订阅! 长期订阅! 需求描述: – 根据用户不同标签(租户、业主、维修师傅、居委会成员)一键向人员统一发送消息通知; 例如:...
  • 最近,经历多个微信小程序支付以及小程序退款实战项目,今天编者经过整理,把小程序申请退款的实战项目案例分享给大家,希望能让大家借鉴,在项目开发中少走弯路。   小程序处理退款前提需安装商户安全证书: ...
  • 微信小程序小程序审核

    千次阅读 2018-07-06 11:12:35
    小程序审核时间慢或是审核不通过,不要慌!可从以下去找问题:1.帐号基本信息1.1小程序名称、简介、logo、服务范围、服务标签、帐号基本信息文字均不得:​ (1)侵犯他人权益(著作权、商标权、肖像权、名誉权等)...
  • 微信小程序 - 蓝牙BLE小程序开发

    千次阅读 2019-09-22 18:03:24
    最近领导看我比较闲,安排我开发一个蓝牙BLE微信小程序,刚开始接到这个项目时,我第一反应时,"卧槽“”。老子在公司的岗位是做Windows和Android 软件开发的,看我闲,竟然让我去做小程序,我从来没有接触过。后面...
  • 小程序wss需要准备ssl的证书(ps.可在阿里云免费申请)。 2.本地测试可通过花生壳内网映射也可以直接修改本机的hosts。 cause:websocket和阿里提供的mqtt一样都是通过长连接发送数据,可在后台直接转发,无须一个...
  • 小程序开发文档

    千次阅读 多人点赞 2019-02-21 17:48:24
    小程序开发总结 用 Markdown编辑器 所展示的 最近领导交给一个任务,单独开发一个小程序项目,还要出一篇小程序课题文档。这也是我第一次接触小程序,遂把领导对课题的要求以及自己开发过程中遇到的问题做如下总结:...
  • 前端与移动开发----微信小程序----小程序(一)

    千次阅读 多人点赞 2021-04-17 09:50:28
    微信小程序
  • 钉钉小程序简介 参考系列文章 钉钉小程序&微应用
  • 说到小程序自动语音播报功能,不得不提到官方的一款小程序“收款小账本”,当收到一笔款后,就能语音提醒。 这是在收款小程序的应用,再举2个例子! ▍外卖 店家做了一个简单的外卖小程序,一来尝试互联网...
  • 微信小程序的公测掀起了学习小程序开发的浪潮,天生跨平台,即用即走、媲美原生体验、完善的文档、高效的开发框架,小程序给开发者带来了很多惊喜。通过这篇文章和大家一起分析小程序的架构,分享开发经验。 一、...
  • 小程序性能优化之秒开方案 小程序性能优化之秒开方案 前言 最终效果 技术原理 快捷键 Markdown及扩展 表格 定义列表 代码块 脚注 数学公式 UML 图: 离线写博客 浏览器兼容 前言 这个之前看到一篇文章,...
  • 微信小程序部分习题

    千次阅读 2020-11-19 17:06:15
    1. 简单描述下微信小程序的目录结构? app.js 小程序逻辑 app.json 小程序公共配置 app.wxss 小程序公共样式表 js 页面逻辑 wxml 页面结构 json 页面配置 wxss 页面样式表 2. wxml与标准的html的异同...
  • 小程序插入激励视频广告教程

    万次阅读 2019-04-17 21:41:54
    今天登陆小程序的后台,收到了官方通知小程序激励式视频广告组件日前已上线,也就是说可以在小程序中插入激励视频广告了。 早在今年年初的微信公开课上,微信团队就曾透露「2019 年,微信小程序将在三方面发力...
  • 解决问题,方便生活,为大学校园中,企业园区里洗衣服还要办理洗衣卡,洗衣服的时候还得揣着一张洗衣卡,只需要拿着手机扫一扫就能完美解决,轻客洗衣微信小程序。下来看看该小程序“轻客”,本人写了几个自己觉得...
  • 小程序直播组件接入指引

    千次阅读 2020-04-13 11:13:49
    小程序直播,是微信提供给小程序开发者的直播组件。通过调用该组件,商家可以在小程序中实现直播功能。 按下面的使用说明接入,在你的小程序中引入直播组件。 二、使用方法说明 1.【直播组件】如何引入 版本...
  • 怎么开通小程序?怎么注册小程序名称呢......速成应用小程序平台在运营的过程中,收到了很多朋友类似这样的问题反馈。今天为大家送上贴心的100个关于小程序Q&amp;A,帮助大家把所有问题一扫而光,看完你就是老...
  • 小程序蓝牙亲身总结

    万次阅读 多人点赞 2018-08-13 17:29:41
    小程序蓝牙亲身总结 最近做了一个涉及到蓝牙模块小程序,做一下总结,为自己的成长做一份记录,如果能帮到大家的话是再好不过的了; 问题: 1.小程序蓝牙搜索能不能搜到手机设备 2.如何判断蓝牙是否打开,并开始...
  • 小程序与云开发实战 36 讲

    万次阅读 多人点赞 2018-11-06 11:49:05
    小程序依托微信超过 10 亿的海量用户,它无需安装即可使用的完美用户体验,已经成为商家竞相争夺的大蛋糕,同时,小程序开发快速、容易部署广受程序员的喜爱,作为程序员的我们,还有什么理由不学习小程序开发呢?...
  • 本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/3QE3g0NmaBAi91lbrihhVw导语微信小程序的公测掀起了学习小程序开发的浪潮,天生跨平台,即用即走、媲美...
  • 微信小程序授权登录、绑定手机号含接口和小程序1、小程序授权登录1.1、小程序端 本篇博客主要为了记录小程序授权登录和绑定手机号功能的实现,包含小程序端和API(java语言开发)。 1、小程序授权登录 1.1、小程序端 ...
  • 小程序统一服务消息实现

    千次阅读 2019-03-05 20:18:14
    总体思路:运营后台处理某个任务时,推送相关消息到绑定了小程序的微信账户的服务通知里。需要用到用户的openid和用户在小程序中有交互动作产生的formId。 后台表结构设计: 小程序中的代码(taro-ui): &...
  • vue plus.webview 实现 类似微信右上角 关闭小程序 用过微信的人相信都知道 (左图) 我实现的效果(右图) 大概总结了下, 一共有两种方案, 方案一: 保留 plus.webview 的 titleNView 然后设置 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 181,345
精华内容 72,538
关键字:

如何关闭小程序通知