欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

微信公众号推送小程序模板消息的实现

程序员文章站 2023-12-28 15:17:10
...

微信公众号推送小程序模板消息的实现

准备:
微信小程序认证
微信公众号认证
微信开发平台认证(绑定微信小程序和公众号(unionid))
unionid:同一用户,对同一个微信开放平台下的不同应用,unionid是相同的
思路:
1. 获取小程序信息(用户openid小程序用户唯一ID)
将小程序与公众号绑定(绑定后才可获取unionid)

    /**
     * 小程序用户登录授权
     */
    @GetMapping("/getUserOpenId")
    public AjaxResult getUserOpenId(String code){
        if (StringUtils.isEmpty(code)){
            return AjaxResult.error("请输入code");
        }
        Map<String, Object> result = new LinkedHashMap();
        String oAuth = WxAppletUserInfo.getOAuth(code, userAppId, userSecret);
        JSONObject jsonObject = JSONObject.fromObject(oAuth);
        //获取openId和sessionKey
        String openid = jsonObject.get("openid").toString();
        String session_key = jsonObject.get("session_key").toString();
        String unionid= jsonObject.get("unionid").toString();
		......
    }
获取小程序信息:WxAppletUserInfo 
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.codec.binary.Base64;
import org.slf4j.LoggerFactory;
/**
 * @description: 获取小程序信息
 **/
public class WxAppletUserInfo {

    private static final org.slf4j.Logger log = LoggerFactory.getLogger(WxAppUserInfo.class);

    //获取小程序登录信息
    private final static String GET_CODE_SESSION_URL="https://api.weixin.qq.com/sns/jscode2session";

    // 算法名
    public static final String KEY_NAME = "AES";
    // 加解密算法/模式/填充方式
    // ECB模式只用**即可对数据进行加密解密,CBC模式需要添加一个iv
    public static final String CIPHER_ALGORITHM = "AES/CBC/PKCS7Padding";

    /**
     * @Title: getOAuth
     * @Description: 获取小程序用户登陆信息
     * @param @param code
     * @throws
     */
    public static String getOAuth(String code,String appId,String secret) {
        StringBuffer url = new StringBuffer(GET_CODE_SESSION_URL);
        url.append("?appid="+appId).append("&secret="+secret)
                .append("&js_code="+code)
                .append("&grant_type=authorization_code");
        return HttpUtils.get(url.toString());
    }
}

2.获取公众号的openid(公众号用户唯一ID)

  @GetMapping("/getCode")
    public AjaxResult getCode(String code){
        if (null == code || code.trim().equals("")){
            return AjaxResult.error("code为空");
        }
        //根据code获取token
        String accessTokenCode = WxAppUserInfo.getAccessTokenCode(code, wxAppId, wxAppSecret, wxAuthLoginUrl);
        //获取openid
        JSONObject jsonObject = JSONObject.fromObject(accessTokenCode);
        //获取openid和session_key
        String openid = jsonObject.get("openid").toString();
        String accessToken = jsonObject.get("access_token").toString();
        //获取用户信息
        String wxUserInfo = WxAppUserInfo.getWxUserInfo(accessToken, openid);
        String userInfo = HttpUtils.get(wxUserInfo);
        JSONObject fromObject = JSONObject.fromObject(userInfo);
        String openId = fromObject.getString("openid");
        String nickName = fromObject.getString("nickname");
        String sex = fromObject.getString("sex");
        String province = fromObject.getString("province");
        String city = fromObject.getString("city");
        String country = fromObject.getString("country");
        String headImgUrl = fromObject.getString("headimgurl");
        String privilege = fromObject.getString("privilege");
        String unionId = fromObject.getString("unionid");
        .....
       }

获取公众号信息

import net.sf.json.JSONObject;
import org.slf4j.LoggerFactory;

/**
 * @description: 获取微信公众号信息
 **/
public class WxAppUserInfo {

    private static final org.slf4j.Logger log = LoggerFactory.getLogger(WxAppUserInfo.class);

