亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

微信小程序與公眾號實現數據互通的方法

2019-11-19 11:08:17
字體:
來源:轉載
供稿:網友

公司因小程序項目先上線,公眾號后開發,接到上級的安排實現小程序打通任務,看文檔后發現:同一開發者賬號只要是在微信開放平臺綁定小程序與公眾號以后,會有一個唯一的unionid,這個unionid騰訊公司下產品共享。這個unionid就是我們進行打通的關鍵。

先說一下思路:

1.微信小程序與公眾號進行綁定后,在小程序調用wx.login()方法后會自動獲取unionid,公眾號根據官方文檔在獲取用戶基本信息后會拿到相同的unionid,openid,nickname。。。等相關信息;

2.將小程序拿到的unionid進行數據庫的更新操作,公眾號拿到的unionid等信息,新建數據庫表A進行存儲;(注:在這一步,因為我們公司的原因,我們的公眾號之前就有人關注了,那么在這之前,我通過公眾號獲取關注用戶列表獲取openid的列表,進行循環openid列表,在調用公眾號獲取用戶基本信息列表進行儲存數據庫表A,循環結束后之前關注的人的信息就儲存在數據庫A,然后在進行,這一步的操作)

3.通過公眾號關注/取關的事件相應,來進行數據庫表A的增刪操作,維護數據的新鮮度;

4.進行關聯查詢,到這一步我們會發現,通過unionid進行表的關聯后我們已經實現數據的互通了 

洋洋灑灑的說了一大堆,其實就是公眾號的兩個接口至關重要(1.關注/取關的事件相應接口     2.獲取用戶的基本信息接口)

有關于公眾號的安全域名配置,服務器域名配置以及獲取token就不在這里說了,百度一下一大堆。

代碼實現:

第一步,獲取公眾號用戶的openid列表操作,根據opneid進進行用戶的基本信息的查詢,存入數據庫操作(因為我們公司的公眾號關注人數只有1000+,所以我只調用了一次獲取關注列表的接口)

//主要代碼邏輯//獲取token AccessToken accessToken=wxUtils.getAccessToken(); String url="https://api.weixin.qq.com/cgi-bin/user/get?access_token="+accessToken.getAccessToken()+"&next_openid=";//獲取所有用戶openidJSONObject jsonObject = httpRequest(url, "GET", null);  try { if(jsonObject.getString("errcode")!=null){ } }catch(Exception e) { } WeixinUserList userList = (WeixinUserList)JSONObject.toBean(jsonObject, WeixinUserList.class); if(null==userList) {  return "無用戶"; } userList.getTotal();//關注總人數 //用戶openId 列表 WxOpenidInfo wxOpenidInfo=userList.getData(); List<String> openIdList=null; if(null!=wxOpenidInfo) { openIdList=wxOpenidInfo.getOpenid();//公眾號返回的openid列表數據  if(null!=openIdList && openIdList.size()>0) { for(String opendid:openIdList) {      //獲取用戶的基本信息(unionid機制)  url="https://api.weixin.qq.com/cgi-bin/user/info?    access_token="+accessToken.getAccessToken()+"&openid="+opendid+"&lang=zh_CN";//通過openid獲取用戶信息  jsonObject = httpRequest(url, "GET", null);   WeixinUser wxUser=(WeixinUser)JSONObject.toBean(jsonObject, WeixinUser.class);      //進行數據庫表A的儲存操作   int row = gzhService.addGZHUser(wxUser);  } }}    /** * 用戶列表  * @author 一葉知秋plus * */public class WeixinUserList{       private Integer total;//關注該公眾賬號的總用戶數    private Integer count;//拉取的OPENID個數,最大值為10000    private WxOpenidInfo data;//列表數據,OPENID的列表    private String next_openid;//拉取列表的最后一個用戶的OPENID    private int errcode;//錯誤編碼    private String errmsg="ok";//錯誤提示    public Integer getTotal() {     return total;   }    public void setTotal(Integer total) {     this.total = total;   }    public Integer getCount() {     return count;   }    public void setCount(Integer count) {     this.count = count;   }    public String getNext_openid() {     return next_openid;   }    public void setNext_openid(String next_openid) {     this.next_openid = next_openid;   }    public WxOpenidInfo getData() {     return data;   }    public void setData(WxOpenidInfo data) {     this.data = data;   }    public int getErrcode() {     return errcode;   }    public void setErrcode(int errcode) {     this.errcode = errcode;   }    public String getErrmsg() {     return errmsg;   }    public void setErrmsg(String errmsg) {     this.errmsg = errmsg;   }  }  /** * 用戶基本信息  * @author 一葉知秋plus * */  public class WeixinUser { private String subscribe;// 用戶是否訂閱該公眾號標識,值為0時,代表此用戶沒有關注該公眾號,拉取不到其余信息。 private String openid;// 用戶的標識,對當前公眾號唯一 private String nickname;// 用戶的昵稱 private String sex;// 用戶的性別,值為1時是男性,值為2時是女性,值為0時是未知 private String city;// 用戶所在城市 private String country;// 用戶所在國家 private String province;// 用戶所在省份 private String language;// 用戶的語言,簡體中文為zh_CN private List<String> tagid_list;//用戶被打上的標簽ID列表 private String unionid; //用戶的unionid private String headimgurl;//用戶的頭像     public String getHeadimgurl() { return headimgurl; } public void setHeadimgurl(String headimgurl) { this.headimgurl = headimgurl; } public String getUnionid() { return unionid; } public void setUnionid(String unionid) { this.unionid = unionid; } public String getSubscribe() { return subscribe; } public void setSubscribe(String 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 String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } 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 getProvince() { return province; } public void setProvince(String province) { this.province = province; } public String getLanguage() { return language; } public void setLanguage(String language) { this.language = language; } public List<String> getTagid_list() { return tagid_list; } public void setTagid_list(List<String> tagid_list) { this.tagid_list = tagid_list; }}  public class WxOpenidInfo { private List<String> openid;   public List<String> getOpenid() {    return openid;  }   public void setOpenid(List<String> openid) {    this.openid = openid;  }}

