2016-12-27 16:31:38 getluo 阅读数 1358
  • 微信公众平台模板消息开发-微信开发14(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信公众平台模板消息开发是子恒老师《子恒说微信开发》视频教程的第14部。详细讲解了用php开发微信公众平台模板消息。内容包含设置模板所属行业,获取微信模板ID,用公众号发送微信模板消息等等。欢迎反馈,微信号:QQ68183131

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

首先需要公众号有模板消息的权限,这里不多说明了。


要实现的功能就是在第三方网站通过调用接口在对给用户发消息,当然也可以给用户标签组群发消息。


获取access_token代码:

$weixin_appid = "";
$weixin_secret = "";
$weixin_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$weixin_appid."&secret=".$weixin_secret;
$weixin_return = get_url_contents ( $weixin_url );
$weixin = json_decode ( $weixin_return );
$access_token = $weixin->access_token;
//模板ID
$template_id = "";

发送消息代码:

				$dataarray = array(
						"touser"=>$openid,//用户的openid
						"template_id"=>$template_id,//消息模板id
						"url"=>$_POST['yanbao_url'],
						"data"=>array(
						    "first"=>array(
				                       "value"=>$_POST['yanbao_title'],
				                       "color"=>"#173177"
				                    ),
				                    "keyword1"=>array(
				                       "value"=>$_POST['yanbao_name'],
				                       "color"=>"#173177"
				                    ),
				                    "keyword2"=>array(
				                       "value"=>$_POST['yanbao_desc'],
				                       "color"=>"#173177"
				                    ),
				                    "remark"=>array(
				                       "value"=>$_POST['yanbao_more'],
				                       "color"=>"#173177"
				                    )
								)
				            );
				$data = json_encode($dataarray);
				$output = json_decode(do_post($url,$data));//do_post是模拟post的函数,请自行定义
				if($output->errcode == '0'){
					echo '<div class="updated"><p>发送成功!</p></div>';
				}else{
					echo '<div class="error"><p>发送失败!错误码:'.$output->errcode.'</p></div>';
				}

获取用户标签代码:

				<tr valign="top">
					<th scope="row"><label>用户标签</label></th>
					<td>
						<select name="yanbao_user_tag" id="yanbao_user_tag" style="min-width: 150px">
							<option value="">请选择</option>
							<option value="all">所有用户</option>
							<?php 
								$yanbao_user_tag_url = "https://api.weixin.qq.com/cgi-bin/tags/get?access_token=".$access_token;
								$yanbao_user_tag_return = get_url_contents ( $yanbao_user_tag_url );
								$yanbao_user_tag = json_decode ( $yanbao_user_tag_return );
								$tags = $yanbao_user_tag->tags;
								foreach ($tags as $tag) {
									echo '<option value="'.$tag->id.'">'.$tag->name.'('.$tag->count.')</option>';
								}
							?>		
						</select>
						<span class="description">(选择了用户标签就是<strong>群发</strong>给该标签下的用户)</span>
					</td>
				</tr>

获取用户代码:

<tr valign="top">
					<th scope="row"><label>用户</label></th>
					<td>
						<select name="yanbao_user" id="yanbao_user">
							<option selected="selected" value="">请选择</option>
							<?php 
								/*
								$yanbao_user_url = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=".$access_token."&next_openid=";
								$yanbao_user_return = get_url_contents ( $yanbao_user_url );
								$yanbao_user = json_decode ( $yanbao_user_return );
								$openids = $yanbao_user->data->openid;
								foreach ($openids as $openid) {
									$added_user = Moge_check_weixin_user_added($openid);
									if($added_user){
										echo '<option value="'.$openid.'">'.$added_user->nickname.'</option>';
									}else{
										$user = Moge_weixin_get_user_info($access_token,$openid);
										$wpdb->query("insert into ".$wpdb->prefix."erphp_weixin_users (openid,nickname) values('".$openid."','".$user->nickname."')");
										echo '<option value="'.$openid.'">'.$user->nickname.'</option>';
									}
								}*/
								
								$weixin_users = Moge_get_weixin_users();//获取本地数据库里的微信用户函数
								if($weixin_users){
									foreach ($weixin_users as $user) {
										echo '<option value="'.$user->openid.'">'.$user->nickname.'</option>';
									}
								}
								
							?>
						</select>
						<span class="description">(若已选择了用户标签,此项选择就无效了。)</span>
					</td>
				</tr>


这里主要遇到一个问题就是如果高效快速的获取用户列表的昵称(nickname),通过以下的接口

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

只能获取用户的openid,我尝试过针对每个用户获取其详细资料,结果页面直接卡死了(用户数量太多)。虽然看到有批量获取资料,但是不适合用,最后没办法,只能先循环获取然后存在本地数据库,定期获取更新下数据库了,有个弊端就是取消关注的人还是会在本地数据库里。

2018-12-19 13:20:51 yw8886484 阅读数 766
  • 微信公众平台模板消息开发-微信开发14(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信公众平台模板消息开发是子恒老师《子恒说微信开发》视频教程的第14部。详细讲解了用php开发微信公众平台模板消息。内容包含设置模板所属行业,获取微信模板ID,用公众号发送微信模板消息等等。欢迎反馈,微信号:QQ68183131

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

PHP实现微信模板消息推送

    本篇文章博主主要是想和大家分享PHP实现微信模板消息推送的问题,下面我们就一块来看一下PHP如何实现微信模板消息推送,文章有具体的代码展现,具有一定的参考价值,对微信开发感兴趣的小伙伴们可以参考一下。

1、微信公众号模板消息配置

2、PHP代码

/**
* 发送模板消息
*/
 public function send_notice(){
 //获取access_token
 if ($_COOKIE['access_token']){
 $access_token2=$_COOKIE['access_token'];
 }else{
 $json_token=$this>curl_post("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$appsecret.'");
 $access_token1=json_decode($json_token,true);
 $access_token2=$access_token1['access_token'];
 setcookie('access_token',$access_token2,7200);
 }
 //模板消息
 $json_template = $this->json_tempalte();
 $url="https://api.weixin.qq.com/cgi- bin/message/template/send?access_token=".$access_token2;
 $res=$this->curl_post($url,urldecode($json_template));
 if ($res['errcode']==0){
 return '发送成功';
 }else{
 return '发送失败';
 }
 }
 /**
 * 将模板消息json格式化
 */
 public function json_tempalte(){
 //模板消息
 $template=array(
 'touser'=>'.$openid.', //用户openid
 'template_id'=>".$tenpalate_id.", //在公众号下配置的模板id
 'url'=>".$uel.", //点击模板消息会跳转的链接
 'topcolor'=>"#7B68EE",
 'data'=>array(
 'first'=>array('value'=>urlencode("您的活动已通过"),'color'=>"#FF0000"),
 'keyword1'=>array('value'=>urlencode('测试文章标题'),'color'=>'#FF0000'), //keyword需要与配置的模板消息对应
 'keyword2'=>array('value'=>urlencode(date("Y-m-d H:i:s")),'color'=>'#FF0000'),
 'keyword3'=>array('value'=>urlencode('测试发布人'),'color'=>'#FF0000'),
 'keyword4'=>array('value'=>urlencode('测试状态'),'color'=>'#FF0000'),
 'remark' =>array('value'=>urlencode('备注:这是测试'),'color'=>'#FF0000'), )
 );
 $json_template=json_encode($template);
 return $json_template;
 }
 /**
 * @param $url
 * @param array $data
 * @return mixed
 * curl请求
 */
 function curl_post($url , $data=array()){
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
 // POST数据
 curl_setopt($ch, CURLOPT_POST, 1);
 // 把post的变量加上
 curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
 $output = curl_exec($ch);
 curl_close($ch);
 return $output;
 }
    以上就是小编做的简单分享,希望对想研究微信开发的小伙伴们有所帮助。
2017-09-20 16:46:42 libaijia814 阅读数 948
  • 微信公众平台模板消息开发-微信开发14(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信公众平台模板消息开发是子恒老师《子恒说微信开发》视频教程的第14部。详细讲解了用php开发微信公众平台模板消息。内容包含设置模板所属行业,获取微信模板ID,用公众号发送微信模板消息等等。欢迎反馈,微信号:QQ68183131

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

           刚开始做这个模板消息开发的时候参考了很多大神的博客,讲解的也是比较的详细,但是在工具类这一块都没有详细的说,因为开发的经验少,对这些常用的工具类不是很了解,所以走了很多的弯路,所以今天把整个的详细流程贴上来,给和我一样的初学者一个参考。

1  模板消息由于模板选取不同需要传入参数的名称、值、参数个数也不同首先要封装2个实体

package com.Model;
import java.util.List;
public class Template {
	// 消息接收方  
    private String toUser;  
    // 模板id  
    private String templateId;  
    // 模板消息详情链接  
    private String url;  
    // 消息顶部的颜色  
    private String topColor;  
    // 参数列表  
    private List<TemplateParam> templateParamList;  
  
    public String getToUser() {  
        return toUser;  
    }  
    public void setToUser(String toUser) {  
        this.toUser = toUser;  
    }  
  
    public String getTemplateId() {  
        return templateId;  
    }  
  
    public void setTemplateId(String templateId) {  
        this.templateId = templateId;  
    }  
  
    public String getUrl() {  
        return url;  
    }  
  
    public void setUrl(String url) {  
        this.url = url;  
    }  
  
    public String getTopColor() {  
        return topColor;  
    }  
  
    public void setTopColor(String topColor) {  
        this.topColor = topColor;  
    }  
      
    public String toJSON() {  
        StringBuffer buffer = new StringBuffer();  
        buffer.append("{");  
        buffer.append(String.format("\"touser\":\"%s\"", this.toUser)).append(",");  
        buffer.append(String.format("\"template_id\":\"%s\"", this.templateId)).append(",");  
        buffer.append(String.format("\"url\":\"%s\"", this.url)).append(",");  
        buffer.append(String.format("\"topcolor\":\"%s\"", this.topColor)).append(",");  
        buffer.append("\"data\":{");  
        TemplateParam param = null;  
        for (int i = 0; i < this.templateParamList.size(); i++) {  
             param = templateParamList.get(i);  
            // 判断是否追加逗号  
            if (i < this.templateParamList.size() - 1){  
                  
                buffer.append(String.format("\"%s\": {\"value\":\"%s\",\"color\":\"%s\"},", param.getName(), param.getValue(), param.getColor()));  
            }else{  
                buffer.append(String.format("\"%s\": {\"value\":\"%s\",\"color\":\"%s\"}", param.getName(), param.getValue(), param.getColor()));  
            }  
          
        }  
        buffer.append("}");  
        buffer.append("}");  
        return buffer.toString();  
        }  
  
    public List<TemplateParam> getTemplateParamList() {  
        return templateParamList;  
    }  
  
    public void setTemplateParamList(List<TemplateParam> templateParamList) {  
        this.templateParamList = templateParamList;  
    }  

}
这一块中最重要的是对数据的json处理,我也是完全拷贝的

package com.Model;
public class TemplateParam {
	 // 参数名称  
    private String name;  
    // 参数值  
    private String value;  
    // 颜色  
    private String color;       
    public TemplateParam(String name,String value,String color){  
        this.name=name;  
        this.value=value;  
        this.color=color;  
    }  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
    public String getValue() {  
        return value;  
    }  
    public void setValue(String value) {  
        this.value = value;  
    }   
    public String getColor() {  
        return color;  
    }  
    public void setColor(String color) {  
        this.color = color;  
    }  
}
2、这是消息发送的代码
	public @ResponseBody Map<String, Object> classremind(HttpServletRequest request,Model model){
		Map<String, Object> map=new HashMap<>();
		Template tem=new Template();  
		tem.setTemplateId("");//消息模板的id
		tem.setTopColor("#00DD00");  
		tem.setToUser(user.getOpenid());//接收人的openid  
		tem.setUrl("");  		          
		List<TemplateParam> paras=new ArrayList<TemplateParam>();  
		paras.add(new TemplateParam("first","消息内容","#FF3333"));  
		paras.add(new TemplateParam("keyword1","对应的模板中的消息","#0044BB"));  
		paras.add(new TemplateParam("keyword2","对应的模板的消息","#0044BB"));  
		paras.add(new TemplateParam("Remark","请准时收听直播课程!","#AAAAAA"));  		          
		tem.setTemplateParamList(paras);
		String token=GlobalConstant.access_token;\\根据你们自己的方法获取token
		String requestUrl="https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";
		requestUrl=requestUrl.replace("ACCESS_TOKEN", token);
		JSONObject jsonResult=Util.httpsRequest(requestUrl, "POST", tem.toJSON());
           if(jsonResult!=null){  
            int errorCode=jsonResult.getInteger("errcode");  
            String errorMessage=jsonResult.getString("errmsg");  
            if(errorCode==0){  
                map.put("status",0); 
            }else{  
                log.info("模板消息发送失败:"+errorCode+","+errorMessage);  
                map.put("status", 1);
                map.put("info", "提醒失败,请稍候再试!");
            }  
        }
		return map;
	}
4、这一部分是我耗时最多的部分工具类

package com.util;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.URL;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;  
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.fastjson.JSONObject;
import com.yiwangjiankang.Controller.ZhiboController;
public class Util {
	
	private static Logger log = LoggerFactory.getLogger(ZhiBoUtil.class);
public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {     
        JSONObject jsonObject = null;
        try {
            // 创建 SSLContext 对象,并使用我们指定的信任管理器初始化
            TrustManager[] tm = { new MyX509TrustManager() };
            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
            sslContext.init(null, tm, new java.security.SecureRandom());
            // 从上述 SSLContext 对象中得到 SSLSocketFactory 对象
            SSLSocketFactory ssf = sslContext.getSocketFactory();
            URL url = new URL(requestUrl);
            HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
            conn.setSSLSocketFactory(ssf);      
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setUseCaches(false);    
            // 设置请求方式(GET/POST)
            conn.setRequestMethod(requestMethod);
            // 当 outputStr 不为 null 时,向输出流写数据
            if (null != outputStr) {
                OutputStream outputStream = conn.getOutputStream();
                // 注意编码格式
                outputStream.write(outputStr.getBytes("UTF-8"));
                outputStream.close();
            }
            // 从输入流读取返回内容
            InputStream inputStream = conn.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String str = null;
            StringBuffer buffer = new StringBuffer();
            while ((str = bufferedReader.readLine()) != null) {
                buffer.append(str);
            }
            // 释放资源
            bufferedReader.close();
            inputStreamReader.close();
            inputStream.close();
            inputStream = null;
            conn.disconnect();
            jsonObject = JSONObject.parseObject(buffer.toString());
        } catch (ConnectException ce) {
            log.error(" 连接超时:{}", ce);
        } catch (Exception e) {
            log.error("https 请求异常:{}", e);
        }   
        return jsonObject;
    }
}
\\这个MyX509TrustManager()是一个接口,自己必须添加一个实现类才可以直接使用,如下
class MyX509TrustManager implements X509TrustManager {  
    public void checkClientTrusted(X509Certificate[] chain, String authType)  
            throws CertificateException  
          {  
          }  
          public void checkServerTrusted(X509Certificate[] chain, String authType)  
            throws CertificateException  
          {  
          }  
          public X509Certificate[] getAcceptedIssuers()  
          {  
            return null;  
          }  
}  
            完整的就是这样了,里面可能掺杂了一些我自己工程里面的代码,希望能对大家有所帮助!有问题也希望和大家多多交流



   

2017-10-17 22:36:19 qq_32737755 阅读数 477
  • 微信公众平台模板消息开发-微信开发14(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信公众平台模板消息开发是子恒老师《子恒说微信开发》视频教程的第14部。详细讲解了用php开发微信公众平台模板消息。内容包含设置模板所属行业,获取微信模板ID,用公众号发送微信模板消息等等。欢迎反馈,微信号:QQ68183131

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

做微信开发,肯定很常用模板消息。一般简便的用法是在微信公众平台直接设置,然后拿来调用:服务号都可以在功能->添加功能插件处看到申请模板消息功能的入口,但只有认证后的服务号才可以申请模板消息的使用权限并获得模板消息权限。

请几天工作需要研究了下微信文档 ,根据模板消息接口写了个发送模板消息的简单程序。
下面将代码贴出:
下面代码可直接拷贝复用 需要更改&appid &secret 还有 接受者openid

/**http函数**/
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;
    }
$aturl ="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=微信appid&secret=微信secret";
    $atres = https_request($aturl);
    $atres = json_decode($atres,true);
    $access_token = $atres['access_token'];
    //获取access_token

//设置所属行业
     $take_url = "https://api.weixin.qq.com/cgi-bin/template/api_set_industry?access_token={$access_token}";
     //industry_id1 industry_id2 行业id
    $take_data = array('industry_id1'=>1,'industry_id2'=>30);
    $result = https_request($take_url, json_encode($take_data));
    //var_dump($result);

//获取设置的行业信息
    $get_url = "https://api.weixin.qq.com/cgi-bin/template/get_industry?access_token={$access_token}";
    $get_result = https_request($get_url);
    $get_result = json_decode($get_result,true);
    //var_dump($get_result);
//定义模板编号(公众平台可以查到所需要的编号)  获得模板ID
//这里的 模板标题:等待审核通知
    $mb_url = "https://api.weixin.qq.com/cgi-bin/template/api_add_template?access_token={$access_token}";
    $mb_data = array('template_id_short'=>'OPENTM408471635');
    $mb_result = https_request($mb_url, json_encode($mb_data));
    $mb_result = json_decode($mb_result,true);

//发送模板消息
    $send_url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={$access_token}";
    $send_data = array(    
    "touser"=>"接收人 openid",
    //接收人 openid
    "template_id"=>$mb_result['template_id'],
    "url"=>"http://weixin.qq.com",            
    "data"=>array(  "first"=>array("value"=>"家属/租客会员卡申请","color"=>"#173177"),
    "keyword1"=>array("value"=>"申请人","color"=>"#173177"),
    "keyword2"=>array("value"=>"申请信息:****************; ","color"=>"#173177"),
    'remark' => array('value' => '请进入成员列表进行审核操作!' , 'color' => '#4a5077')
                    )
           );
    $send_result = https_request($send_url, json_encode($send_data));
    $send_result = json_decode($send_result,true);
    //var_dump($send_result);
    /**我做了个测试,发送成功 返回: array(3) { ["errcode"]=> int(0) ["errmsg"]=> string(2) "ok" ["msgid"]=> int(433240389) }
     */
2017-01-22 11:56:29 u014783753 阅读数 708
  • 微信公众平台模板消息开发-微信开发14(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信公众平台模板消息开发是子恒老师《子恒说微信开发》视频教程的第14部。详细讲解了用php开发微信公众平台模板消息。内容包含设置模板所属行业,获取微信模板ID,用公众号发送微信模板消息等等。欢迎反馈,微信号:QQ68183131

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


为支撑公司业务,需要使用微信的模板消息,于是乎进行了下相关的调研,现将调研内容进行如下记录。

首先微信模板消息没有创建模板消息的接口。更新模板消息有两种方式(个人理解):

1、修改行业,然后选择微信已经提供的模板,限制有如下两点:

  a、一个月只能修改一次行业;

  b、即使修改行业,也不一定找到合适的模板;

2、自定义模板:

   从模板库中添加->帮助我们完善模板库(右上角)

    限制:

   a、需要审核;

   b、每个月只能提交三个;


以上介绍了创建模板的问题,现在我们讲解发送模板:

发送模板首先需要有模板消息,不论是从模板中创建的模板消息或是自定义的模板消息,需要获取对应模板的id

或者在后台写死,或者根据获取模板列表中获得模板id

这里我们直接写死模板的id,这个可以在微信公众号的模板详情中直接看到。

第二个需要注意的是openid即我需要发送给哪个用户,这个openid需要注意的是根据微信的规则,openid是和公众号绑定的,即相同的用户在不同的公众号中的openid是不一致的。


有了以上两个概念,我们明确了套用哪个模板给哪个用户发送消息。

下边我们讲解过程。

1、根据appid和secret需要选取accesstoken;

2、根据accesstoken和以上的两个概念封装我们的业务数据进行发送;


java代码如下(HttpClient):

换取accesstoken:

	HttpUriRequest request = RequestBuilder.get()
				.setUri("https://api.weixin.qq.com/cgi-bin/token")
				.addParameter("grant_type","client_credential")
				.addParameter("appid",appid)
				.addParameter("secret",secret)
				.build();
      execute (request)


未完待续。。。

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