最近公司在搞微信小程序:抽奖小程序,打卡小程序;自己作为项目的负责人随时跟踪进度,小程序的前端参与写了一点点2,3个简单的页面,后台系统的搭建和开发我来搞等,感觉微信小程序的前端页面等很想vue,标签和绑定等;小程序的前端编写下一篇文章再写,这篇文章主要介绍小程序的通知消息推送的实现;
大家可以去看小程序的官方文档:
https://developers.weixin.qq.com/miniprogram/dev/api/notice.html#%E6%A8%A1%E7%89%88%E6%B6%88%E6%81%AF%E7%AE%A1%E7%90%86
我们先看效果:
这是在微信小程序里申请的相关配置
第一步:配置参数,如APPID,接收用户openID,appsec,模板IDtemplateid(微信里申请),url(点击消息调到小程序那个页面),form_id(前端给每次都不一样,微信防止滥发消息默认用户点击才发)等;
第二步:获取getAccessToken;
第三步:请求微信消息发送接口;
很简单吧,加公众号后台申请模板ID我用了3小时,调通;代码没怎么整理,明天上班去整理一下
下面是代码;
class IndexAction {
private $appid;
private $appsec;
private $templateid;
private $url;
function __construct(){
$this->appid = 'wxcxxxxxxxxxxxxxxxxxxxxxxxxx;
$this->appsec = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
$this->templateid = 'xxxxxxxxxxxxxxxxxxxxxx'; //微信公众号后台申请
$this->url = '/pages/award-detail/award-detail?id=31'; //跳转地址
}
public function index()
{
$access_token = S("token"); //微信说7200有效,加个缓存避免频繁请求
if(!$token){
$access_token = $this->getAccessToken();
S("token",$access_token,7200);
}
$data=[
'touser'=> 'ocsi84gKLeAQj_jgNfjXxQRJnUHYKL', //陈海波 openid
'template_id'=> $this->templateid,
'page'=> $this->url,
'form_id'=> 'e235b9dfbd7b156ee16b5347e912e3f6j9k7', //前端每次点击都不一样
'topcolor'=>"#FF0000",
'data'=>array(
'keyword1'=>array('value'=>'键盘',"color"=>"#173177"),
'keyword2'=>array('value'=>'上海xx抽检之键盘抽检开奖通知',"color"=>"#173177")
)
];
//http请求微信发送接口
$result = $this->curl_post_send_information($access_token,json_encode($data));
dump($result);die;
}
// 获取 access_token
private function getAccessToken(){
$appid = $this->appid;
$appsec = $this->appsec;
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$appsec}";
//$raw = curl_get($url);
$raw = $this->curl_get_https($url);
if(strlen($raw)>0){
$data = json_decode($raw,true);
if(json_last_error()==JSON_ERROR_NONE){
if(key_exists('access_token',$data)){
return $data['access_token'];
}else{
return false;
}
}else{
return false;
}
}else{
return false;
}
}
//curl get会话
private function curl_get_https($url){
$curl = curl_init(); // 启动一个CURL会话
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true); // 从证书中检查SSL加密算法是否存在
$tmpInfo = curl_exec($curl); //返回api的json对象
//关闭URL请求
curl_close($curl);
return $tmpInfo; //返回json对象
}
private function curl_post_send_information( $token,$vars,$second=120,$aHeader=array())
{
$ch = curl_init();
//超时时间
curl_setopt($ch,CURLOPT_TIMEOUT,$second);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
//这里设置代理,如果有的话
curl_setopt($ch,CURLOPT_URL,'https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token='.$token);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
if( count($aHeader) >= 1 ){
curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
}
curl_setopt($ch,CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$vars);
$data = curl_exec($ch);
if($data){
curl_close($ch);
return $data;
}
else {
$error = curl_errno($ch);
curl_close($ch);
return $error;
}
}
}
有一个比较啃爹的问题就是,只能发一个消息,多个用户需要在外面加个foreach,比较蛋疼,之前做过APP的极光推送就比较好(单发,群组发,全体通知发),大家可以去微信公众号API里看看,还是有很多有用的接口和文档的什么获取系统信息用户信息等