    /**
     * 获取模板消息所需要的access_token(获取微信公众号的access_token(7200秒有效))
     * @param urlToken
     * @param appId
     * @param appSecret
     * @return
     */
    public static String getAccessToken(String urlToken,String appId,String appSecret) {
        StringBuffer url = new StringBuffer(urlToken);
        url.append("?appid="+appId)
                .append("&secret="+appSecret)
                .append("&grant_type=client_credential");
        String token = HttpUtils.get(url.toString());
        log.info("获取模板消息所的认证参数access_token:{}",token);
        JSONObject Json = JSONObject.fromObject(token);
        String access_token = String.valueOf(Json.get("access_token").toString());
        return access_token;
    }

    /**
     * 根据code获取到网页授权access_token
     * @param code
     * @return  微信回调后带有的参数code值
     */
    public static String getAccessTokenCode(String code,String wxAuthLoginUrl,String appId,String appSecret) {
        StringBuffer url = new StringBuffer(wxAuthLoginUrl);
        url.append("?appid="+appId)
                .append("&secret="+appSecret)
                .append("&code="+code)
                .append("&grant_type=authorization_code");
        log.info("根据code获取到网页授权access_token:{}",url.toString());
        return HttpUtils.get(url.toString());
    }

    /**
     * 获取微信用户
     * @param accessToken
     * @param openId
     * @return
     */
    public static String getWxUserInfo(String accessToken,String openId) {
        StringBuffer url = new StringBuffer();
        url.append("?access_token="+accessToken)
                .append("&openid="+openId);
        log.info("根据access_token和openId获取微信用户信息:{}",url.toString());
        return HttpUtils.get(url.toString());
    }
}

3.推送消息服务
公众号模板申请:一个月只能有三次,审核7-15个工作日

//1.获取access_token
https请求方式: GET 
urlToken = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET'
  
String TemplateId = "";  

//2.模板消息类
//openid 是用户公众号的openid
  public static JSONObject packJsonDoctorMsg(String openid,String AppId,String pagePath){
        //医生发送公众号模板消息
        WechatTemplate wechatTemplate = new WechatTemplate();
        wechatTemplate.setTouser(openid);
        wechatTemplate.setTemplate_id(TemplateId);
        MiniprogramData miniprogramData = new MiniprogramData();
        miniprogramData.setAppid(AppId);
        miniprogramData.setPagepath(pagePath);//所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar),要求该小程序已发布,暂不支持小游戏
        wechatTemplate.setMiniprogram(miniprogramData);
        Map<String,TemplateData> dataMap = new HashMap<>();
        TemplateData title = new TemplateData();
        title.setValue("所发送消息内容");
        title.setColor("#000000");
        dataMap.put("title",title);
        TemplateData first = new TemplateData();
        first.setValue("所发送消息内容";
        first.setColor("#000000");
        dataMap.put("first",first);
        TemplateData keyword = new TemplateData();
        keyword.setValue("所发送消息内容");
        keyword.setColor("#000000");
        dataMap.put("keyword",keyword);
        TemplateData keyword = new TemplateData();
        keyword.setValue("所发送消息内容");
        keyword.setColor("#000000");
        dataMap.put("keyword", keyword);
        TemplateData keyword = new TemplateData();
        keyword.setValue("所发送消息内容");
        keyword.setColor("#000000");
        dataMap.put("keyword", keyword);
        TemplateData keyword = new TemplateData();
        keyword.setValue("所发送消息内容");
        keyword.setColor("#000000");
        dataMap.put("keyword", keyword);
        TemplateData remark = new TemplateData();
        remark.setValue("所发送消息内容");
        remark.setColor("#000000");
        dataMap.put("remark", remark);
        wechatTemplate.setData(dataMap);
        JSONObject json = JSONObject.fromObject(wechatTemplate);
        return json;
    }

//3.用户发送模板消息
JSONObject userMsgDate = MessageModel.packJsonUserMsg(openid, AppId, userPagePath);

JSONObject jsonobjUser = HttpUtils.httpRequest(send+WxAppUserInfo.getAccessToken(urlToken,appId,appSecret),"POST",userMsgDate.toString());
               

over~

相关标签: java 小程序

上一篇:

下一篇: