小程序获取公众号用户表并上公众号发送模板消息

一,微信获取公众号用户信息api接口循序

1,获取access_token

https请求方式: GET(请使用https协议)
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
微信公众平台获取access_token(详情)

2,获取openid列表

https请求方式: GET(请使用https协议)
https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID
微信公众平台获取openid列表(详情)

3,获取用户信息

https请求方式: GET(请使用https协议)
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID
微信公众平台获取用户基本信息(UnionID机制)(详情)

二,代码实现

创建GzhAccessToken实体类

在这里插入图片描述

GzhAccessToken实体类代码

package com.platform.entity.templateMessage;
import java.io.Serializable;

/**
 * AccessToken对象
 */
public class GzhAccessToken implements Serializable {
    // 获取到的凭证
    private String access_token;

    // 凭证有效时间,单位:秒
    private Integer expires_in;

    public String getAccess_token() {
        return access_token;
    }

    public void setAccess_token(String access_token) {
        this.access_token = access_token;
    }

    public Integer getExpires_in() {
        return expires_in;
    }

    public void setExpires_in(Integer expires_in) {
        this.expires_in = expires_in;
    }
}

创建GzhUser实体类

在这里插入图片描述

package com.platform.entity.templateMessage;

import com.fasterxml.jackson.annotation.JsonInclude;

import java.io.Serializable;
import java.util.Date;
import java.util.List;


/**
 * 公众号用户信息表实体
 * 表名 app_user
 *
 */

@JsonInclude(JsonInclude.Include.NON_NULL)
public class GzhUser implements Serializable {
    private static final long serialVersionUID = 1L;
    private Integer id;//id
    //用户是否订阅该公众号标识,值为0时,代表此用户没有关注该公众号,拉取不到其余信息。
    private Integer subscribe;
    //用户的标识,对当前公众号唯一
    private String openid;
    //用户昵称
    private String nickname;
    //用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
    private Integer sex;
    //省份
    private String province;
    //用户所在城市
    private String city;
    //国家
    private String country;
    //用户头像
    private String headimgurl;
    //用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间
    private Date subscribe_time;
    //只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。
    private String unionid;
    //公众号运营者对粉丝的备注,公众号运营者可在微信公众平台用户管理界面对粉丝添加备注
    private String remark;
    //用户所在的分组ID(兼容旧的用户分组接口)
    private Integer groupid;
    //用户被打上的标签ID列表
    private List<Integer> tagid_list;
    //返回用户关注的渠道来源,ADD_SCENE_SEARCH 公众号搜索,ADD_SCENE_ACCOUNT_MIGRATION 公众号迁移,ADD_SCENE_PROFILE_CARD 名片分享,ADD_SCENE_QR_CODE 扫描二维码,ADD_SCENEPROFILE LINK 图文页内名称点击,ADD_SCENE_PROFILE_ITEM 图文页右上角菜单,ADD_SCENE_PAID 支付后关注,ADD_SCENE_OTHERS 其他
    private String subscribe_scene;
    //二维码扫码场景(开发者自定义)
    private Integer qr_scene;
    //二维码扫码场景描述(开发者自定义)
    private String qr_scene_str;
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getSubscribe() {
        return subscribe;
    }

    public void setSubscribe(Integer subscribe) {
        this.subscribe = subscribe;
    }

    public String getOpenid() {
        return openid;
    }

