configs;
+
+ @Data
+ public static class Config {
+ /**
+ * 设置微信小程序的appid
+ */
+ private String appId;
+
+ /**
+ * 设置微信小程序的Secret
+ */
+ private String secret;
+
+ /**
+ * 设置微信小程序消息服务器配置的token
+ */
+ private String token;
+
+ /**
+ * 设置微信小程序消息服务器配置的EncodingAESKey
+ */
+ private String aesKey;
+
+ /**
+ * 消息格式,XML或者JSON
+ */
+ private String msgDataFormat;
+ }
+
+}
diff --git a/src/main/java/com/rymcu/vertical/wx/miniapp/controller/WxMaMediaController.java b/src/main/java/com/rymcu/vertical/wx/miniapp/controller/WxMaMediaController.java
new file mode 100644
index 0000000..132e995
--- /dev/null
+++ b/src/main/java/com/rymcu/vertical/wx/miniapp/controller/WxMaMediaController.java
@@ -0,0 +1,80 @@
+package com.rymcu.vertical.wx.miniapp.controller;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.constant.WxMaConstants;
+import com.google.common.collect.Lists;
+import com.google.common.io.Files;
+import com.rymcu.vertical.wx.miniapp.config.WxMaConfiguration;
+import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.multipart.commons.CommonsMultipartResolver;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.File;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ *
+ * 小程序临时素材接口
+ * Created by BinaryWang on 2017/6/16.
+ *
+ *
+ * @author Binary Wang
+ */
+@RestController
+@RequestMapping("/wx/media/{appId}")
+public class WxMaMediaController {
+ private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+ /**
+ * 上传临时素材
+ *
+ * @return 素材的media_id列表,实际上如果有的话,只会有一个
+ */
+ @PostMapping("/upload")
+ public List uploadMedia(@PathVariable String appId, HttpServletRequest request) throws WxErrorException {
+ final WxMaService wxService = WxMaConfiguration.getMaService(appId);
+
+ CommonsMultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
+
+ if (!resolver.isMultipart(request)) {
+ return Lists.newArrayList();
+ }
+
+ MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
+ Iterator it = multiRequest.getFileNames();
+ List result = Lists.newArrayList();
+ while (it.hasNext()) {
+ try {
+ MultipartFile file = multiRequest.getFile(it.next());
+ File newFile = new File(Files.createTempDir(), file.getOriginalFilename());
+ this.logger.info("filePath is :" + newFile.toString());
+ file.transferTo(newFile);
+ WxMediaUploadResult uploadResult = wxService.getMediaService().uploadMedia(WxMaConstants.KefuMsgType.IMAGE, newFile);
+ this.logger.info("media_id : " + uploadResult.getMediaId());
+ result.add(uploadResult.getMediaId());
+ } catch (IOException e) {
+ this.logger.error(e.getMessage(), e);
+ }
+ }
+
+ return result;
+ }
+
+ /**
+ * 下载临时素材
+ */
+ @GetMapping("/download/{mediaId}")
+ public File getMedia(@PathVariable String appId, @PathVariable String mediaId) throws WxErrorException {
+ final WxMaService wxService = WxMaConfiguration.getMaService(appId);
+
+ return wxService.getMediaService().getMedia(mediaId);
+ }
+}
diff --git a/src/main/java/com/rymcu/vertical/wx/miniapp/controller/WxMaUserController.java b/src/main/java/com/rymcu/vertical/wx/miniapp/controller/WxMaUserController.java
new file mode 100644
index 0000000..1eaf208
--- /dev/null
+++ b/src/main/java/com/rymcu/vertical/wx/miniapp/controller/WxMaUserController.java
@@ -0,0 +1,93 @@
+package com.rymcu.vertical.wx.miniapp.controller;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
+import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
+import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
+import com.rymcu.vertical.wx.miniapp.config.WxMaConfiguration;
+import com.rymcu.vertical.wx.miniapp.utils.JsonUtils;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 微信小程序用户接口
+ *
+ * @author Binary Wang
+ */
+@RestController
+@RequestMapping("/wx/user/{appId}")
+public class WxMaUserController {
+ private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+ /**
+ * 登陆接口
+ */
+ @GetMapping("/login")
+ public String login(@PathVariable String appId, String code) {
+ if (StringUtils.isBlank(code)) {
+ return "empty jscode";
+ }
+
+ final WxMaService wxService = WxMaConfiguration.getMaService(appId);
+
+ try {
+ WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(code);
+ this.logger.info(session.getSessionKey());
+ this.logger.info(session.getOpenid());
+ //TODO 可以增加自己的逻辑,关联业务相关数据
+ return JsonUtils.toJson(session);
+ } catch (WxErrorException e) {
+ this.logger.error(e.getMessage(), e);
+ return e.toString();
+ }
+ }
+
+ /**
+ *
+ * 获取用户信息接口
+ *
+ */
+ @GetMapping("/info")
+ public String info(@PathVariable String appId, String sessionKey,
+ String signature, String rawData, String encryptedData, String iv) {
+ final WxMaService wxService = WxMaConfiguration.getMaService(appId);
+
+ // 用户信息校验
+ if (!wxService.getUserService().checkUserInfo(sessionKey, rawData, signature)) {
+ return "user check failed";
+ }
+
+ // 解密用户信息
+ WxMaUserInfo userInfo = wxService.getUserService().getUserInfo(sessionKey, encryptedData, iv);
+
+ return JsonUtils.toJson(userInfo);
+ }
+
+ /**
+ *
+ * 获取用户绑定手机号信息
+ *
+ */
+ @GetMapping("/phone")
+ public String phone(@PathVariable String appId, String sessionKey, String signature,
+ String rawData, String encryptedData, String iv) {
+ final WxMaService wxService = WxMaConfiguration.getMaService(appId);
+
+ // 用户信息校验
+ if (!wxService.getUserService().checkUserInfo(sessionKey, rawData, signature)) {
+ return "user check failed";
+ }
+
+ // 解密
+ WxMaPhoneNumberInfo phoneNoInfo = wxService.getUserService().getPhoneNoInfo(sessionKey, encryptedData, iv);
+
+ return JsonUtils.toJson(phoneNoInfo);
+ }
+
+}
diff --git a/src/main/java/com/rymcu/vertical/wx/miniapp/utils/JsonUtils.java b/src/main/java/com/rymcu/vertical/wx/miniapp/utils/JsonUtils.java
new file mode 100644
index 0000000..d274870
--- /dev/null
+++ b/src/main/java/com/rymcu/vertical/wx/miniapp/utils/JsonUtils.java
@@ -0,0 +1,28 @@
+package com.rymcu.vertical.wx.miniapp.utils;
+
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+
+/**
+ * @author Binary Wang
+ */
+public class JsonUtils {
+ private static final ObjectMapper JSON = new ObjectMapper();
+
+ static {
+ JSON.setSerializationInclusion(Include.NON_NULL);
+ JSON.configure(SerializationFeature.INDENT_OUTPUT, Boolean.TRUE);
+ }
+
+ public static String toJson(Object obj) {
+ try {
+ return JSON.writeValueAsString(obj);
+ } catch (JsonProcessingException e) {
+ e.printStackTrace();
+ }
+
+ return null;
+ }
+}
diff --git a/src/main/java/com/rymcu/vertical/wx/mp/controller/WxMenuController.java b/src/main/java/com/rymcu/vertical/wx/mp/controller/WxMenuController.java
index 40ad886..3feb574 100644
--- a/src/main/java/com/rymcu/vertical/wx/mp/controller/WxMenuController.java
+++ b/src/main/java/com/rymcu/vertical/wx/mp/controller/WxMenuController.java
@@ -46,9 +46,9 @@ public class WxMenuController {
public String menuCreateSample(@PathVariable String appId) throws WxErrorException, MalformedURLException {
WxMenu menu = new WxMenu();
WxMenuButton button1 = new WxMenuButton();
- button1.setType(MenuButtonType.CLICK);
- button1.setName("今日歌曲");
- button1.setKey("V1001_TODAY_MUSIC");
+ button1.setType(MenuButtonType.VIEW);
+ button1.setName("官方网站");
+ button1.setUrl("https://rymcu.com");
// WxMenuButton button2 = new WxMenuButton();
// button2.setType(WxConsts.BUTTON_MINIPROGRAM);
@@ -58,7 +58,7 @@ public class WxMenuController {
// button2.setUrl("http://mp.weixin.qq.com");
WxMenuButton button3 = new WxMenuButton();
- button3.setName("菜单");
+ button3.setName("学习教程");
menu.getButtons().add(button1);
// menu.getButtons().add(button2);
@@ -66,38 +66,26 @@ public class WxMenuController {
WxMenuButton button31 = new WxMenuButton();
button31.setType(MenuButtonType.VIEW);
- button31.setName("搜索");
- button31.setUrl("http://www.soso.com/");
+ button31.setName("51单片机");
+ button31.setUrl("https://rymcu.com/article/27");
- WxMenuButton button32 = new WxMenuButton();
- button32.setType(MenuButtonType.VIEW);
- button32.setName("视频");
- button32.setUrl("http://v.qq.com/");
-
- WxMenuButton button33 = new WxMenuButton();
- button33.setType(MenuButtonType.CLICK);
- button33.setName("赞一下我们");
- button33.setKey("V1001_GOOD");
-
- WxMenuButton button34 = new WxMenuButton();
- button34.setType(MenuButtonType.VIEW);
- button34.setName("获取用户信息");
-
- ServletRequestAttributes servletRequestAttributes =
- (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
- if (servletRequestAttributes != null) {
- HttpServletRequest request = servletRequestAttributes.getRequest();
- URL requestURL = new URL(request.getRequestURL().toString());
- String url = this.wxService.switchoverTo(appId).oauth2buildAuthorizationUrl(
- String.format("%s://%s/wx/redirect/%s/greet", requestURL.getProtocol(), requestURL.getHost(), appId),
- WxConsts.OAuth2Scope.SNSAPI_USERINFO, null);
- button34.setUrl(url);
- }
+// WxMenuButton button34 = new WxMenuButton();
+// button34.setType(MenuButtonType.VIEW);
+// button34.setName("获取用户信息");
+//
+// ServletRequestAttributes servletRequestAttributes =
+// (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+// if (servletRequestAttributes != null) {
+// HttpServletRequest request = servletRequestAttributes.getRequest();
+// URL requestURL = new URL(request.getRequestURL().toString());
+// String url = this.wxService.switchoverTo(appId).oauth2buildAuthorizationUrl(
+// String.format("%s://%s/wx/redirect/%s/greet", requestURL.getProtocol(), requestURL.getHost(), appId),
+// WxConsts.OAuth2Scope.SNSAPI_USERINFO, null);
+// button34.setUrl(url);
+// }
button3.getSubButtons().add(button31);
- button3.getSubButtons().add(button32);
- button3.getSubButtons().add(button33);
- button3.getSubButtons().add(button34);
+// button3.getSubButtons().add(button34);
this.wxService.switchover(appId);
return this.wxService.getMenuService().menuCreate(menu);
diff --git a/src/main/java/com/rymcu/vertical/wx/mp/controller/WxoAuthController.java b/src/main/java/com/rymcu/vertical/wx/mp/controller/WxoAuthController.java
index f2f6094..e5c3c4d 100644
--- a/src/main/java/com/rymcu/vertical/wx/mp/controller/WxoAuthController.java
+++ b/src/main/java/com/rymcu/vertical/wx/mp/controller/WxoAuthController.java
@@ -1,5 +1,6 @@
package com.rymcu.vertical.wx.mp.controller;
+import com.rymcu.vertical.service.WxUserService;
import com.rymcu.vertical.util.ContextHolderUtils;
import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.common.bean.WxJsapiSignature;
@@ -23,6 +24,8 @@ public class WxoAuthController {
@Resource
private WxMpService wxMpService;
+ @Resource
+ private WxUserService wxUserService;
@Value("${resource.domain}")
private String domain;
@@ -56,6 +59,7 @@ public class WxoAuthController {
}
WxMpUser wxMpUser =wxMpService.getUserService().userInfo(oAuth2AccessToken.getOpenId());
+ wxUserService.saveUser(wxMpUser,appId);
ContextHolderUtils.getSession2().setAttribute("wxUser", wxMpUser);
return "redirect:" + redirectUrl;
}
diff --git a/src/main/java/mapper/SpecialDayMapper.xml b/src/main/java/mapper/SpecialDayMapper.xml
new file mode 100644
index 0000000..d4977b7
--- /dev/null
+++ b/src/main/java/mapper/SpecialDayMapper.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/mapper/WxUserMapper.xml b/src/main/java/mapper/WxUserMapper.xml
new file mode 100644
index 0000000..228a592
--- /dev/null
+++ b/src/main/java/mapper/WxUserMapper.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file