微信开发

233 阅读2分钟

netapp

natapp隧道能够产生一个公网的IP 带代理本地的服务。

公众号

国人封装的java api

接入

  • 这个url就是我们的后台controller。token是两边协商一致的。
  • 开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,这里有一些逻辑。通过之前说的国人封装的API,轻松搞定。
/**
 * 这些参数都是微信那边发来的。
 * @param response
 * @param request
 * @return 按照规则需要返回echostr。
 */
@GetMapping("/test")
public String test(HttpServletResponse response, HttpServletRequest request) {
    String signature = request.getParameter("signature");
    String timestamp = request.getParameter("timestamp");
    String nonce = request.getParameter("nonce");
    String echostr = request.getParameter("echostr");
    //验证请求签名
    if (!signature.equals(SignatureUtil.generateEventMessageSignature(wxConfig.getToken(), timestamp, nonce))) {
        System.out.println("The request signature is invalid");
        return "The request signature is invalid";
    } else {
        return echostr;
    }
}

access_token

access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。
开发者需要进行妥善保存。
access_token的存储至少要保留512个字符空间。
access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
  • API中搞定。TokenAPI.token(wxConfig.getAppID(), wxConfig.getAppsecret());

模板消息试玩

MessageAPI.messageTemplateSend(token.getAccess_token(), templateMessage);

登录验证

  • 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。
  • 在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头;
// filter 逻辑
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse resp = (HttpServletResponse) response;

    User user = (User) req.getSession().getAttribute("user");

    // 用户本来要访问的URI
    String requestURI = req.getRequestURI();

    if (null == user) {
        // 跳转微信登授权登录页面 获取用户的openID
        log.warn("用户还没有登录,请登录");
        String url = SnsAPI.connectOauth2Authorize(wxConfig.getAppID(), "http://" + wxConfig.getHost() + "/auth?uri=" + requestURI, true, null);
        log.info("授权url:" + url);
        resp.sendRedirect(url);
        return;
    } else {
        log.info("user:" + user);
        chain.doFilter(request, response);
    }
}
// AuthController
@Controller
@Slf4j
@Controller
@Slf4j
public class AuthController {
    @Autowired
    WxConfig wxConfig;

    @RequestMapping("/auth")
    public String auth(HttpServletRequest request) {
        String code = request.getParameter("code");
        log.info("code:" + code);

        SnsToken snsToken = SnsAPI.oauth2AccessToken(wxConfig.getAppID(), wxConfig.getAppsecret(), code);
        String accessToken = snsToken.getAccess_token();
        User user = SnsAPI.userinfo(accessToken, snsToken.getOpenid(), "zh_TW");
        request.getSession().setAttribute("user", user);
        log.info("uri:" + request.getParameter("uri"));
        return "redirect:" + request.getParameter("uri");
    }
}

挺实用的。