一、准备工作

  1、参考https://mp.weixin.qq.com/debug/wxadoc/dev/?t=1476434677599  先注册账号;

  2、下载官网前端开发工具 https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html?t=1476434678461

  3、其他的接口及文档请参考 https://mp.weixin.qq.com/debug/wxadoc/introduction/index.html?t=2018125

二、java后端

 1、先去github下载sdk https://github.com/Wechat-Group/weixin-java-tools

  2、demo参考    https://github.com/binarywang/weixin-java-miniapp-demo      注: 此demo是采用了jdk8和spring boot开发的。

三、本人折腾过程

    我本地是采用jdk7,spring mvc和mybatis的搭建框架;

 1、在resources/properties新增wxconfig.properties文件,用于配置



appid=填写自己注册的小程序
appsecret=密钥(通过获取或是重置方式取到,在客服消息转发需要用)
token=自己定义
aeskey=加密
templateId=推送消息模块ID,也是自己在小程序后台-->模板消息中获取;
msgDataFormat=JSON (传送的格式还有或者是XML)
domain=推送模板消息时,如需要点详情时(因为开发小程序有可能是有开发或线上二个域名的)
detail=详情的链接,和在app.json中配置的一样



2、新增一类来加载此配置文件并读取相关的内容到静态变量中;



1 import org.apache.log4j.Logger;
  2 
  3 import java.util.ResourceBundle;
  4 
  5 /**
  6  * @author foreach03
  7  * @company 深圳市
  8  * @create 2018/1/10 13:31
  9  */
 10 public class WxConfigUtils {
 11     private static Logger log = Logger.getLogger(WxConfigUtils.class);
 12     private static String appid;
 13     private static String appsecret;
 14     private static String token;
 15     private static String aeskey;
 16     private static String templateId;
 17     private static String msgDataFormat;
 18     private static String domain;
 19     private static String detail;
 20 
 21     private WxConfigUtils(){
 22 
 23     }
 24     static {
 25         // 加载wxcofig配置文件
 26         ResourceBundle bundle = ResourceBundle.getBundle("properties/wxconfig");
 27         if (bundle == null) {
 28             throw new IllegalArgumentException(
 29                     "[wxcofig.properties] is not found!");
 30         }
 31         appid = bundle.getString("appid");
 32         appsecret = bundle.getString("appsecret");
 33         token = bundle.getString("token");
 34         aeskey = bundle.getString("aeskey");
 35         templateId = bundle.getString("templateId");
 37         msgDataFormat = bundle.getString("msgDataFormat");
 38         domain = bundle.getString("domain");
 39         detail = bundle.getString("detail");
 40 
 41 
 42         log.info("appid is:" + appid);
 43         log.info("appsecret is:" + appsecret);
 44         log.info("token is:" + token);
 45         log.info("aeskey is:" + aeskey);
 46         log.info("templateId is:" + templateId);
 47         log.info("msgDataFormat is:" + msgDataFormat);
 48         log.info("domain is:" + domain);
 49         log.info("detail is:" + detail);
 50     }
 51 
 52     public static String getAppid() {
 53         return appid;
 54     }
 55 
 56     public static void setAppid(String appid) {
 57         WxConfigUtils.appid = appid;
 58     }
 59 
 60     public static String getAppsecret() {
 61         return appsecret;
 62     }
 63 
 64     public static void setAppsecret(String appsecret) {
 65         WxConfigUtils.appsecret = appsecret;
 66     }
 67 
 68     public static String getToken() {
 69         return token;
 70     }
 71 
 72     public static void setToken(String token) {
 73         WxConfigUtils.token = token;
 74     }
 75 
 76     public static String getAeskey() {
 77         return aeskey;
 78     }
 79 
 80     public static void setAeskey(String aeskey) {
 81         WxConfigUtils.aeskey = aeskey;
 82     }
 83 
 84     public static String getTemplateId() {
 85         return templateId;
 86     }
 87 
 88     public static void setTemplateId(String templateId) {
 89         WxConfigUtils.templateId = templateId;
 90     }
 91 
 92     public static String getMsgDataFormat() {
 93         return msgDataFormat;
 94     }
 95 
 96     public static void setMsgDataFormat(String msgDataFormat) {
 97         WxConfigUtils.msgDataFormat = msgDataFormat;
 98     }
 99 
100     public static String getDomain() {
101         return domain;
102     }
103 
104     public static void setDomain(String domain) {
105         WxConfigUtils.domain = domain;
106     }
107 
108     public static String getDetail() {
109         return detail;
110     }
111 
112     public static void setDetail(String detail) {
113         WxConfigUtils.detail = detail;
114     }
115 
116 }



