2015-08-31 16:00:29 u010773333 阅读数 7875
  • 微信开发群发多图文消息-微信开发16(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信群发多图文消息开发是子恒老师《子恒说微信开发》视频教程的第16部。详细讲解了用php开发微信群发图文消息。内容包含图文消息前端页面,一个页面插入多个百度UEditor,群发多图文,查询和删除图文消息等等。欢迎反馈,微信号:QQ68183131

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

最近产品经理要做每天推送图文信息的功能,哎,还要超链接传递不同的参数,苦逼呀。。网上查了一些资料,下面讲解一下群发素材

要群发素材,首先要先获得素材,素材都是以图片和文字的形式推送给用户的,所以要首先获得图片和文字

微信的上传媒体接口:https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE

可以用来上传图片,上传成功返回:{"type":"TYPE","media_id":"MEDIA_ID","created_at":123456789},其中media_id就是图片在微信服务器的标识。

上传方法:

       /// <summary>
        /// 上传媒体返回媒体ID
        /// </summary>
        public static string UploadMedia(string access_token, string type, string path)
        {
            // 设置参数
            string url = string.Format("http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token={0}&type={1}", access_token, type);
            return HttpRequestUtil.HttpUploadFile(url, path);
        }

第二步:拼接图文消息素材Json字符串,其中msg就是上述的微信服务器传回来的媒体ID

       /// <summary>
        /// 拼接图文消息素材Json字符串
        /// </summary>
        public static string GetArticlesJsonStr(string access_token,string msg)
        {
            StringBuilder sbArticlesJson = new StringBuilder();

             sbArticlesJson.Append("{\"articles\":[");
                //string media_id = Tools.GetJsonValue(msg, "media_id");
               // string media_id = (msg,"media_id");
                sbArticlesJson.Append("{");
                // sbArticlesJson.Append();
                sbArticlesJson.Append("\"thumb_media_id\":\"" + msg + "\",");
                sbArticlesJson.Append("\"author\":\"" + "王华涛" + "\",");
                sbArticlesJson.Append("\"title\":\"" + "作业已经完成" + "\",");
                sbArticlesJson.Append("\"content_source_url\":\"" + "http://。。。。" + "\",");
                sbArticlesJson.Append("\"content\":\"" + "作业信息" + "\",");
                sbArticlesJson.Append("\"digest\":\"" +"您孩子的作业已经完成" + "\",");
                sbArticlesJson.Append("\"show_cover_pic\":\"1\"}");
                sbArticlesJson.Append("]}");

            return sbArticlesJson.ToString();
        } 

第三步:上传图文消息素材,其中postData就是拼接图文消息素材Json字符串,调用微信接口上传之后获得media_id

        /// <summary>
        /// 上传图文消息素材返回media_id
        /// </summary>
        public static string UploadNews(string access_token, string postData)
        {
            return HttpRequestUtil.PostUrl(string.Format("https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token={0}", access_token), postData);
        }

第四步:图文消息json,添加发送用户openid

      /// <summary>
        /// 图文消息json
        /// </summary>
        public static string CreateNewsJson(string media_id, List<string> openids)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("{\"touser\":[\"");

            foreach(string  openid in openids)    

            {

                 sb.Append(openid);
                sb.Append("\",\"");

            }
            sb.Append("\"],");
            sb.Append("\"msgtype\":\"mpnews\",");
            sb.Append("\"mpnews\":{\"media_id\":\"" + media_id + "\"}");
            sb.Append("}");
            return sb.ToString();
        }
第五步:调用微信发送素材接口,根据OpenID列表群发素材信息

        /// <summary>
        /// 根据OpenID列表群发
        /// </summary>
        public static string Send(string access_token, string postData)
        {
            return HttpRequestUtil.PostUrl(string.Format("https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token={0}", access_token), postData);
        }



