[temp]微信服务号 - 模板消息推送+创建自定义菜单


import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.sie.util.HttpUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;


@Component
public class WechatMessageUtils {

    private static final Logger logger = LoggerFactory.getLogger(WechatMessageUtils.class);

    private static String appid;

    private static String appsecret;

    @Autowired
    private Environment environment;

    @PostConstruct
    public void init() {
        WechatMessageUtils.appid = environment.getProperty("config.wechat.officialAccount.appid");
        WechatMessageUtils.appsecret = environment.getProperty("config.wechat.officialAccount.appsecret");
    }

    public static JSONObject simpleData(String first, String remark, String... keywords) {
        JSONObject map = new JSONObject();
        Map<String, String> firstValue = new HashMap<String, String>();
        firstValue.put("value", first);
        map.put("first", firstValue);

        //remark
        Map<String, String> remarkValue = new HashMap<String, String>();
        remarkValue.put("value", remark);
        map.put("remark", remarkValue);

        //Keyword
        for (int i = 1, size = keywords.length; i <= size; i++) {
            String keyword = keywords[i - 1];
            Map<String, String> keywordValue = new HashMap<String, String>();
            keywordValue.put("value", keyword);
            map.put("keyword" + i, keywordValue);
        }
        return map;
    }

    /**
     * @param openid     接收人openid
     * @param templateId 模版id, 必需
     * @param data
     * @param pageUrl
     */
    public static void sendMessage(String openid, String templateId, JSONObject data, String pageUrl) {
        try {
            String accessToken = WechatTokenUtils.getTokenResult(openid, appid, appsecret);
            if (null != accessToken) {
                String apiUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken;
                JSONObject param = new JSONObject();
                param.put("touser", openid); // 接收者openid "odkMN6MGj5Mtf_AnqnPk1UqFfuX0"
                param.put("template_id", templateId);
                param.put("url", pageUrl);
                param.put("data", data);
                String result = HttpUtils.postBody(apiUrl, null, "application/json", param.toJSONString());
                logger.info(result);
            }
        } catch (Exception e) {
            logger.info("消息推送失败", e);
        }
    }

    /**
     * @param openid     接收人openid, 必需
     * @param templateId 模版id, 必需
     * @param data       模板数据, 必需
     * @param url        模板跳转链接(url和pagepath都传时,会优先跳转至小程序,微信客户端版本不支持跳小程序时,将会跳转至url)
     * @param pagepath   所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar)
     * @param appkey     所需跳转到小程序的appid
     * @param color      模板内容字体颜色
     */
    public static void sendMessage(String openid, String templateId, JSONObject data, String url, String pagepath, String appkey, String color) {
        try {
            String accessToken = WechatTokenUtils.getTokenResult(openid, appid, appsecret);
            if (null != accessToken) {
                String apiUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken;
                JSONObject param = new JSONObject();
                param.put("touser", openid); // 接收者openid "odkMN6MGj5Mtf_AnqnPk1UqFfuX0"
                param.put("template_id", templateId); // 消息模板ID
                param.put("data", data);
                if (url != null) {
                    param.put("url", url);
                }
                if (pagepath != null) {
                    /*"miniprogram":{"appid":"xiaochengxuappid12345","pagepath":"index?foo=bar"}*/
                    JSONObject miniprogram = new JSONObject();
                    miniprogram.put("appid", appkey);
                    miniprogram.put("pagepath", pagepath);
                    param.put("miniprogram", miniprogram.toString());
                }
                if (color != null) {
                    param.put("color", color);
                }
                String result = HttpUtils.postBody(apiUrl, null, "application/json", param.toJSONString());
                logger.info(result);
            }
        } catch (Exception e) {
            logger.info("消息推送失败", e);
        }
    }

    private static void createMenu(String openid) {
        try {
            String accessToken = WechatTokenUtils.getTokenResult(openid, appid, appsecret);
            if (null != accessToken) {
                String apiUrl = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + accessToken;
                JSONObject param = new JSONObject();
                JSONArray menus = new JSONArray();
                String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=XXXXX&redirect_uri=https://XXXX.com/wechat/getOpenid&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect";
                JSONObject menu2 = new JSONObject();
                menu2.put("type", "view");
                menu2.put("name", "用户绑定");
                menu2.put("url", url);
                menus.add(menu2);

                JSONObject menu1 = new JSONObject();
                menu1.put("type", "miniprogram");
                menu1.put("name", "进入小程序");
                menu1.put("appid", appid);
                menu1.put("url", "http://mp.weixin.qq.com");
                menu1.put("pagepath", "pages/login/index");
                menus.add(menu1);
                param.put("button", menus);
                String result = HttpUtils.postBody(apiUrl, null, "application/json", param.toJSONString());
                logger.info(result);
            }
        } catch (Exception e) {
            logger.info("菜单添加失败", e);
        }
    }

    private static String getNewToken(String appid, String secret) throws Exception {
        String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret;
        JSONObject result = (JSONObject) JSONObject.parse(HttpUtils.get(tokenUrl, null));
        return result.getString("access_token");
    }

    public static void main(String[] args) {
        String HOLIDAY_TEMPLATE = "XXXXXX"; // 模板消息ID
        String appkey = "XXXXX";
        WechatMessageUtils messageUtils = new WechatMessageUtils();
        messageUtils.appid = "XXXXXX";
        messageUtils.appsecret = "XXXXX";
        // 模板消息推送
        JSONObject data = messageUtils.simpleData("临时放假:", "", "学生姓名", "班级", "放假时间");
        messageUtils.sendMessage("XXXXXX", HOLIDAY_TEMPLATE, data, "https://www.baidu.com");
//        messageUtils.sendMessage("XXXXXXX", HOLIDAY_TEMPLATE, data,
//                "https://www.baidu.com", "pages/login/index", appkey, null);
    }
}

import com.alibaba.fastjson.JSONObject;
import com.kindergarten.management.util.EncryptUtils;
import com.taobao.api.internal.toplink.embedded.websocket.util.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.security.spec.AlgorithmParameterSpec;
import java.security.NoSuchAlgorithmException;
import java.util.List;


@RequestMapping("/wechat")
@Controller
public class WechatController {

    private static Logger logger = LoggerFactory.getLogger(WechatController.class);

    private final static String WECHAT_TOKEN = "1qazYUIOP";

    @Value("${config.wechat.officialAccount.appid}")
    private String appid;

    @Value("${config.wechat.officialAccount.appsecret}")
    private String appsecret;

    @Value("${config.wechat.miniPrograms-family.appid}")
    private String miniAppid;

    @Value("${config.wechat.miniPrograms-family.appsecret}")
    private String miniAppsecret;


    /**
     * 微信绑定: 微信服务号获取 openid
     */
    @RequestMapping(value = {"/getOpenid"})
    public String getOpenid(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
        String code = request.getParameter("code");//获取微信服务器授权返回的code值
        String tokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?grant_type=authorization_code";
        tokenUrl = tokenUrl + "&appid=" + appid + "&secret=" + appsecret + "&code=" + code;
        String openid = JSONObject.parseObject(HttpUtils.get(tokenUrl, null)).getString("openid");
        model.addAttribute("openId", openid);
        return "bindWechat";
    }


    /**
     * 微信登录: 微信小程序获取openid
     */
    @RequestMapping(value = "/miniPrograms/getOpenid")
    @ResponseBody
    public JSONObject getOpenid(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String code = request.getParameter("code");//获取微信服务器授权返回的code值
        String tokenUrl = "https://api.weixin.qq.com/sns/jscode2session?grant_type=authorization_code";
        tokenUrl = tokenUrl + "&appid=" + miniAppid + "&secret=" + miniAppsecret + "&js_code=" + code;
        JSONObject result = JSONObject.parseObject(HttpUtils.get(tokenUrl, null));
        return result;
    }

    /**
     * 微信登录: 解密并且获取用户手机号码
     *
     * @param encrypdata
     * @param ivdata
     * @param sessionkey
     * @param request
     * @return
     * @throws Exception 
     */
    @RequestMapping(value = "/miniPrograms/deciphering")
    public String deciphering(String openid, String encrypdata, String ivdata, String sessionkey, HttpServletRequest request) {
        byte[] encrypData = Base64.decode(encrypdata);
        byte[] ivData = Base64.decode(ivdata);
        byte[] sessionKey = Base64.decode(sessionkey);
        try {
            //{"phoneNumber":"176...9","purePhoneNumber":"176...9","countryCode":"86","watermark":{"timestamp":1557473619,"appid":"XXX"}}
            JSONObject result = JSONObject.parseObject(decrypt(sessionKey, ivData, encrypData));
            String phoneNumber = result.getString("phoneNumber");
           return phoneNumber;
        } catch (Exception e) {
            return ResultBuilder.error("授权获取手机号失败", e).build();
        }
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值