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

    2021-06-03 16:56:45
    小程序消息推送 小程序推送有 小程序自带订阅功能 (限制太多) 1.一次性模板 2.

    小程序消息推送

    订阅功能

       小程序自带的功能,限制比较多

       1.一次性模板 (只能发送一次,如果你要用一次性模板的话,就一直请求申请就行)

       2.长期模板(长期模板需要申请,通过时间我也不知道毕竟没申请过看微信社区有的一年都没处理)医疗,教育行业小程序除外

      微信服务号

        大部分小程序消息推送都是使用服务号,服务号是公众号的一种。公众号分为 订阅号和服务号。而订阅号没有消息推送模板去做。所以使用服务号(需要企业认证)

        大家不要误解服务号消息推送(群发消息一个月四条,单发是没有限制的,只有调用模板次数限制,一个消息模板,一天最多调用10万次,而次数也可以增加,根据你服务号的关注量也加的)添加模板消息 申请模板消息

    添加之后就能拿到模板id

    通过文档调用接口发送就行。

     这里还有一步操作 就是 用户必须关注服务号。而小程序的official-account方法有很大的局限性。

    我这里通过跳转页面引入服务号的文章 在文章中设置服务号的名片 让用户点击去关注

    <web-view src="服务号发布文章 这里引入"></web-view>

    服务号的消息推送必需用户关注服务号才能实现

    展开全文
  • 微信小程序消息推送 java后端 ...注意上述文章中推送消息请求路径已过时改为订阅消息 详情参照:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/subscribe-message.html

    微信小程序消息推送 java后端

    参考:https://blog.csdn.net/CodeWu/article/details/91491310
    https://blog.csdn.net/qiushi_1990/article/details/8262539
    注意上述文章中推送消息请求路径已过时改为订阅消息
    详情参照:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/subscribe-message.html
    新请求路径地址:

    POST https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=ACCESS_TOKEN
    

    PS:建议使用第三方框架进行开发,gitee上有很多优秀框架

    1、需要小程序的必要信息

    appid,appsecret,templateid(推送消息的模板id,在小程序后台模板管理中可以找到)

    2、获取accesstoken

    将appid与appsecret替换到下面链接的对应位置,然后以get方式访问

    GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
    

    详情参照
    https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html
    即可得到accesstoken,有效期默认7200s。因此需要放入缓存避免重复请求,可根据返回的expires_in来设置过期时间,返回类型如下。
    在这里插入图片描述

    3、设置推送数据格式

    所需参数如下:
    在这里插入图片描述

    封装一个实体类用于发送请求,代码见完整实例
    注意:请求参数中data应该是一个Map<String,Map<String,Object>>,其中,嵌套map中key,即上图说明的key1,key2…,需要对应小程序模板中的变量名,且对应的值类型要和data中的类型一致,否则报错,因此嵌套map中的value类型设置为Object可以发送不同类型的数据。如下图

    在这里插入图片描述

    4、获取下放权限

    推送消息前需要用户点击允许推送消息的按钮来获取下放权限,否则推送不会成功。由于是测试,此处我使用微信开发平台工具来获取测试用的权限(进入平台后依次点击云调用 --> 服务端调用 即可进入该页面)
    在这里插入图片描述

    5、推送消息

    请求路径如下:

    POST https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=ACCESS_TOKEN
    

    请求业务层完整代码:

    package com.example.demo.wx.service;
    
    import com.example.demo.common.utils.IGlobalCache;
    import com.example.demo.wx.constants.WxConstants;
    import com.example.demo.wx.vo.AccessTokenVO;
    import com.example.demo.wx.vo.AuthVoucherVO;
    import com.example.demo.wx.vo.PushMessageVO;
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.http.ResponseEntity;
    import org.springframework.util.StringUtils;
    import org.springframework.web.bind.annotation.*;
    import org.springframework.web.client.RestTemplate;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * @author hezhongwei
     * @Description 微信相关服务接口
     * @date 2021-04-22 11:39
     */
    public class WxService {
        private final static String ACCESS_TOKEN_KEY = WxConstants.getAccessTokenKey();
        private final RestTemplate restTemplate;
        private final IGlobalCache redisCache;
        private ObjectMapper jsonMapper = new ObjectMapper();
    
        /**
         * @Description 获取token
         * @return access_token
         * @throws JsonProcessingException
         */
        public String getTokenForWx(){
            //先查缓存中有没有
            if(redisCache.get(ACCESS_TOKEN_KEY) != null) {
                return redisCache.get(ACCESS_TOKEN_KEY).toString();
            }
            String url = WxConstants.getGetAccessTokenUrl();
            String response = restTemplate.getForObject(url, String.class);
            AccessTokenVO accessTokenVO = null;
            try {
                accessTokenVO = jsonMapper.readValue(response, AccessTokenVO.class);
            } catch (JsonProcessingException e) {
                throw new RuntimeException("token获取失败");
            }
            redisCache.set(ACCESS_TOKEN_KEY, accessTokenVO.getAccessToken(), accessTokenVO.getExpiresIn());
            return accessTokenVO.getAccessToken();
        }
    
        /**
         * @Description 推送订阅消息
         * @param openId
         * @return
         */
        public String pushMessage(String openId) {
            //获取access_token
            String accessToken = getTokenForWx();
            //拼接请求路径
            String url = String.format(WxConstants.getPostTempMessageUrl(), accessToken);
            System.out.println(url);
            //设置推送参数
            PushMessageVO pushMessage = new PushMessageVO();
            //基本参数
            pushMessage.setTouser(openId);
            pushMessage.setTemplateId(WxConstants.getFinishTemplateId());
            //模板信息
            Map<String, Map<String, Object>> data = new HashMap<>(10);
            Map<String, Object> keyword1 = new HashMap<>(3);
            keyword1.put("value", "hello");
            data.put("thing1", keyword1);
            Map<String, Object> keyword2 = new HashMap<>(3);
            keyword2.put("value", 10);
            data.put("amount2", keyword2);
            pushMessage.setData(data);
            System.out.println(pushMessage);
    
            ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, pushMessage, String.class);
            return responseEntity.getBody();
        }
    
        /**
         * @Description 获取openId
         * @param code 通过wx.login()获得
         * @return openId or errorcode
         * @throws JsonProcessingException
         */
        public String getOpenId(String code) throws JsonProcessingException {
            String url = "https://api.weixin.qq.com/sns/jscode2session?appid="
                    + WxConstants.getAppId() + "&secret="
                    + WxConstants.getAppSecret() +"&js_code="
                    + code + "&grant_type=authorization_code";
            RestTemplate restTemplate = new RestTemplate();
            String res = restTemplate.getForObject(url, String.class);
            System.out.println("res" + res);
            AuthVoucherVO authVoucherVO = jsonMapper.readValue(res, AuthVoucherVO.class);
            System.out.println("auth" + authVoucherVO.toString());
            return authVoucherVO.getOpenId() == null ? authVoucherVO.getErrcode().toString() : authVoucherVO.getOpenId();
        }
    
        @Autowired
        public WxService(ObjectMapper jsonMapper, RestTemplate restTemplate, IGlobalCache redisCache) {
            this.jsonMapper = jsonMapper;
            this.restTemplate = restTemplate;
            this.redisCache = redisCache;
        }
    }
    

    WxConstants是常量类,包含上述中必要的常量:appid等,也包括一些请求地址,可依据个人情况进行封装

    展开全文
  • C# .Net 小程序消息推送配置+详细代码 首先在微信公众平台登录小程序账号    第一步登陆    登录后,在首页-功能-订阅信息,打开后如未进行配置,需要进行后台配置。   &...

    C# .Net 小程序消息推送配置+详细代码


    首先在微信公众平台登录小程序账号
        第一步登陆
       登录后,在首页-功能-订阅信息,打开后如未进行配置,需要进行后台配置。
        第二步:填写服务器配置
       登录微信公众平台官网后,在公众平台官网的开发-基本设置页面,勾选协议成为开发者,点击“修改配置”按钮,填写服务器地址(URL)、Token和EncodingAESKey,其中URL是开发者用来接收微信消息和事件的接口URL。Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。
       同时,开发者可选择消息加解密方式:明文模式、兼容模式和安全模式。模式的选择与服务器配置在提交后都会立即生效,请开发者谨慎填写及选择。加解密方式的默认状态为明文模式,选择兼容模式和安全模式需要提前配置好相关加解密代码。
        第三步:验证消息的确来自微信服务器
       开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:

    参数描述
    signature微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
    timestamp时间戳
    nonce随机数
    echostr随机字符串

       开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
    1)将token、timestamp、nonce三个参数进行字典序排序
    2)将三个参数字符串拼接成一个字符串进行sha1加密
    3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
       检验signature的C#示例代码(本人自己写):

     		public void ProcessRequest(HttpContext context)
            {
                HttpRequest request = context.Request;
                HttpResponse response = context.Response;
                Dictionary<string, string> dictionary = new Dictionary<string, string>();
                dictionary.Add("timestamp", request["timestamp"]);
                dictionary.Add("nonce", request["nonce"]);
                dictionary.Add("Token", "自己设置的token");
                dictionary = dictionary.Where(a => !string.IsNullOrEmpty(a.Value)).OrderBy(b => b.Value).ToDictionary(c => c.Key, c => c.Value);//进行排序
                StringBuilder builder = new StringBuilder();
                foreach (var v in dictionary)
                {
                    builder.Append(v.Value);
                }
                string echostr = request["echostr"];
                //验证成功返回微信请求的随机字符串
                if(request["signature"]== SHA1(builder.ToString()).ToLower())
                {
                    response.Write(echostr);
                    log.Info("验证成功,返回=" + echostr);
                }
                else
                {
                    response.Write(false);
                    log.Info("验证失败");
                }
                response.End();
            }
            /// <summary>
            /// SHA1 加密
            /// </summary>
            /// <param name="content">需要加密字符串</param>
            public string SHA1(string content)
            {
                return SHA1(content, Encoding.UTF8);
            }
            /// <summary>
            /// SHA1 加密
            /// </summary>
            /// <param name="content">需要加密字符串</param>
            /// <param name="encode">指定加密编码</param>
            public string SHA1(string content, Encoding encode)
            {
                try
                {
                    SHA1 sha1 = new SHA1CryptoServiceProvider();
                    byte[] bytes_in = encode.GetBytes(content);
                    byte[] bytes_out = sha1.ComputeHash(bytes_in);
                    sha1.Dispose();
                    string result = BitConverter.ToString(bytes_out);
                    result = result.Replace("-", "");
                    return result;
                }
                catch (Exception ex)
                {
                    log.Info("SHA1加密出错:" + ex.Message);
                    return "";
                }
            }
    

       成功返回微信服务器后,即可申请模板-点击选用-选择所需内容点击提交(如下图)。
    图一
    图二

       接入配置结束,具体请看官方文档–小程序开发接入文档
       C#接口代码
       第一步,获取token

    		//token实体类
     		public class AccessToken
            {
                public string access_token { get; set; }
                public int expires_in { get; set; }
            }
            //获取微信token
            private string Exe_Access_token()
            {
                string appid = "小程序的appid";
                string secret = "小程序的秘钥";
                HttpResponse Response = HttpContext.Current.Response;
                JavaScriptSerializer serializer = new JavaScriptSerializer();
                string access_token = string.Empty;
                AccessToken accesstoken = (AccessToken)serializer.Deserialize(HttpPostRequest("https://api.weixin.qq.com/cgi-bin/token", 
                    "grant_type=client_credential&appid=" + appid + "&secret=" + secret), typeof(AccessToken));//请求微信服务器
                HttpCookie cookie_access_token_create = new HttpCookie("access_token", HttpUtility.UrlEncode(accesstoken.access_token));//创建Cookie
                cookie_access_token_create.Expires = DateTime.Now.AddSeconds(accesstoken.expires_in);
                Response.AppendCookie(cookie_access_token_create);
                access_token = accesstoken.access_token;
                return access_token;
            }
            //post请求方法
            public static string HttpPostRequest(string path, string parameter)
            {
                string result = string.Empty;
                try
                {
                    byte[] b = Encoding.UTF8.GetBytes(parameter);
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(path);
                    request.Method = "POST";
                    request.ContentType = "application/x-www-form-urlencoded";
                    request.ContentLength = b.Length;
                    using (Stream s = request.GetRequestStream())
                    {
                        s.Write(b, 0, b.Length);
                    }
                    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                    {
                        using (StreamReader sr = new StreamReader(response.GetResponseStream()))
                        {
                            result = sr.ReadToEnd().Trim();
                        }
                    }
                }
                catch
                {
                    result = string.Empty;
                }
                return result;
            }
    

       第二步,请求发送

    private void WxNotification(HttpRequest request)
            {
                string openid = request["openid"];//此处openid是用户的openid
                string http = HttpPostRequest("https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + Exe_Access_token(),
                    "{\"touser\":\"" + openid + "\"," +
                   "\"template_id\":\"pr8jhwtQ\"," + //template_id就是申请的模板ID
                    "\"data\":" +
                    "{\"character_string1\":{\"value\":\"Dy202109261714\"}," + //分别对应申请的模板详细内容
                    "\"phrase2\":{\"value\":\"打包中\"}," +
                    "\"date3\":{\"value\":\"" + DateTime.Now.ToString() + "\"}" +
                    "}}");
                log.Info(http);
            }
    

       模板内容如下图所示
    在这里插入图片描述

       最后一步-小程序代码
       页面代码

    <view>
          <button bindtap="testbutton">确认下单</button>
    </view>
    

       Js代码

    testbutton:function(){
        wx.requestSubscribeMessage({
          tmplIds: ['4pr8jhwtQ'],//申请的模板id
          success (res) {
          	//reject 用户取消 accept 用户同意
            if(res.rZPwDiPjoS7yaY3QlWFENS8lirpPaMbFFE4pr8jhwtQ=="accept"){
              wx.request({
                url: '',//上面服务器配置的域名
                data:{
                  openid:openid//用户的openid
                },
                header: {
                  'Content-Type': "application/x-www-form-urlencoded",
                },
                method: "POST",
                success:function(req){
                
                }
              })
            }
           }
        })
      }
    

       最后调试结果如下:
    在这里插入图片描述
    在这里插入图片描述
    小程序订阅消息官方文档

    展开全文
  • 启用并设置消息推送配置后,用户发给小程序消息以及开发者需要的事件推送,都将被微信转发至该服务器地址中,下面我就来看下这是怎么配置的。这是我自己配置的案例效果图。我在自己的服务器根目录定义api.php文件...

    为丰富小程序的服务能力,提高服务质量,微信为小程序提供客服消息能力,以便小程序用户可以方便快捷地与小程序服务提供方进行沟通。启用并设置消息推送配置后,用户发给小程序的消息以及开发者需要的事件推送,都将被微信转发至该服务器地址中,下面我就来看下这是怎么配置的。这是我自己配置的案例效果图。

    1501642230626197.png

    我在自己的服务器根目录定义api.php文件,URL填写的地址为http://www.100txy.com/api.php,文件api.php具体的代码如下<?php

    define("TOKEN","100txy");// 后台填写的token

    $wechatObj = new wechatAPI();

    $wechatObj->isValid();

    class wechatAPI

    {

    public function isValid()//验证微信接口,如果确认是微信就返回它传来的echostr参数

    {

    $echoStr = $_GET["echostr"];

    if ($this->checkSignature()) {

    echo $echoStr;

    exit;

    }

    }

    private function checkSignature(){ //官方的验证函数

    $signature = $_GET["signature"];

    $timestamp = $_GET["timestamp"];

    $nonce = $_GET["nonce"];

    $token = TOKEN;

    $tmpArr = array($token, $timestamp, $nonce);

    sort($tmpArr, SORT_STRING);

    $tmpStr = implode( $tmpArr );

    $tmpStr = sha1( $tmpStr );

    if( $tmpStr == $signature ){

    return true;

    }else{

    return false;

    }

    }

    };

    这样配置后提交就能启用成功!

    展开全文
  • 可以在公共模板库里选择需要的模板,如果没有找到自己需要的也可以自己创建然后等待审核、选择完模板查看详情会得到模板ID,以及发送推送时需要的字段、小程序发送订阅的请求需要用到上一步获取的模板Id// 小程序入驻...
  • ThinkPHP6 微信小程序消息推送配置时报错: {“ret“:200302,“err_msg“:“verify token fail“} 贴一下我的代码: 控制器 class Message { public function wxCustomerPush() { $requestMethod = request()->...
  • //小程序appid $appId = 'wxf6bce3a3c80e8602'; //秘钥 $appSecret = 'cf58ad3c4ab89020b47d22cb9cedf6f8'; $r = file_get_contents("https://api.weixin.qq.com/cgi-bin/token? grant_type
  • 第一步:官网下载对应版本的cryptoDemophp下载地址:https://wximg.gtimg.com/shake_tv/mpwiki/cryptoDemo.zipjson第二步:建立检查文件wxcheck.php小程序这个文件名能够随便命名,要保证url中检查的文件名与之相同...
  • 前面写过一篇云开发实现小程序订阅消息(模板消息)推送的文章,《借助云开发实现小程序订阅消息和模板消息推送功能》是有好多同学用的是Java写后台,所以今天就再来写一篇Java后台实现小程序订阅消息推送的文章。...
  • 实现效果:下面要显示五个字段 接下来,参照官方文档,一步步实现:一、官方给出请求示例、返回示例 二、根据上面编写实体类(1)请求参数@.../*** 所需下发的模板消息的id*/private String template_id;/*** 点击模...
  • 说明1、小程序模版消息与服务号不同,采用【用户订阅】的方式,需要用户在小程序上确认订阅后,才可以收到推送消息2、小程序订阅消息,显示在微信的【服务通知】里面。(服务号是显示在服务号里面)设置步骤微信...
  • 小程序订阅消息推送

    2021-12-16 15:41:56
    小程序订阅消息推送
  • 3,调用小程序消息推送的接口 一,获取用户的openid 关于openid的获取百度一大堆方法,有兴趣的可以去查看一下,此处不在赘述。。。。。 二,获取access_token 关于access_token官方给出的解答如下 其实...
  • 前端时间负责小程序后端的老哥离职,所以由本人负责与前端对接开发 - 小程序消息推送,简单封装了个工具类,在此记录一下。 前提 服务通知推送需要申请小程序模板,具体申请细节可百度了解,登录地址:微信公众平台...
  • 普通的订阅消息只能发送一次,你会不会很纠结、很痛苦呢!后面有彩蛋 代码: // 验证token function verifyToken(){ $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; ...
  • 首先回答一个问题:个人申请的小程序是否可以推送?答案是肯定的,下面记录的就是我的踏坑之旅,后台采用PHP实现。要想完成推送大概可分为六步:1、配置模板2、生成小程序 AppSecret3、获取 ACCESS_TOKEN4、获取将要...
  • 利用Nodejs怎么实现一个微信小程序消息推送功能发布时间:2021-01-20 13:55:29来源:亿速云阅读:92作者:Leah今天就跟大家聊聊有关利用Nodejs怎么实现一个微信小程序消息推送功能,可能很多人都不太了解,为了让...
  • wxml文件: 发送模板消息js文件:testSubmit: function (e) { var self = this;//获取access_token :APPID为小程序appid,app_secret为小程序密钥 wx.request({ url: 'https://api.weixin.qq.com/cgi-bin/token? ...
  • 2、调用订阅消息下发接口 获取access_token这边就不说了,直接调用接口可以获得,这边主要是实现下发订阅消息。因为完整的可用的业务代码,获取access_token也是需要进行一些专业的处理,例如缓存access_token,...
  • 1.去小程序公众平台配置消息推送 开发工具——开发设置——消息推送 2.先来讲url和token怎么配置 这里可以直接去这个地址参考:https://blog.csdn.net/fangchao2011/article/details/90074356 3.配置好了url...
  • 搜索热词微信小程序 消息推送PHP服务器验证实例详解微信文档(靠下有个“接入指引”):设置页面(“设置”>>“开发设置”):1.设置服务器域名比如:注意http和https协议的不同。2.设置消息推送2.1 在你的服务器...
  • 第五步 提供与官网同步的cryptoDemo的PHP版本,无毒无害 下载链接:https://download.csdn.net/download/dmt742055597/10403220 以上就是详解php微信小程序消息推送配置的详细内容,更多关于php微信小程序的资料请...
  • 最近在用sanic框架写微信小程序,其中写了一个微信消息推送,还挺有意思的,写了个小demo具体见官方文档:...包括返回数据的类型,报错信息大致流程就是:调用微信小程序的接...
  • 小程序用户推送消息,首先需要获取用户的openid,这个是小程序的openid,跟公众号得区分开来,获取方式跟公众号一样,先获取code,然后再获取openid。 通过openid向用户发送订阅消息,订阅消息!!!这应该坑了...
  • 这里setData 的keyword1这些多少个是取决于你小程序选用的模板,我期中的mark判断是判断是给用户还是给商家推送消息,因为这两个消息模板不一样;另外,我获取的accessToken是存入数据库的,第一次获取会添加,后续...
  • } public function send($open_id,$template_id,$data,$page){ $post_data = array( // 用户的 openID,可用过 wx.getUserInfo 获取 "touser" => $open_id, // 小程序后台申添加的订阅消息模板 ID "template_id" =>...
  • 1、Appid :wxcc426542b5dbad4b2、最近操作时间:2019-07-03 12:033、消息推送的域名http://dany.applnk.cn/7938494、安卓用户发送一条文本:服务器nginx日志:223.166.222.111 - - [03/Jul/2019:12:04:42 +0800] ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 141,920
精华内容 56,768
关键字:

小程序消息推送