步驟二:關注/取關的事件響應接口

/** * 請求校驗工具類 */public class SignUtil {  // 與接口配置信息中的Token要一致,我的是明文格式  private static String token = "填寫你服務器配置時寫的token";     public static boolean checkSignature(String signature, String timestamp,      String nonce) {    //從請求中(也就是微信服務器傳過來的)拿到的token, timestamp, nonce    String[] arr = new String[] { token, timestamp, nonce };    // 將token、timestamp、nonce三個參數進行字典序排序    sort(arr);    StringBuilder content = new StringBuilder();    for (int i = 0; i < arr.length; i++) {      content.append(arr[i]);    }    MessageDigest md = null;    String tmpStr = null;     try {      md = MessageDigest.getInstance("SHA-1");      // 將三個參數字符串拼接成一個字符串進行sha1加密      byte[] digest = md.digest(content.toString().getBytes());      //將字節數組轉成字符串      tmpStr = byteToStr(digest);    } catch (NoSuchAlgorithmException e) {      e.printStackTrace();    }     content = null;    // 將sha1加密后的字符串可與signature對比,標識該請求來源于微信    return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;  }  //將加密后的字節數組變成字符串  private static String byteToStr(byte[] byteArray) {    String strDigest = "";    for (int i = 0; i < byteArray.length; i++) {      strDigest += byteToHexStr(byteArray[i]);    }    return strDigest;  }   private static String byteToHexStr(byte mByte) {    char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',        'B', 'C', 'D', 'E', 'F' };    char[] tempArr = new char[2];    tempArr[0] = Digit[(mByte >>> 4) & 0X0F];    tempArr[1] = Digit[mByte & 0X0F];     String s = new String(tempArr);    return s;  }//用于字典排序  public static void sort(String a[]) {    for (int i = 0; i < a.length - 1; i++) {      for (int j = i + 1; j < a.length; j++) {        if (a[j].compareTo(a[i]) < 0) {          String temp = a[i];          a[i] = a[j];          a[j] = temp;        }      }    }  }}  //事件響應的接口@RequestMapping(value="/GZHConcern.do") public void GZHConcern(HttpServletRequest request, HttpServletResponse response) throws IOException { String message = "success"; // 微信加密簽名  String signature = request.getParameter("signature");  // 時間戳  String timestamp = request.getParameter("timestamp");  // 隨機數  String nonce = request.getParameter("nonce");  // 隨機字符串  String echostr = request.getParameter("echostr");  PrintWriter out = response.getWriter();  // 通過檢驗signature對請求進行校驗,若校驗成功則原樣返回echostr,表示接入成功,否則接入失敗  if (SignUtil.checkSignature(signature, timestamp, nonce)) {   out.print(echostr);  //在這里相應微信的操作 }   try {  Map<String, String> map = XmlUtil.xmlToMap(request);  String fromUserName = map.get("FromUserName");//消息來源用戶標識  String toUserName = map.get("ToUserName");//消息目的用戶標識  String msgType = map.get("MsgType");//消息類型  String content = map.get("Content");//消息內容    String eventType = map.get("Event");  WeixinUser weixinUser = new WeixinUser();  if(MessageUtil.MSGTYPE_EVENT.equals(msgType)){//如果為事件類型  if(MessageUtil.MESSAGE_SUBSCIBE.equals(eventType)){//處理訂閱事件   //獲取token   String token = WXUtil.getGZHToken();   weixinUser = WXUtil.getUnionid(fromUserName, token);   //進行數據庫的操作   weixinUser.setNickname(weixinUser.getNickname());   int row = gzhService.addGZHUser(weixinUser);   //通過openid獲取用戶的數據   message = MessageUtil.subscribeForText(toUserName, fromUserName);  }else if(MessageUtil.MESSAGE_UNSUBSCIBE.equals(eventType)){//處理取消訂閱事件   message = MessageUtil.unsubscribe(toUserName, fromUserName);   weixinUser.setOpenid(fromUserName);   //進行數據庫的操作   int row = gzhService.deleteGZHUser(weixinUser);  }  } } catch (DocumentException e) {  // TODO Auto-generated catch block  e.printStackTrace(); }finally {  out.close(); } out = null; } /* * 消息處理工具類 */public class MessageUtil { public static final String MSGTYPE_EVENT = "event";//消息類型--事件 public static final String MESSAGE_SUBSCIBE = "subscribe";//消息事件類型--訂閱事件 public static final String MESSAGE_UNSUBSCIBE = "unsubscribe";//消息事件類型--取消訂閱事件 public static final String MESSAGE_TEXT = "text";//消息類型--文本消息  /* * 組裝文本消息 */ public static String textMsg(String toUserName,String fromUserName,String content){ TextMessage text = new TextMessage(); text.setFromUserName(toUserName); text.setToUserName(fromUserName); text.setMsgType(MESSAGE_TEXT); text.setCreateTime(new Date().getTime()); text.setContent(content); return XmlUtil.textMsgToxml(text); }  /* * 響應訂閱事件--回復文本消息 */ public static String subscribeForText(String toUserName,String fromUserName){ return textMsg(toUserName, fromUserName, "歡迎關注,精彩內容不容錯過?。。?); }  /* * 響應取消訂閱事件 */ public static String unsubscribe(String toUserName,String fromUserName){ //TODO 可以進行取關后的其他后續業務處理 System.out.println("用戶:"+ fromUserName +"取消關注~"); return ""; }}  /* * xml處理工具類 */public class XmlUtil { /* * xml轉map */ public static Map<String, String> xmlToMap(HttpServletRequest request) throws IOException, DocumentException{ HashMap<String, String> map = new HashMap<String,String>(); SAXReader reader = new SAXReader();  InputStream ins = request.getInputStream(); Document doc = reader.read(ins);  Element root = doc.getRootElement(); @SuppressWarnings("unchecked") List<Element> list = (List<Element>)root.elements();  for(Element e:list){  map.put(e.getName(), e.getText()); } ins.close(); return map; } /* * 文本消息對象轉xml */ public static String textMsgToxml(TextMessage textMessage){ XStream xstream = new XStream(); xstream.alias("xml", textMessage.getClass()); return xstream.toXML(textMessage); }}

ok,到這一步數據庫中有了小程序opneid unionid 公眾號opneid  unionid等用戶信息,進行關聯后就可以進行數據的查詢操作,當然小程序也可以發送公眾號模板的相應操作了。如果有更好的實現方式,歡迎各位大佬不吝賜教~

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧洲成人免费视频| 日韩小视频在线观看| 日韩高清免费观看| 国产精品欧美日韩久久| 亚洲一区精品电影| 精品久久久久久久久久久久久| 亚洲国产精品成人一区二区| 欧美激情视频给我| 欧美尺度大的性做爰视频| 久久综合久久美利坚合众国| 亚洲精品国产免费| 亚洲二区在线播放视频| 中文字幕日韩欧美精品在线观看| 岛国av一区二区在线在线观看| 国产成人精品电影久久久| 亚洲第一精品夜夜躁人人躁| 欧美成人久久久| 国产精品久久久久77777| 最近2019免费中文字幕视频三| 久久综合伊人77777蜜臀| 日韩av一卡二卡| 日韩欧美精品网址| 国产97在线|亚洲| 久久影视免费观看| 中文字幕免费精品一区高清| 久久久精品国产网站| 亚洲欧美一区二区激情| 国产成+人+综合+亚洲欧美丁香花| 中日韩美女免费视频网址在线观看| 91精品91久久久久久| 性色av一区二区三区免费| 成人黄在线观看| 欧美色视频日本高清在线观看| 欧美日本亚洲视频| 国产精品一区二区久久| 在线观看国产精品淫| 成人免费在线视频网址| 在线日韩中文字幕| 亚洲精品色婷婷福利天堂| 在线中文字幕日韩| 久久综合伊人77777| 精品国产一区二区三区久久| 亚洲人永久免费| 国产女人18毛片水18精品| 法国裸体一区二区| 国产免费成人av| 色偷偷噜噜噜亚洲男人| 久久久久亚洲精品成人网小说| 中文字幕av一区二区三区谷原希美| 91久久精品久久国产性色也91| 在线亚洲午夜片av大片| 久热精品视频在线免费观看| 自拍亚洲一区欧美另类| 色综合伊人色综合网| 中文字幕日韩在线观看| 日韩男女性生活视频| 国产suv精品一区二区| 中文字幕日韩欧美在线视频| 国产精品久久久久久久久久99| 久久久久久久久国产| 日韩在线观看电影| 在线观看日韩av| 91国在线精品国内播放| 亚洲第一天堂av| 一个色综合导航| 午夜精品一区二区三区av| 国产成人精品一区二区| 亚洲人成电影网站色www| 久久亚洲国产成人| 久久99久久99精品中文字幕| 国产欧美日韩免费| 2018中文字幕一区二区三区| 久久人91精品久久久久久不卡| xvideos亚洲人网站| 色婷婷**av毛片一区| 国产精品精品久久久| 日韩少妇与小伙激情| 38少妇精品导航| 一区二区三区视频观看| 亚洲激情视频在线| 日本久久久久久久久久久| 91成人在线观看国产| 久久久久久久影视| 国产精品视频在线播放| 91日本视频在线| 欧美日韩在线影院| 亚洲欧美精品在线| 日韩精品中文字幕视频在线| 日韩精品高清在线观看| 欧美一级片久久久久久久| 欧美又大粗又爽又黄大片视频| 国产精品久久久久久久久影视| 国产视频亚洲精品| 在线日韩中文字幕| 中文字幕亚洲无线码a| 中文字幕精品国产| 亚洲人成电影网站| 97av在线播放| 中文欧美在线视频| 亚洲一区二区日本| 久久久久久久久久久免费| 欧美韩日一区二区| 日韩av日韩在线观看| 亚洲精品在线观看www| 中文字幕av一区中文字幕天堂| 91免费看片网站| 国产精品福利小视频| 97视频在线播放| 91av福利视频| 国产精品ⅴa在线观看h| 在线播放国产一区中文字幕剧情欧美| 日韩精品在线影院| 国产欧美在线视频| 久久综合久久美利坚合众国| 国模精品视频一区二区| 欧美精品激情在线观看| 日本午夜在线亚洲.国产| 亚洲国产精品一区二区久| 国产精品视频免费在线| 国产专区精品视频| 久久精品夜夜夜夜夜久久| 亚洲va久久久噜噜噜| 久久久国产精品免费| 日韩精品在线视频观看| 精品久久中文字幕久久av| 亚洲欧美色婷婷| 久久天天躁狠狠躁夜夜爽蜜月| 国产日韩中文字幕在线| 在线视频免费一区二区| 国产福利精品av综合导导航| 国产精品专区第二| 影音先锋欧美精品| 色偷偷偷综合中文字幕;dd| 亚洲偷熟乱区亚洲香蕉av| 欧美在线视频免费观看| www.日本久久久久com.| 欧美国产在线视频| 国产成人综合久久| 国产成人精品日本亚洲| 精品久久久久久久久久ntr影视| 亚洲第一福利网站| 91在线精品视频| 中文字幕日韩在线视频| 国产91在线播放九色快色| 日韩欧美在线播放| 91高潮精品免费porn| 亚洲国产日韩欧美在线动漫| 一区二区国产精品视频| 精品久久久久久久中文字幕| 久久久国产视频91| 性色av一区二区咪爱| 国产精品大陆在线观看| 欧洲日本亚洲国产区| 国产欧美日韩亚洲精品| 欧美性猛交xxxx免费看久久久| 国产精品丝袜视频| 欧美日韩在线看| 91视频88av| 97视频在线观看播放| 日韩欧美国产黄色| 国产精品久久不能| 亚洲自拍偷拍色片视频| 久久人人爽人人爽人人片亚洲| 亚洲最大在线视频|