一、基础概念:
准备条件:
1、公众号和小程序必须在同一个公司主体下。
2、在公众号后台需要对小程序进程绑定操作。
公众号提供了两种消息,一种是订阅消息,一种是模板消息。
订阅消息需要用户主动订阅,然后才能接收消息,微信提供前端组件用于用户进行订阅。
模板消息,用户只需要关注公众号,就能发送消息给用户。
本文主要介绍后台服务器接入微信openapi发送模板消息。

登录公众号后台,查看模板消息,进行模板消息选择,如果没有模板消息选项,则需要在更多功能和设置中进行模板消息的开通。
二、接入微信OpenApi 发送模板消息。
微信开发文档相关地址:下发统一消息 | 微信开放文档
使用:
https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token=ACCESS_TOKEN
进行消息的发送。access_token 采用微信小程序提供的获取token的api获取
获取token的api:
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=SECRET
统一发送消息的的参数说明:

小程序模板消息已经下架,我们使用公众号的消息模板。
参数中,miniprogram是一个关于小程序的结构体,子参数有小程序的appId 和小程序的指定页面,用于用户点击消息,跳转到相应的小程序。
miniprogram未指定的情况下,指定了URL,则点击消息,则会跳转到URL指定的页面。
data参数根据你使用的模板进行参数设置。
基本结构参数如下:

token,参数都组装好后,就可以通过http请求给关注公众号的相应用户发送消息。
三、接入相关代码
1、参数实体
@Data
public class WechatOAMsg implements Serializable {
private static final long serialVersionUID = -1012245204329270134L;
/**
* openid
*/
private String touser;
/**
* 公众号模板消息相关的信息
*/
private MpTemplateMsg mp_template_msg;
@Data
public static class MpTemplateMsg{
/**
* 公众号appid,要求与小程序有绑定且同主体
*/
private String appid;
/**
* 消息模板ID
*/
private String template_id;
/**
* 公众号模板消息所要跳转的url
*/
private String url;
/**
* 公众号模板消息所要跳转的小程序,小程序的必须与公众号具有绑定关系
*/
private Map<String,String> miniprogram;
/**
* 公众号模板消息的数据,消息json
*/
private Map<String,Map<String,String>> data;
}
}
2、返回接收
@Data
public class WechatOAResult implements Serializable {
private static final long serialVersionUID = -8530125244567710894L;
/**
* 返回码
*/
private Integer errcode;
/**
* 消息体
*/
private String errmsg;
}
3、发送方法
/**
* 发送微信公众号消息
* @param wechatOAMsg
* @return
*/
public WechatOAResult sendWechatOAMsg(WechatOAMsg wechatOAMsg){
String postData = JsonUtil.toJsonString(wechatOAMsg);
String token = getAccessToken(2);
String getOpenUrl = weChatConfiguration.getSendMsgUrl();
getOpenUrl = getOpenUrl.replace("ACCESS_TOKEN",token);
if (null != postData) {
//http 调用第三方接口
log.info("send Wechat msg Url :{} postData:{} ", getOpenUrl,postData);
String result = HttpUtil.post(getOpenUrl, postData);
log.info("send wechat msg result:"+result);
WechatOAResult wechatOAResult = JsonUtil.parseObject(result,WechatOAResult.class);
return wechatOAResult;
}
return null;
}
其他相关业务代码,请自行补全。
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c