2015-08-05 09:41:07 ljj9oo9 阅读数 2091
  • 微信开发群发多图文消息-微信开发16(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信群发多图文消息开发是子恒老师《子恒说微信开发》视频教程的第16部。详细讲解了用php开发微信群发图文消息。内容包含图文消息前端页面,一个页面插入多个百度UEditor,群发多图文,查询和删除图文消息等等。欢迎反馈,微信号:QQ68183131

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

   最新在做微信的多图文管理,自己写了一个模仿微信的多图文的界面,有需要的可以参取参考参考,改改就能用哈! 里面我以及集成了ajax 上传文件的插件了,不想要的可以自己换,截图如下:

代码地址

2017-04-20 20:01:56 u011972856 阅读数 5205
  • 微信开发群发多图文消息-微信开发16(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信群发多图文消息开发是子恒老师《子恒说微信开发》视频教程的第16部。详细讲解了用php开发微信群发图文消息。内容包含图文消息前端页面,一个页面插入多个百度UEditor,群发多图文,查询和删除图文消息等等。欢迎反馈,微信号:QQ68183131

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

调用微信公众平台新增永久图文素材接口时,由于微信会过滤外部的图片链接,所以开发者需要提前将图片上传获得URL,放在图文内容中使用。本文提供了使用java代码,逐个获取图文内容中的图片,并上传图片和替换图文内容中的url(另附java模拟使用curl命令,用FORM表单方式上传一个图片方法)。

//替换字符串中的src  
//ynr 图文内容
//index 从第几个字符开始替换
private String thsrc(String ynr,int index){

    int srcStart = ynr.indexOf("src=\"",index); //获取src出现的位置
    int srcEnd = ynr.indexOf("\"",srcStart+7);
    srcStart = srcStart + 5;
    String src = ynr.substring(srcStart,srcEnd); //获取图片路径

    //执行上传图片方法
    String url = "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token="+ AccessToken.getAccess_token();
    String scptjg = postFile(url,src);
    JSONObject scptjgJson = JSONObject.fromObject(scptjg);
    String newPath = scptjgJson.getString("url");
    //替换字符串中该图片路径
    ynr = ynr.replace(src, newPath);
     //查看字符串下方是否还有img标签
   int sfhyImg = ynr.indexOf("<img",srcEnd);
   if(sfhyImg==-1){
     return ynr; 
   }else{
      return thsrc(ynr, srcEnd);
   }

}

//上传图片素材/上传图文消息内的图片获取URL 
// url - 路径
//filePath 图片绝对路径
private String postFile(String url, String filePath) {
    File file = new File(filePath);
    if (!file.exists())
        return null;
    String result = "";
    try {
        URL url1 = new URL(url);
        HttpURLConnection conn = (HttpURLConnection) url1.openConnection();
        conn.setConnectTimeout(5000);
        conn.setReadTimeout(30000);
        conn.setDoOutput(true);
        conn.setDoInput(true);
        conn.setUseCaches(false);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Connection", "Keep-Alive");
        conn.setRequestProperty("Cache-Control", "no-cache");
        String boundary = "-----------------------------" + System.currentTimeMillis();
        conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);

        OutputStream output = conn.getOutputStream();
        output.write(("--" + boundary + "\r\n").getBytes());
        output.write(
                String.format("Content-Disposition: form-data; name=\"media\"; filename=\"%s\"\r\n", file.getName())
                        .getBytes());
        output.write("Content-Type: image/jpeg \r\n\r\n".getBytes());
        byte[] data = new byte[1024];
        int len = 0;
        FileInputStream input = new FileInputStream(file);
        while ((len = input.read(data)) > -1) {
            output.write(data, 0, len);
        }
        output.write(("\r\n--" + boundary + "\r\n\r\n").getBytes());
        output.flush();
        output.close();
        input.close();
        InputStream resp = conn.getInputStream();
        StringBuffer sb = new StringBuffer();
        while ((len = resp.read(data)) > -1)
            sb.append(new String(data, 0, len, "utf-8"));
        resp.close();
        result = sb.toString();
    } catch (ClientProtocolException e) {
        logger.error("postFile,不支持http协议", e);
    } catch (IOException e) {
        logger.error("postFile数据传输失败", e);
    }
    return result;
}
2019-07-25 14:29:05 shuaicenglou3032 阅读数 200
  • 微信开发群发多图文消息-微信开发16(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信群发多图文消息开发是子恒老师《子恒说微信开发》视频教程的第16部。详细讲解了用php开发微信群发图文消息。内容包含图文消息前端页面,一个页面插入多个百度UEditor,群发多图文,查询和删除图文消息等等。欢迎反馈,微信号:QQ68183131

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

最近遇到个需求,对方搞了个公众号,在上面发布了一些图文消息,他们想在子菜单里搞个第三方网页,点击进去能看到这个公众号发布的所有图文消息,我研究了下,具体实现如下:

0x00准备工作

根据公众平台技术文档所说的,首先需要在微信公众平台上开启开发者密码,

登录微信公众平台官网后,在公众平台官网的开发-基本设置页面,勾选协议成为开发者,点击“修改配置”按钮,填写服务器地址(URL)、Token和EncodingAESKey,其中URL是开发者用来接收微信消息和事件的接口URL。Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。

在这里插入图片描述

我们也可以不需要实际公众号,直接去申请一个测试公众号,但是测试公众号有一个缺点就是获取图文的时候图文数量为0,不方便后续的实验,所以有条件可以先申请一个公众号。

然后第三方服务器要验证消息来自微信服务器,此处给出springmvc的验证消息的Controller代码如下:

@Controller
public class MainController {
	
	/**
	 * 检验signature对请求进行校验,确认此次请求来自微信服务器,若确认此次GET请求来自微信服务器,原样返回echostr参数内容,接入生效
	 * @param request
	 * @return
	 */
	@RequestMapping(value="/signatureCheck.do")
	@ResponseBody
    public String writeByHand(HttpServletRequest request)
    {
		String signature = request.getParameter("signature");
		String timestamp = request.getParameter("timestamp");
		String nonce = request.getParameter("nonce");
		String echostr = request.getParameter("echostr");
		String token = "aaa";    //token自己设置
		//对timestamp、nonce、token进行字典序排序
		String[] parameters = {timestamp,nonce,token};
		ArrayList<String> list = new ArrayList<>();
		for(String s:parameters) list.add(s);
		Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                try {
                    // 取得比较对象的汉字编码,并将其转换成字符串
                    String s1 = new String(o1.toString().getBytes("GB2312"), "ISO-8859-1");
                    String s2 = new String(o2.toString().getBytes("GB2312"), "ISO-8859-1");
                    // 运用String类的 compareTo()方法对两对象进行比较
                    return s1.compareTo(s2);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return 0;
            }
        });// 根据元素的自然顺序 对指定列表按升序进行排序。
		//将上述三个字符串拼接后sha1加密
		StringBuilder finalString  = new StringBuilder();
		for(String s:list) finalString.append(s);
		String result = null;
		try {
			result = Enc_decTools.SHA1Encode(finalString.toString());
		} catch (Exception e) {
			e.printStackTrace();
		}
		if(signature==null) {
			return "fail";  //非微信服务器发来的消息
		}else {
			if(signature.equals(result)) {
				return echostr;
			}else {
				return "fail";
			}
		}		
    }
}

