2019-06-26 17:57:57 biu_biu_duda 阅读数 1527
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27754 人正在学习 去看看 秦子恒

微信用户昵称特殊符号处理

微信用户昵称特殊符号处理

有时候在微信开发过程中,我们会发现有些用户微信昵称有特殊符号的会导致保存数据库失败,所以就需要用代码过滤掉这些特殊的符号,代码如下

package com.xyg.userCenter.common.utils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class EmojiUtils {
    public static String filter(String str){
        if(str == null || str.length() == 0){
            return "";
        }
        StringBuffer sb = new StringBuffer();
        for(int i=0;i<str.length();i++){
            int ch = str.charAt(i);
            int min = Integer.parseInt("E001", 16);
            int max = Integer.parseInt("E537", 16);
            if(ch >= min && ch <= max){
                sb.append("");
            }else{
                sb.append((char)ch);
            }
        }
        return sb.toString();
    }
    
    /**
     * 过滤昵称特殊表情
     */
    public static String filterName(String name) {
        if(name==null){
            return null;

        }
        if("".equals(name.trim())){
            return "";
        }

        Pattern patter = Pattern.compile("[a-zA-Z0-9\u4e00-\u9fa5]");
        Matcher match = patter.matcher(name);

        StringBuffer buffer = new StringBuffer();

        while (match.find()) {
            buffer.append(match.group());
        }

        return buffer.toString();
    }
    
    /**
     * 测试代码,里面的内容复制粘贴到微信然后发送就可以看到
     * @param args
     */
    public static void main(String[] args) {
        System.out.println(filter("啊阿萨德发秦莞尔"));
    }
}
2018-11-17 12:38:27 duoduozk 阅读数 1419
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27754 人正在学习 去看看 秦子恒

做微信公众号或者小程序开发时,经常会有需要存储用户昵称的地方,但是微信对昵称兼容比较多,像表情符号特殊符号什么的都能存进去,这样的话,如果数据库字符集设置成utf8就好报如下错误:

Incorrect string value: '\xF0\x9F\x99\x8F' for column 

这时候只需要把数据库字符集调整成utf8mb4,然后php的话,在操作数据库的时候,加上以下代码:

Db::query('SET NAMES utf8mb4');

这样就可以解决啦。

取数据的时候也加上以上代码,就可以把原来的表情等符号原封不动的再输出出来哦。

 

2018-02-13 16:29:57 sinat_38273626 阅读数 618
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27754 人正在学习 去看看 秦子恒

1- java代码