    public void setOpenid(String openid) {
        this.openid = openid;
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public Integer getSex() {
        return sex;
    }

    public void setSex(Integer sex) {
        this.sex = sex;
    }

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public String getHeadimgurl() {
        return headimgurl;
    }

    public void setHeadimgurl(String headimgurl) {
        this.headimgurl = headimgurl;
    }

    public Date getSubscribe_time() {
        return subscribe_time;
    }

    public void setSubscribe_time(Date subscribe_time) {
        this.subscribe_time = subscribe_time;
    }

    public String getUnionid() {
        return unionid;
    }

    public void setUnionid(String unionid) {
        this.unionid = unionid;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    public Integer getGroupid() {
        return groupid;
    }

    public void setGroupid(Integer groupid) {
        this.groupid = groupid;
    }

    public List<Integer> getTagid_list() {
        return tagid_list;
    }

    public void setTagid_list(List<Integer> tagid_list) {
        this.tagid_list = tagid_list;
    }

    public String getSubscribe_scene() {
        return subscribe_scene;
    }

    public void setSubscribe_scene(String subscribe_scene) {
        this.subscribe_scene = subscribe_scene;
    }

    public Integer getQr_scene() {
        return qr_scene;
    }

    public void setQr_scene(Integer qr_scene) {
        this.qr_scene = qr_scene;
    }

    public String getQr_scene_str() {
        return qr_scene_str;
    }

    public void setQr_scene_str(String qr_scene_str) {
        this.qr_scene_str = qr_scene_str;
    }

}

遍历查询公众号用户列表,和通过公众号用户openid发送模板消息

package com.platform.api;


import com.alibaba.fastjson.JSONObject;
import com.platform.entity.ColorScheme;
import com.platform.entity.Item;
import com.platform.entity.Commodity;
import com.platform.entity.Notification;
import com.platform.entity.templateMessage.*;
import com.platform.service.*;
import com.platform.util.CommonUtil;
import com.platform.util.WX_TemplateMessage;
import com.platform.utils.R;
import com.platform.utils.ResourceUtil;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import static com.platform.client.TokenThread.gzhAccessToken;

import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * GzhUserController
 *
 */
@RestController
@RequestMapping("/api")
public class ApiGzhUserController {

    @Autowired
    private GzhUserService gzhUserService;
    @Autowired
    private NotificationService notificationService;
    @Autowired
    private ItemService itemService;
    @Autowired
    private ColorSchemeService colorSchemeService;
    @Autowired
    private CommodityService commodityService;
    /**
     * 导入公众号用户列表列表
     */
    @RequestMapping(value ="/gzhuser" ,method = RequestMethod.GET)
    public R infoGzhUser() {
        //创建一个微信模板信息工具类
        WX_TemplateMessage wx_templateMessage=new WX_TemplateMessage();
        //获取ACCESS_TOKEN
        String access_token=gzhAccessToken.getAccess_token();
        //String access_token="18_ti5Upa3aguDh3P64JqWp-vnP4Q-TMAspeLe_J7cUtkJ-78a7NsGiKSZjdzmo0vMMhZIQQAFri6MVORS2mNVJQgIhtD2DmhOxzF8MdDidJ9WhMxLRMkJYBJQPr7-14OhbvVbbwE-leDjbtz64GSWcABABNR";
        //String nextOpenid="ohZH01H7pLcBcJlTWn4eZ8wefnlQ";
        String nextOpenid="";
        //用户openid列表信息
        OpenIdList openIdList = null;
        //公众号总关注量
        int total=0;
        //当前查询条数
        int count=10000;
        for (;count>=10000;) {//用户关注量达到10000以上时进行循环,直到查询的条数小于10000时,结束循环
            synchronized (this) {
                try {
                    //循环获取用户openid列表
                    do {
                        //微信公众号获取用户列表信息接口地址
                        String requestUrl = null;
                        // 判断某字符串是否为空或长度为0或由空白符
                        if (StringUtils.isBlank(nextOpenid)) {
                            requestUrl = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN".replace("ACCESS_TOKEN", access_token);
                        } else {
                            requestUrl = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN".replace("ACCESS_TOKEN", access_token)
                                    + "&next_openid=NEXT_OPENID".replace("NEXT_OPENID", nextOpenid);
                        }
                        //将url返回结果给openIdList对象
                        CloseableHttpClient httpCilent = HttpClients.createDefault();
                        HttpGet httpGet = new HttpGet(requestUrl);

                        HttpResponse httpResponse = httpCilent.execute(httpGet);

                        if (httpResponse.getStatusLine().getStatusCode() == 200) {
                            String entity = EntityUtils.toString(httpResponse.getEntity());
                            openIdList = JSONObject.parseObject(entity, OpenIdList.class);
                            //当前查询的条数
                            count=openIdList.getCount();
                        }
                        //判断返回的数组是否为null和错误编码是否为0
                        if (openIdList != null && openIdList.getErrcode() == 0) {
                            //获取用户openid列表对象
                            WxOpenidInfo wxOpenidInfo = openIdList.getData();
                            //用户openid列表对象不为空
                            if (wxOpenidInfo != null) {
                                //用户openid列表赋给list集合
                                List<String> openids = wxOpenidInfo.getOpenid();
                                //list 集合不为null和大小大于0
                                if (openids != null && openids.size() > 0) {
                                    //查询用户信息通过每个openid
                                    for (String openid : openids) {
                                        //查询当前openid是否保存到数据库中,如果为空就在公众号查询并保存到数据库中
                                        if (gzhUserService.queryByOpenId(openid) == null) {
                                            String getUserUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN".replace("ACCESS_TOKEN", access_token)
                                                    + "&openid=OPENID".replace("OPENID", openid);

                                            JSONObject sessionData = CommonUtil.httpsRequest(getUserUrl, "GET", null);
                                            GzhUser gzhUser = new GzhUser();
                                            //gzhUser.setSubscribe(sessionData.getInteger("subscribe"));//用户是否订阅该公众号标识,值为0时,代表此用户没有关注该公众号,拉取不到其余信息。
                                            gzhUser.setOpenid(sessionData.getString("openid"));//用户的标识,对当前公众号唯一
                                            //gzhUser.setNickname(sessionData.getString("nickname"));//用户昵称
                                            //setSex(sessionData.getInteger("sex"));//用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
                                            //gzhUser.setProvince(sessionData.getString("province"));//省份
                                            //setCity(sessionData.getString("city"));//城市
                                            //gzhUser.setCountry(sessionData.getString("country"));//国家
                                            //gzhUser.setHeadimgurl(sessionData.getString("headimgurl"));//头像
                                            //gzhUser.setSubscribe_time(sessionData.getDate("subscribe_time")); //用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间
                                            gzhUser.setUnionid(sessionData.getString("unionid"));//只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。
                                            //gzhUser.setRemark(sessionData.getString("remark"));//公众号运营者对粉丝的备注,公众号运营者可在微信公众平台用户管理界面对粉丝添加备注
                                            //gzhUser.setGroupid(sessionData.getInteger("groupid"));//用户所在的分组ID(兼容旧的用户分组接口)
                                            gzhUserService.save(gzhUser);
                                       /*  //将url返回结果给openIdList对象
                                      CloseableHttpClient httpCilent1 = HttpClients.createDefault();
                                       HttpGet httpGet1 = new HttpGet(getUserUrl);
                                       // 传输的类型
                                       httpGet1.addHeader("Content-Type", "application/json");
                                       HttpResponse httpResponse1 = httpCilent1.execute(httpGet1);
                                       if (httpResponse1.getStatusLine().getStatusCode() == 200) {
                                           // 使用Apache提供的工具类进行转换成字符串
                                           String entity = EntityUtils.toString(httpResponse1.getEntity(), "UTF-8");
                                           GzhUser gzhUser = JSONObject.parseObject(entity, GzhUser.class);
                                           System.out.println("+++++++++++++"+gzhUser.getNickname());
                                           //保存公众号用户
                                           gzhUserService.save(gzhUser);
                                       }*/
                                        }
                                    }
                                }
                                //拉取列表的最后一个用户的OPENID
                                nextOpenid = openIdList.getNext_openid();
                            }

                        } else {
                            openIdList.setErrcode(40000);
                            openIdList.setErrmsg("获取关注用户列表失败");
                            return R.error(openIdList.getErrcode(), openIdList.getErrmsg());
                        }
                    }
                    while (openIdList.getCount() == 10000);
                } catch (Exception e) {
                    //LOG.error("获取用户列表失败",e);
                    openIdList.setErrcode(40000);
                    openIdList.setErrmsg("获取用户列表失败");
                    return R.error(openIdList.getErrcode(), openIdList.getErrmsg());
                }
            }
        }
        return R.ok("公众号用户表导入成功");
    }
    //缺货到货提醒
    @RequestMapping(value ="/sandmessage" ,method = RequestMethod.GET)
    public R sandTemplateMessage() {
        WX_TemplateMessage wx_templateMessage=new WX_TemplateMessage();
        //获取ACCESS_TOKEN
        String access_token=gzhAccessToken.getAccess_token();
        System.out.println("++++++++++++++"+access_token);
        //String access_token="18_hdx3bBv-TRj461zE-IoLSBHWUhxm1DEAdrW6Wf3Tj6BtXqoNfbJYqCH9LSkRl_-klX03lFvbEYz5WWiGXk_q38bEoWKgs99i587WLn48vkp30TxeNtNOjzMkf9f9FNsElNaOzRQKM9Hv5z-PMSBiAFAHNW";
        //pagepath
        String pagepath="/pages/productDetails/productDetails?colorId=";
        //公众号推送模板id
        String templateId="eCfitkX6-Lx1-BlpmZQ2iyNuqBY5LEf8cEyNafoepG4";
        //查询通知中有库存的列表
        Map<String, Object> pss = new HashMap<>();
        List<Notification> notificationList = notificationService.queryArrivalList(pss);
        for (Notification notification : notificationList) {
            //通过通知中的用户id查询到用户公众号openid
            Integer userId = notification.getUserId();
            //用户在公众号里的openid
            String openid=gzhUserService.queryByUserId(userId);

            Item item = itemService.queryObject(notification.getItemId());
            ColorScheme colorScheme = colorSchemeService.queryObject(notification.getColorId());
            Commodity commodity=commodityService.queryObject(item.getCommodityId());
            //商品路径
            pagepath=pagepath+notification.getColorId();
            //模板数据
            Map<String,TemplateData> m = new HashMap<>();
            TemplateData templateData=new TemplateData();
            //标题
            templateData.setValue("您好,您关注的商品已到货,请及时抢购。");
            templateData.setColor("#E43C52");
            TemplateData templateData1=new TemplateData();
            //订单号
            templateData1.setValue("暂未下单");
            templateData1.setColor("#000000");
            //商品
            TemplateData templateData2=new TemplateData();
            templateData2.setValue(commodity.getBrand()+item.getColorName());
            templateData2.setColor("#000000");
           /* //测试结果
            TemplateData templateData3=new TemplateData();
            templateData3.setValue("");
            templateData3.setColor("#000000");*/
            //测试结尾
            TemplateData templateData4=new TemplateData();
            templateData4.setValue("请及时购买");
            templateData4.setColor("#E43C52");

            m.put("first",templateData);
            m.put("keyword1",templateData1);
            m.put("keyword2",templateData2);
            // m.put("keyword3",templateData3);
            m.put("remark",templateData4);

            /**
             *发送模板信息
             * m 发送内容
             * openid 发送公众号用户的openid
             * access_token 登录凭证
             * pagepath 小程序跳转测试
             * templateId 公众号模板id
             */
            wx_templateMessage.sendTemplateMessage(m,openid,access_token,pagepath,templateId);
        }
        return R.ok();
    }
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值