其中,SHA1加密的代码如下:

/**
	 * SHA1对字符串进行加密
	 * @param inStr
	 * @return
	 * @throws Exception
	 */
	public static String SHA1Encode(String inStr) throws Exception {
        MessageDigest sha = null;
        try {
            sha = MessageDigest.getInstance("SHA");
        } catch (Exception e) {
            System.out.println(e.toString());
            e.printStackTrace();
            return "";
        }
 
        byte[] byteArray = inStr.getBytes("UTF-8");
        byte[] md5Bytes = sha.digest(byteArray);
        StringBuffer hexValue = new StringBuffer();
        for (int i = 0; i < md5Bytes.length; i++) {
            int val = ((int) md5Bytes[i]) & 0xff;
            if (val < 16) {
                hexValue.append("0");
            }
            hexValue.append(Integer.toHexString(val));
        }
        return hexValue.toString();
    }

0x01 AccessToken

准备工作完成后,我们的服务器就可以通过微信的验证,从它那里拿到accesstoken,这个accesstoken等于是获取信息的凭证,目前有效期2小时。2小时后需要重新获取。
此外,获取AccessToken是通过https get请求,此处给出通过httpClient向微信服务器发起https get请求的代码:

/**
	 * 发起https get请求并获得返回值,值为字符串
	 * @param url
	 * @return
	 * @throws IOException
	 */
	public static String getSSL(String url) throws IOException {
	    CloseableHttpClient httpclient = createSSLInsecureClient();
	    CloseableHttpResponse response = null;
	    String content = null;
	    try {
	        HttpGet httpget = new HttpGet(url);
	        RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(5000).setConnectTimeout(5000)
	                    .setConnectionRequestTimeout(5000).build();
	        httpget.setConfig(requestConfig);
	        response = httpclient.execute(httpget);
	        HttpEntity entity = response.getEntity();
	        if (entity != null) {
	            content = EntityUtils.toString(entity);
	            EntityUtils.consume(entity);
	        }
	    } catch (ParseException e) {
	        throw e;
	    } catch (IOException e) {
	        throw e;
	    } finally {
	        if (response != null) {
	            try {
	                response.close();
	            } catch (IOException e) {
	                throw e;
	            }
	        }
	        if (httpclient != null) {
	            try {
	                httpclient.close();
	            } catch (IOException e) {
	            	throw e;
	            }
	        }
	    }
	    return content;
	}
	 
	private static CloseableHttpClient createSSLInsecureClient() {
	    try {
	        SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
	            @Override
	            public boolean isTrusted(java.security.cert.X509Certificate[] arg0, String arg1) {
	                return true;
	            }
	        }).build();
	        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);
	        return HttpClients.custom().setSSLSocketFactory(sslsf).build();
	    } catch (KeyManagementException e) {
	        e.printStackTrace();
	    } catch (NoSuchAlgorithmException e) {
	        e.printStackTrace();
	    } catch (KeyStoreException e) {
	        e.printStackTrace();
	    }
	    return HttpClients.createDefault();
	}