网站实现扫描二维码关注微信公众号,如果已经关注公众号就自动登陆网站并获取其微信昵称,头像等信息,如果用户未关注就等用户关注公众号后自动登陆网站

     --如果用户已关注公众号,网站端直接自动登陆,如果没有关注,就等用户关注公众号之后网站端自动登陆

     (目前已经完成了这个功能,示例网址:http://www.bid-data.com/ 爱招标——免费实时标讯推送平台,为企业负责人及商务人员即时掌控招标动态、中标检索、竞争对手中标项目分析等服务平台。)

   做微信扫码登陆,生成二维码必须是微信公众号中绑定的域这个域名,网站生成不了二维码(网站与微信服务器不是同一个域名) ,而是调用微信系统的接口获取二维码,用户扫码后也是请求微信服务器 

   

实现思路
   1,微信的系统,提供生成带参数的二维码的接口,这个参数就是唯一值(场景值)
   2,网站调用微信系统,获取生成的二维码图片
   3,用户扫码会直接调用微信服务器,将用户访问微信服务器的信息记录到redis,key就是唯一值(场景值)
   4,网站端做轮训去查询redis中是否有这个唯一值的数据,如果有就获取用户信息登录,没有就五秒一次轮训,登录后就不在做轮训(从二维码弹出之后开始做轮训,关闭二维码后停止轮训)
   5,这里的唯一值是可以自己定义的,我用的是截取了几位的时间戳 

实现步骤
(1)微信端:写一个获取带参数的临时二维码接口。
  // 临时二维码 
    private final static String QR_SCENE = "QR_SCENE";  
    // 永久二维码  
    private final static String QR_LIMIT_SCENE = "QR_LIMIT_SCENE";  
    // 永久二维码(字符串)  
    private final static String QR_LIMIT_STR_SCENE = "QR_LIMIT_STR_SCENE";   
    // 创建二维码  
    private String create_ticket_path = "https://api.weixin.qq.com/cgi-bin/qrcode/create";  
    // 通过ticket换取二维码  
    private String showqrcode_path = "https://mp.weixin.qq.com/cgi-bin/showqrcode";  

    @RequestMapping("getQrcode")
    public @ResponseBody String getQrcode(@RequestParam(value = "sceneId")int sceneId) throws Exception{


        String ticket = createTempTicket(tokenService.getToken(),"2592000",sceneId);
        LOGGER.info("get wechat qrcode  ==> start");
        LOGGER.info("sceneId :"+sceneId);
        LOGGER.info("ticket :"+ticket);
        LOGGER.info("get wechat qrcode  ==> end");
        return ticket;
    }
    /** 
     * 创建临时带参数二维码 
     * @param accessToken 
     * @expireSeconds 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。 
     * @param sceneId 场景Id 
     * @return 
     */  
    public String createTempTicket(String accessToken, String expireSeconds, int sceneId) {  

        TreeMap<String,String> params = new TreeMap<String,String>();  
        params.put("access_token", accessToken);  
        Map<String,Integer> intMap = new HashMap<String,Integer>();
        intMap.put("scene_id",sceneId);  
        Map<String,Map<String,Integer>> mapMap = new HashMap<String,Map<String,Integer>>();  
        mapMap.put("scene", intMap);  

        Map<String,Object> paramsMap = new HashMap<String,Object>();  
        paramsMap.put("expire_seconds", expireSeconds);  
        paramsMap.put("action_name", QR_SCENE);  
        paramsMap.put("action_info", mapMap);  
        String data = new Gson().toJson(paramsMap);  
        String tse = HttpRequestUtil.HttpsDefaultExecute(HttpRequestUtil.POST_METHOD,create_ticket_path,params,data);  

        JSONObject jsonObject = JSONObject.fromObject(tse);
        LOGGER.info("ticket :"+jsonObject.getString("ticket"));

     return showqrcode_path+"?ticket="+jsonObject.getString("ticket");
 }
accessToken就是调用微信接口的凭证token
(2)网站端:网站写一个调用微信生成二维码的接口

    @RequestMapping("getQrcode")
    public @ResponseBody Hashtable getQrcode(int sceneId){

        System.out.println(sceneId);

        Hashtable param = new Hashtable();
        param.put("sceneId", sceneId);

        String qrcodePath = HttpUtil.postRequest(Constant.getValue("get_qrcode"), param);

        System.out.println(" qrcodePath ==> "+qrcodePath);
        param.put("path", qrcodePath);
        return param;
    }
直接使用http调用接口就行,Constant.getValue("get_qrcode")这个就是微信提供二维码接口的url

(3)微信端:微信处理用户请求(这个地址是微信公众号填的那个地址,微信服务器会将所有用户请求转发到这个地址)

       // 事件推送
            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {
                // 事件类型
                String eventType = requestMap.get("Event");
                // 关注
                if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {

                    //获取用户信息
                    String requestUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID";
                    requestUrl = requestUrl.replace("ACCESS_TOKEN", tokenService.getToken())
                            .replace("OPENID", fromUserName);
                    JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET",null);
                    String nickname = jsonObject.getString("nickname");
                    String address = jsonObject.getString("country")+"-"+jsonObject.getString("province")+"-"+jsonObject.getString("city");
                    String headimgurl = jsonObject.getString("headimgurl");

            //将用户信息存入redis,key为唯一值(场景值)
                    Hashtable params = new Hashtable();
                    params.put("phoneIme", fromUserName);
                    params.put("state", 1);
                    params.put("location", address);
                    params.put("realName", nickname);
                    params.put("nickname", nickname);
                    params.put("headimgurl", headimgurl);
                    if(StringUtils.isNotBlank(eventKey)){
                        redisCacheTool.setDataToRedis(eventKey.replace("qrscene_", ""), 3600, params);
                        System.out.println("qrcode redis key ==> "+eventKey.replace("qrscene_", ""));
                        params.put("equipmentType", eventKey);
                    }
            //入库
                    HttpUtil.postRequest(Constant.getValue("UPDATE_USER"), params);

                }
                // 取消关注
                else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {
                    // TODO 取消订阅后用户不会再收到公众账号发送的消息,因此不需要回复
                    Hashtable params = new Hashtable();
                    params.put("phoneIme", fromUserName);
                    params.put("state", 0);
                    HttpUtil.postRequest(Constant.getValue("UPDATE_USER_ANS"), params);

                }
                // 扫描带参数二维码
                else if (eventType.toLowerCase().equals(MessageUtil.EVENT_TYPE_SCAN)) {
                    // TODO 处理扫描带参数二维码事件
if(StringUtils.isNotBlank(eventKey)){

                        String requestUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID";
                        //获取用户信息
                        requestUrl = requestUrl.replace("ACCESS_TOKEN", tokenService.getToken())
                                .replace("OPENID", fromUserName);
                        JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET",null);
                        String nickname = jsonObject.getString("nickname");
                        String address = jsonObject.getString("country")+"-"+jsonObject.getString("province")+"-"+jsonObject.getString("city");
                        String headimgurl = jsonObject.getString("headimgurl");
              //将用户信息存入redis,key为唯一值(场景值)
                        Hashtable params = new Hashtable();
                        params.put("nickname", nickname);
                        params.put("headimgurl", headimgurl);
                        params.put("location", address);
                        redisCacheTool.setDataToRedis(eventKey, 3600, params);
                        System.out.println("qrcode redis key ==> "+eventKey);
                    }


                    respContent = "返回的信息";
                    textMessage.setContent(respContent);
                    respXml = MessageUtil.messageToXml(textMessage);
                }
(4)网站端:登陆页面中做轮训,每隔几秒查询一次redis,如果有用户信息就登陆

        var timestamp = new Date().getTime() + "";
    var str = timestamp.substring(8, timestamp.length);

        window.setInterval(function() {

        getUser(cont);

    }, 10000);

        function getUser() {
        $.ajax({
            type : 'get',
            data : {
                sceneId : str
            },
            dataType : 'json',
            url : "getUser.do",
            success : function(data) {

                if (data.msg == "success") {
                    location.reload(); 
                }

            },
            error : function(data) {

                if (data.msg == "success") {
                    location.reload();
                }

            }
        });
    }        
2019-02-17 22:12:21 Roobert_Chao 阅读数 1289
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27754 人正在学习 去看看 秦子恒

微信小程序及Java后台测试登录

一、使用的工具以及开发环境

  • 微信 · 客户端
  1. 微信开发者工具 v1.02.1901230
  2. 新建快捷项目
  • 后台 · 服务端
  1. SSM 框架 / SpringBoot +Mybatis
  2. JDK 1.8 、tomcat 9.0

二、微信端登录代码。

  • 查看快捷项目模板 app.js 文件中的有关登录的内容
    app.js 模板文件

第一种方式,使用wx.getUserInfo直接获取微信头像,昵称。

  • 小程序启动之后,在 app.js 定义的 App 实例的 onLaunch 回调会被执行。onLaunch 中的三个接口
  • wx.login 接口,第二种方法细讲。
  • wx.getSetting 接口
    小程序Api
    也就是说,在调用这个接口的返回值是判断用户是否进行授权的。
    其中这个函数中有三个回调的方法。
    方法
    在回调方法中进行授权的判断
    授权成功的例子
  • wx.getUserInfo 接口
    将获得以下的信息
    简单方式获取用户信息

第二种方式:wx.login,

  • 获取更多的信息的,如微信用户的openid。
    小程序登录流程
  • 通过这种方式呢,首先要明确和第一种的区别,wx.login 是属于微信登录,而wx.getUserInfo属于获取用户的信息,前者方便后台处理逻辑,后者方便前台展示。

标准的登录步骤
1、小程序通过wx.login()接口从微信官方服务器获取用户code
注意:wx.login()接口是不会弹出授权窗口。
2、小程序把wx.login() 得到的code和AppId+AppSecret传给开发者服务器
注意:两种方式,2.1、微信端直接访问请求获取openid。2.2、后台访问请求获取openid
3、服务器经过一系列的处理,把seesion_key+open_id取出来,换成我们自定义的内容,譬如userid

  • 紧接着,确定我们后台要存储用户的那些信息,我是把用户的唯一主键与openid 结合起来使用的,这样减少一个字段,而且还能够确定登录用户的唯一性。
  • wx.login() 的两个属性值一个是code,一个是errMsg
  • AppId+AppSecret 需要登录微信公众平台的基本配置页显示,APPID是公开的,而开发者密码需要管理员手动操作。
说了这么多,还是不知道客户端怎么写的看这里。

onLoad: function () {
   var that = this;
   // 查看是否授权
   wx.getSetting({
     success: function (res) {
       if (res.authSetting['scope.userInfo']) {
         wx.getUserInfo({  // 获取用户的信息
           success: function (res) {
             var userInfo = res;
             // 用户已经授权过,不需要显示授权页面,所以不需要改变 isHide 的值
             wx.login({  // 用户登录
               success: res => {
                 console.log("用户的code:" + res.code);
                 // 传给后台,再经过解析获取用户的 openid
                 wx.request({
                   url: 'http://localhost:8080/wx/wx/addUser',
                   method: 'GET',
                   data: {
                     code: res.code,
                     encryptedData: userInfo.encryptedData,
                     iv: userInfo.iv
                   },
                   header: {
                     'content-type': 'application/json'
                   },
                   success: function (res) {
                     // this.globalData.userInfo = JSON.parse(res.data);
                     console.log('测试后台响应内容')
                     console.log(res)
                     // wx.setStorageSync('openId', res.data.openId);
                   },
                   fail: res => {
                     console.log('访问后台授权失败')
                   },
                   complete: function (res) {
                     console.log('请求后台测试登录完成')
                   }
                 })
               }
             });
           }
         });
       } else {
         // 用户没有授权
         // 改变 isHide 的值,显示授权页面
         that.setData({
           isHide: true
         });
       }
     }
   });
 }
 
  • 上面代码中,有一处需要注意的是 wx.request的url,官方是这样说明的:
    配置流程
  • 为了使测试代码正常进行,进行如下操作:
    解决办法

详细的后台代码。

  • 搭建后台代码,设计存储数据数据库(除去存储微信用户的数据表,还要有业务处理表)
  • 客户端授权处理:只有授权的用户,才可以进行数据存储,以及业务处理。
  1. 先导包。大家可以在仓库找到最新的版本。
<!-- 小程序解析用户的详细信息 -->
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk16</artifactId>
    <version>1.46</version>
</dependency>
<!-- 小程序解析用户的详细信息 -->
或者是
<dependency>
    <groupId>com.github.binarywang</groupId>
    <artifactId>weixin-java-miniapp</artifactId>
    <version>3.3.4.B</version>
</dependency>
注意

weixin-java-miniapp.jar 包中已经封装好了获取微信信息的方法,只需要传递相应的参数即可。而且后台会自动导入前一个 jar 包。所以我们这里简单的介绍一下第二个 Jar 包的使用,主要使用的是第一个 Jar 包。

bcprov-jdk16.jar

  • 获取用户的唯一标识 openid
    获取用户的唯一标识 openid
  • 解析用户信息,获取更多的用户信息
    解析用户信息,获取更多的用户信息
    管理用户信息

步骤总结:
1.首先,根据的用户的登录凭证code,判断用户登录。
2.根据小程序的 appid与secret,获取用户的 openid 与 session_key
3.根据 encryptedData、iv 以及得到的 session_key 获取更多的用户信息。

weixin-java-miniapp.jar (建议使用 SpringBoot 开发)

在这里插入图片描述
导入的所有JAR包
这个可就简单了,如下:
注入
使用

  • 在上面的步骤中,我们仅仅使用了 WxMaService,通过 @Configuration 和@Bean注入到了Spring容器中,通过@Autowire 注入到Controller中,但是我们需要的Appid与Secret 是没有加入到 WxMaService 中的,所以需要对上述内容进行修改。
SpringBoot 项目修改
  • @ConfigurationProperties(prefix = “wechat.wx”) 读取配置文件中的信息
// 编写一个 WechatMpProperties 负责读取配置信息
@Data
@ConfigurationProperties(prefix = "wechat.wx")
public class WxMaProperties {
    private List<Config> configs;
    @Data
    public static class Config {
        /**
         * 设置微信小程序的appid
         */
        private String appid;

        /**
         * 设置微信小程序的Secret
         */
        private String secret;

        /**
         * 设置微信小程序消息服务器配置的token
         */
        private String token;

        /**
         * 设置微信小程序消息服务器配置的EncodingAESKey
         */
        private String aesKey;

        /**
         * 消息格式,XML或者JSON
         */
        private String msgDataFormat;
    }
}
 
  • 接着编写 WechatMpConfiguration 配置类,WxMaService 等配置。
// 配置 WxMaService
// 配置 WxMaConfigStorage		配置将存储获取到的 WechatMpProperties  参数信息。
// 配置 WxMaMessageRouter  消息路由设置:分为模板、图片、文本、二维码。
@Component
public class WxMpServiceFactory {
    private static WxMaService wxMaService;
    private static WxMaInMemoryConfig wxMaConfigStorage;
    private static WxMaMessageRouter router = new WxMaMessageRouter(getInstance());
    private WxMpServiceFactory() {

    }
    // 产生WxmaService实例
    @Bean
    public static WxMaService getInstance() {
        if(wxMaConfigStorage == null){
            wxMaConfigStorage = new WxMaInMemoryConfig();
            wxMaConfigStorage.setAppid(WXMPConfig.APPID);
            wxMaConfigStorage.setSecret(WXMPConfig.APPSECRET);
            wxMaConfigStorage.setToken(WXMPConfig.TOKEN);
            wxMaConfigStorage.setAesKey(WXMPConfig.ENCODINGAESKEY);
            wxMaConfigStorage.setMsgDataFormat(WXMPConfig.MSGDATAFORMAT);
        }
        if (wxMaService == null) {
        	wxMaService = new WxMaServiceImpl();
        	wxMaService.setWxMaConfig(wxMaConfigStorage);
        }
        return wxMaService;
    }

    public static WxMaInMemoryConfig getWxMaConfigStorage() {
        return wxMaConfigStorage;
    }

    public static void setWxMaConfigStorage(WxMaInMemoryConfig wxMpConfigStorage) {
        WxMpServiceFactory.wxMaConfigStorage = wxMpConfigStorage;
    }

    public static void setInstance(WxMaService wxMaService) {
        WxMpServiceFactory.wxMaService = wxMaService;
    }

    public static WxMaMessageRouter getRouter() {
        return router;
    }

    public static void setRouter(WxMaMessageRouter router) {
        WxMpServiceFactory.router = router;
    }
}
  • @RequestBody 与 @ResponseBody 中返回的 JSON设置
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
/**
 * @author RobertChao
 */
public class JsonUtils {
    private static final ObjectMapper JSON = new ObjectMapper();
    static {
        JSON.setSerializationInclusion(Include.NON_NULL);
        JSON.configure(SerializationFeature.INDENT_OUTPUT, Boolean.TRUE);
    }
    public static String toJson(Object obj) {
        try {
            return JSON.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return null;
    }
}

调用  : return JsonUtils.toJson(session);
简单Web项目修改
  1. 使用工厂的方式,将内容加到Spring的Bean 中。
    设置工厂
    使用
  2. 直接使用工厂中的变量
    直接使用
使用 过程中遇到的问题
  • 问题一,工厂中加载 WxMaService 的属性内容的时候要求 httpclient 版本在 4.4 以上。
    导入报错
  • 报了一个错误为java.lang.NoClassDefFoundError: org/apache/http/ssl/TrustStrategy,
    TrustStrategy这个类找不到。
    经查看这个TrustStrategy位于org.apache.http.ssl.TrustStrategy包属于httpcore-4.4.jar包底下,或者更高版本底下,而4.4以下的版本并没有这个类,所以产生这个错误的原因就是项目底下引用了低版本的httpcore的jar包,而这个httpcore的jar包又是跟httpclient的jar包相关联的,所以httpclient的jar包也要用较高版本。
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpcore</artifactId>
    <version>4.4.3</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.1</version>
</dependency>
  • 问题二:wxMaService.getUserService().getUserInfo(sessionKey, encryptedData, iv);请求用户身份的详细资源的时,对 json 格式的要求比较严格。认真书写 Json 内容,对待每一处 格式要求。
    在这里插入图片描述
    在这里插入图片描述
  • 问题三:暂未解决,希望有大神看到能帮助。
    关闭超时的链接
    原因
    代码中会调用WxMpServiceImpl.initHttp()方法,IdleConnectionMonitorThread线程(IdleConnectionMonitorThread类)负责监控httpclient中的连接,进行清理操作。
    暂时没有解决日志出现这个的问题。

评论留下联系方式,发源码。

2017-11-23 10:06:50 qq_32737755 阅读数 2114
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27754 人正在学习 去看看 秦子恒

这篇是上一篇的前序,10万用户信息来源于公众号,为方便大家调用微信api,(方便我自己以后用到的时候能随时拿代码。。。hhhhhhhhh…)特发此文。

获取用户数据,说白点就是获取微信用户的昵称啊,头像呐… 就这些数据,通过微信接口来拿取。

获取openID列表的接口调用请求说明

http请求方式: GET(请使用https协议)

https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID

next_openid(第一个拉取的OPENID) :官方文档写的是必填,第一次请求可以空着,不需要它。不填默认从头开始拉取。ACCESS_TOKEN就不说啦,这个都不知道的话,再看看微信文档去。

返回的json数据:

{"total":2,"count":2,"data":{"openid":["","OPENID1","OPENID2"]},"next_openid":"NEXT_OPENID"}
参数                          说明
total               关注该公众账号的总用户数
count               拉取的OPENID个数,最大值为10000
data                列表数据,OPENID的列表
next_openid         拉取列表的最后一个用户的OPENID

贴出代码:

$access_token = "ACCESS_TOKEN";//获取的ACCESS_TOKEN
$url = "https://api.weixin.qq.com/cgi-bin/user/get?access_token={$access_token}";
$res = https_request($url);
$res = json_decode($res,true);
var_dump($res);
//http请求函数 支持get、post
function https_request($url,$data=null){
        $curl = curl_init();
        curl_setopt($curl,CURLOPT_URL,$url);
        curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,FALSE);
        curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,FALSE);
        if(!empty($data)){
            curl_setopt($curl,CURLOPT_POST,1);
            curl_setopt($curl,CURLOPT_POSTFIELDS,$data);
        }
        curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
        $output = curl_exec($curl);
        curl_close($curl);
        return $output;
    }

打印出来的结果

array(4) { 
    ["total"]=> int(381) ["count"]=> int(381) 
    ["data"]=> array(1) { 
            ["openid"]=> array(381) { 
                    [0]=> string(28) "openid1111111111111111111111" 
                    [1]=> string(28) "openid2222222222222222222222"
                     ...
                    [380]=> string(28) "openid**********************" 
                                    } 
                        } 
    ["next_openid"]=> string(28) "openid**********************" 
        }

一次拉取调用最多拉取10000个关注者的OpenID,可以通过多次拉取的方式来满足需求,如果关注量超过1万,继续请求就行啦,别忘了在请求参数中 加上next_openid!!!

微信模板消息详解

阅读数 475

没有更多推荐了,返回首页