3、新增一个常量类WXMPConfig,其实也可以不用此类。



1 /**
 2  * @author foreach03
 3  * @company 深圳市
 4  * @create 2018/1/10 13:37
 5  */
 6 public class WXMPConfig {
 7     // 服务号常量定义
 8     public static final String APPID = WxConfigUtils.getAppid();//测试
 9     public static final String APPSECRET = WxConfigUtils.getAppsecret();
10     public static final String TOKEN =WxConfigUtils.getToken();
11     public static final String ENCODINGAESKEY =WxConfigUtils.getAeskey();
12     public static final String TEMPLATEID = WxConfigUtils.getTemplateId();
13     public static final String MSGDATAFORMAT = WxConfigUtils.getMsgDataFormat();
14     public static final String DOMAIN = WxConfigUtils.getDomain();
15     public static final String DETAIL = WxConfigUtils.getDetail();
16 
17     private WXMPConfig(){
18 
19     }
20 }



 

4、新建一个工厂类WxMpServiceFactory,用于初始化maservice



1 import cn.binarywang.wx.miniapp.api.WxMaService;
 2 import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
 3 import cn.binarywang.wx.miniapp.config.WxMaInMemoryConfig;
 4 import cn.binarywang.wx.miniapp.message.WxMaMessageRouter;
 5 import com.***.config.constant.WXMPConfig;
 6 
 7 /**
 8  * @author 
 9  * @company 深圳市
10  * @create 2018/1/10 13:25
11  */
12 public class WxMpServiceFactory {
13     private static WxMaService instance;
14 
15     private static WxMaInMemoryConfig wxMaConfigStorage;
16     private static WxMaMessageRouter router = new WxMaMessageRouter(getInstance());
17     private WxMpServiceFactory() {
18         // ......
19     }
20 
21     // 产生WxmaService实例
22     public static WxMaService getInstance() {
23         if(wxMaConfigStorage == null){
24             wxMaConfigStorage = new WxMaInMemoryConfig();
25             wxMaConfigStorage.setAppid(WXMPConfig.APPID);
26             wxMaConfigStorage.setSecret(WXMPConfig.APPSECRET);
27             wxMaConfigStorage.setToken(WXMPConfig.TOKEN);
28             wxMaConfigStorage.setAesKey(WXMPConfig.ENCODINGAESKEY);
29             wxMaConfigStorage.setMsgDataFormat(WXMPConfig.MSGDATAFORMAT);
30         }
31 
32         if (instance == null) {
33             instance = new WxMaServiceImpl();
34             instance.setWxMaConfig(wxMaConfigStorage);
35         }
36 
37         return instance;
38     }
39 
40     public static WxMaInMemoryConfig getWxMaConfigStorage() {
41         return wxMaConfigStorage;
42     }
43 
44     public static void setWxMaConfigStorage(WxMaInMemoryConfig wxMpConfigStorage) {
45         WxMpServiceFactory.wxMaConfigStorage = wxMpConfigStorage;
46     }
47 
48     public static void setInstance(WxMaService instance) {
49         WxMpServiceFactory.instance = instance;
50     }
51 
52     public static WxMaMessageRouter getRouter() {
53         return router;
54     }
55 
56     public static void setRouter(WxMaMessageRouter router) {
57         WxMpServiceFactory.router = router;
58     }
59 
60 }



 5、这样在controller类上就可以通过

private WxMaService wxService= WxMpServiceFactory.getInstance(); 来初始化;

 6、如需要发送模板消息的

      这里需要注意的是:formid只能提交的那openId才可以使用;

   如果想推送很多的消息的话,那就让前端更可能的收集多一些formId



1  wxService.getMsgService().sendTemplateMsg(WxMaTemplateMessage.builder()
2                         .templateId(自己配置的模板ID)
3                         .formId(前端提交的formId)
4                         .data(datalist)
5                         .toUser(要推送的openid)
6                          .page(就是域名+detail了)
7                         .build());