调用getSSL方法即可。此外,要使用httpClient需要导入相应的jar包:
jar包
哦忘了说,现在微信公众号修改了规则,还得在微信公众平台设置IP白名单才能拿到AccessToken,这点也需要注意设置,否则会出错。

0x02 获取素材列表

拿到AccessToken就可以把它拿来获取图文了。获取图文的逻辑如下:
用AccessToken获取图文列表
随后计算是否超过一次获取图文的最大限制数量
根据图文列表中的id逐一获取图文消息
现在图文列表的结构体里已经包含了图文的url,不需要像以前一样再根据素材的id请求一次获取永久素材。
具体代码如下:

private static final int MAXARTICLENUM = 20;   //每次最多获取的图文列表数量,一次只能拉取20条图文
	private static final String NEWS = "news";     //获取图文类素材
	private static final String APPID = "yongbubiandexinshishabi";  //此处填你的开发者ID(APPID)
	private static final String SECRET = "xxxxxxx";  //开发者密码
	private static final String ACCESSTOKENURL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+APPID+"&secret="+SECRET; //获取accessToken的url
	public List<Article> getArticleList(){
		String accessJson = null;
	    try {
	    	accessJson = HttpsRequest.getSSL(ACCESSTOKENURL);
	    } catch (IOException e) {
			e.printStackTrace();
		}
	    if(accessJson!=null) {
	    	HashMap<String, String> token =  JSON.parseObject(accessJson, HashMap.class);
	    	String access_token = token.get("access_token");
	    	//获取素材总数,若图文数量为0则停止下一步操作
	    	String url = "https://api.weixin.qq.com/cgi-bin/material/get_materialcount?access_token="+access_token;
	    	String jsonArticleCount = null;
	    	try {
				jsonArticleCount = HttpsRequest.getSSL(url);
			} catch (IOException e) {
				e.printStackTrace();
			}
	    	if(jsonArticleCount!=null) {
	    		HashMap<String, Integer> mediaCount = JSON.parseObject(jsonArticleCount, HashMap.class);
	    		//获取图文总数
	    		int articleNum = mediaCount.get("news_count");
	    		if(articleNum>0) { //若有图文则循环拉取图文列表(一次最多只能获取20个图文的列表)
	    			url = "https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token="+access_token;
	    			if(articleNum<=MAXARTICLENUM) {   //总数小于等于20条,只需获取一次
	    				JSONObject parameters = new JSONObject();
	    				parameters.put("type", NEWS);
	    				parameters.put("offset",0);
	    				parameters.put("count", articleNum);
	    				JSONObject jsonArticleList = null;  //Json格式的图文列表
	    				try {
							jsonArticleList = HttpsRequest.sendJsonByPost(url, parameters);
						} catch (Exception e) {
							e.printStackTrace();
						}
	    				List<Article> articleList = null;
	    				//此处默认拆分多图文消息,数据库里仅存储单图文,如需显示多图文需在前端另作处理,将素材id相同的图文集合起来。
	    				if(jsonArticleList!=null) {
	    					articleList = new ArrayList<>();
	    					JSONArray items = (JSONArray)jsonArticleList.get("item");
	    					for(int i=0;i<items.size();i++) {    //循环遍历每个图文消息
	    						JSONObject item = (JSONObject) items.get(i);
	    						int update_timestamp = (Integer)item.get("update_time");
	    						Date update_time = DateTools.timestampToDate(Integer.toString(update_timestamp), null);
	    						JSONObject itemContent = (JSONObject) item.get("content");
	    						String media_id = (String)item.get("media_id");
	    						JSONArray newsItem = (JSONArray) itemContent.get("news_item");
	    						for(int j=0;j<newsItem.size();j++) {
	    							JSONObject articleItem = (JSONObject) newsItem.get(j);
	    							Article article = new Article();
	    							article.setArticle_id(UUID.randomUUID().toString());   //随机分配一个id作为主键
		    						article.setCover_address((String)articleItem.get("thumb_url"));  //封面图片地址
		    						article.setDigest((String)articleItem.get("digest"));                //摘要
		    						article.setThumb_media_id((String)articleItem.get("thumb_media_id"));//封面图片id
		    						article.setTitle((String)articleItem.get("title"));                  //标题
		    						article.setUrl((String)articleItem.get("url"));               //图文地址
		    						article.setMedia_id(media_id);            //图文所属的素材id
		    						article.setUpdate_time(update_time);      //图文所属素材的最后编辑时间
		    						articleList.add(article);
	    						}
	    					}
	    					}
	    				if(articleList!=null) {
	    					return articleList;
	    				}else {     //图文列表获取失败
							return null;
						}
	    			}else {     //图文数量大于20,计算获取次数和偏移量,循环拉取数据
	    				//计算获取次数
	    				int getNum = articleNum%MAXARTICLENUM==0?articleNum/MAXARTICLENUM:articleNum/MAXARTICLENUM+1;
	    				List<Article> articleList = new ArrayList<>();
	    				for (int i = 0; i < getNum; i++) {
							//计算偏移量,即post请求参数里的offset
	    					int offset = i*MAXARTICLENUM;
	    					System.out.println("偏移量:"+offset);
	    					JSONObject parameters = new JSONObject();
		    				parameters.put("type", NEWS);
		    				parameters.put("offset",offset);
		    				parameters.put("count", MAXARTICLENUM);
		    				JSONObject jsonArticleList = null;  //Json格式的图文列表
		    				try {
								jsonArticleList = HttpsRequest.sendJsonByPost(url, parameters);
							} catch (Exception e) {
								e.printStackTrace();
							}
		    				//此处默认拆分多图文消息,数据库里仅存储单图文,如需显示多图文需在前端另作处理,将素材id相同的图文集合起来。
		    				if(jsonArticleList!=null) {
		    					JSONArray items = (JSONArray)jsonArticleList.get("item");
		    					for(int j=0;j<items.size();j++) {    //循环遍历每个图文消息
		    						JSONObject item = (JSONObject) items.get(j);
		    						int update_timestamp = (Integer)item.get("update_time");
		    						Date update_time = DateTools.timestampToDate(Integer.toString(update_timestamp), null);
		    						JSONObject itemContent = (JSONObject) item.get("content");
		    						String media_id = (String)item.get("media_id");
		    						JSONArray newsItem = (JSONArray) itemContent.get("news_item");
		    						for(int k=0;k<newsItem.size();k++) {
		    							JSONObject articleItem = (JSONObject) newsItem.get(k);
		    							Article article = new Article();
		    							article.setArticle_id(UUID.randomUUID().toString());   //随机分配一个id作为主键
			    						article.setCover_address((String)articleItem.get("thumb_url"));  //封面图片地址
			    						article.setDigest((String)articleItem.get("digest"));                //摘要
			    						article.setThumb_media_id((String)articleItem.get("thumb_media_id"));//封面图片id
			    						article.setTitle((String)articleItem.get("title"));                  //标题
			    						article.setUrl((String)articleItem.get("url"));               //图文地址
			    						article.setMedia_id(media_id);            //图文所属的素材id
			    						article.setUpdate_time(update_time);      //图文所属素材的最后编辑时间
			    						articleList.add(article);
		    						}
		    					}
		    				}else {        //图文列表获取失败
		    					return null;
		    				}
						}
	    				return articleList;
	    			}
	    		}else {    //图文数量为0
					return new ArrayList<>();   //ArrayList初始容量为0,故不再显式指定初始容量
				}
	    	}else {        //图文总数获取失败
				return null;
			}
	    }else {      //accessToken获取失败
			return null;
		}
	}

此外Json转换方面我是用的是fastjson,就是阿里开发的那个
由于需要发起https post请求,因此给出发起https post请求的代码:

/**
	 * 以Post方式发送参数为json形式的请求并获取返回值后转成json对象
	 * @param url
	 * @param parameters
	 * @return
	 * @throws Exception
	 */
	public static JSONObject sendJsonByPost(String url,JSONObject parameters) throws Exception {
		CloseableHttpClient httpClient = HttpClients.createDefault();
		HttpPost httpPost = new HttpPost(url);
		httpPost.addHeader(HTTP.CONTENT_TYPE, "application/json");
		httpPost.setHeader("Accept","application/json");
		StringEntity se = new StringEntity(parameters.toString());
		se.setContentType("text/json");
		httpPost.setEntity(se);
		HttpResponse response=httpClient.execute(httpPost);
		//输出调用结果
		if(response != null && response.getStatusLine().getStatusCode() == 200) {
		String result = EntityUtils.toString(response.getEntity(),"UTF-8");//此处不加UTF-8会导致响应结果出现中文乱码
		JSONObject obj = JSONObject.parseObject(result);
		return obj;
		}else {
			return null;
		}
	}

最后附java文件以及jar包:
代码

2015-05-09 10:42:00 tang05709 阅读数 11986
  • 微信开发群发多图文消息-微信开发16(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信群发多图文消息开发是子恒老师《子恒说微信开发》视频教程的第16部。详细讲解了用php开发微信群发图文消息。内容包含图文消息前端页面,一个页面插入多个百度UEditor,群发多图文,查询和删除图文消息等等。欢迎反馈,微信号:QQ68183131

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

既然自己开发,就需要获取到数据,并给出编号;

这个也很简单,根据api能很容易拿到数据,但是封面图片的地址我在写这个记录的时候还是没有拿到,不知道是我的方法不对,还是微信没有这个接口,因为发送图文信息需要一个图片地址链接;因为我要个文章编号,所以我需要一条一条获取,微信可以一次获取20条数据。

1、获取token;

2、获取文章数量

3、获取文章列表;


获取token

https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
参数 是否必须 说明
grant_type 获取access_token填写client_credential
appid 第三方用户唯一凭证
secret 第三方用户唯一凭证密钥,即appsecret

wchat.php


/**
	* 获取access_token
	*grant_type 获取access_token填写client_credential
	*appid 第三方用户唯一凭证
	*secret 第三方用户唯一凭证密钥,即appsecret
	*/
	public function get_access_token()
	{
		//https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
		$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".APPID."&secret=".SECRET;
		$response = file_get_contents($url);
		//返回数据格式:{"access_token":"ACCESS_TOKEN","expires_in":7200}
		//expires_in:凭证有效时间
		$res = json_decode($response, true);
		return $res['access_token'];
	}
获取这个是get就可以,所以可以直接用file_get_contents


获取文章数量

wchat.php


https://api.weixin.qq.com/cgi-bin/material/get_materialcount?access_token=ACCESS_TOKEN
{
  "voice_count":COUNT,
  "video_count":COUNT,
  "image_count":COUNT,
  "news_count":COUNT
}

/*
	*获取文章数量
	*/
	public function get_article_count($access_token)
	{
		//https://api.weixin.qq.com/cgi-bin/material/get_materialcount?access_token=ACCESS_TOKEN
		$url = "https://api.weixin.qq.com/cgi-bin/material/get_materialcount?access_token=".$access_token;
		$response = file_get_contents($url);
		$res = json_decode($response, true);
		return $res;
	}


获取文章列表

https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=ACCESS_TOKEN
参数 是否必须 说明
type 素材的类型,图片(image)、视频(video)、语音 (voice)、图文(news)
offset 从全部素材的该偏移位置开始返回,0表示从第一个素材 返回
count 返回素材的数量,取值在1到20之间
{
   "total_count": TOTAL_COUNT,
   "item_count": ITEM_COUNT,
   "item": [{
       "media_id": MEDIA_ID,
       "content": {
           "news_item": [{
               "title": TITLE,
               "thumb_media_id": THUMB_MEDIA_ID,
               "show_cover_pic": SHOW_COVER_PIC(0 / 1),
               "author": AUTHOR,
               "digest": DIGEST,
               "content": CONTENT,
               "url": URL,
               "content_source_url": CONTETN_SOURCE_URL
           },
           //多图文消息会在此处有多篇文章
           ]
        },
        "update_time": UPDATE_TIME
    },
    //可能有多个图文消息item结构
  ]
}

/*
	*获取文章列表
	*type 素材的类型:图片(image)、视频(video)、语音 (voice)、图文(news)
	*offset 从全部素材的该偏移位置开始返回,0表示从第一个素材 返回
	*count 返回素材的数量,取值在1到20之间
	*/
	public function get_article_list($type, $offset, $count, $access_token)
	{
		//https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=ACCESS_TOKEN
	
		$url = "https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=".$access_token;
        $data = '{"type":"'.$type.'","offset":"'.$offset.'","count":"'.$count.'"}';
		//返回的数据
		$response = $this->get_response_post($url, $data);
		//echo strip_tags($response);
		$res = json_decode($response, true);
		return $res;
	}

public function get_response_post($url, $data)
	{
		$curl = curl_init($url);
		curl_setopt($curl, CURLOPT_HEADER, 0);//过滤头部
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//获取的信息以文件流的形式返回,而不是直接输出。
		curl_setopt($curl,CURLOPT_POST,true); // post传输数据
		curl_setopt($curl,CURLOPT_POSTFIELDS,$data);// post传输数据
		$responseText = curl_exec($curl);
		curl_close($curl);
	
	    return $responseText;
	}



插入数据


/*插入数据库*/
	public function import_news($data)
	{
		
		$sql = "INSERT INTO xxx (media_id,cat_id,keywords,news_sn,title,thumb_media_id,show_cover_pic,author,digest,content,url,content_source_url,update_time, msg_type)".
		       " VALUES('".$data['media_id']."', 0, '', '', '".$data['title']."', '".$data['thumb_media_id']."','".$data['show_cover_pic']."', '".$data['author']."','".$data['digest']."','".$data['content']."','".$data['url']."','".$data['content_source_url']."',".$data['update_time'].", 'news')";
		$res = $this->dbhc->qry($sql);
		$last_id = mysql_insert_id();
		$format_count = sprintf("%05u", $last_id);
		$sql = "UPDATE xxx SET news_sn='".$format_count."' WHERE id=".$last_id;
		$this->dbhc->qry($sql);
		return $res;
	}

因为编辑有时候可能忘了,有时候有记起来了,所以我弄了填写数量插入每天更新一条

if($act == "importone")
{
	
	$access_token = $hcwechat->get_access_token();
	$list = $hcwechat->get_article_list('news', 0, 1, $access_token);
    $res = import_opearte($list);
    foreach ($res as $key => $val) {
    	$count = $op->get_news_media_id($val['media_id']);

    	if($count<=0)
		{
			$op->import_news($val['list']);
		}
    }    
    header("Location:list.php");
}

elseif($act == "import")
{
	
	$num = intval($_POST['num']);
	$hcwechat = new hcWechat();
	$access_token = $hcwechat->get_access_token();
    $count = $hcwechat->get_article_count($access_token);
    $news_count = $count['news_count'];
    if($num>$news_count)
    {
    	$num = $news_count;
    }
    for ($i=1; $i <= $num; $i++) 
    { 
    	$start = $num-$i;
    	$list = $hcwechat->get_article_list('news', $start, 1, $access_token);
    	$res = import_opearte($list);
	    foreach ($res as $key => $val) {
	    	$count = $op->get_news_media_id($val['media_id']);
	    	if($count<=0)
			{
				$op->import_news($val['list']);
			}
	    }   
    }
    header("Location:list.php");
}

这里对返回回来的数据稍微处理下

function import_opearte($list)
{
	$res = array();
	foreach ($list['item'] as $key => $val) 
	{
		foreach ($val['content']['news_item'] as $k => $v) 
		{
			$data = array(
				'media_id'           => $val['media_id'],
				'update_time'        => $val['update_time'],
				'title'              => $v['title'],
				'thumb_media_id'     => $v['thumb_media_id'],
				'show_cover_pic'     => $v['show_cover_pic'],
				'author'             => $v['author'],
				'digest'             => $v['digest'],
				'content'            => $v['content'],
				'url'                => $v['url'],
				'content_source_url' => $v['content_source_url'],
				);
			$res[]['media_id'] = $val['media_id'];
			$res[]['list'] = $data;
		}
    }
	return $res;	
}

上面有个thumb_media_id,微信解释是图文消息的封面图片素材id(必须是永久mediaID),但是发送图文信息时需要的是图片的地址,目前就这个还不知道咋弄。有知道的请不吝赐教,谢谢!

微信开发入门小结

阅读数 639

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