缘由: 因为老板要做个PC端的微信扫码绑定登录,关注公众号,推送模板消息的功能
框架: ThinkPHP 5
功能: 实现 扫码微信公众号授权登录绑定,推送模板消息
1.正式配置
准备: 微信公众号(必须申请了服务号) Appid , AppSecret
配置: 微信公众平台修改: 授权回调地址域名 , JS 接口安全域名 修改为自己的域名
2.测试配置
在没有申请服务号的公众号的情况下,微信提供了测试账号进行配置测试
步骤:
1. 公众平台申请测试账号
2. 获取到测试号的 Appid , AppSecret
3. 配置 JS 接口安全域名 , 授权回调域名
4. 关注测试公众号
5. 添加测试模板,获取模板id
注意: 测试的模板消息内容固定为添加模板时的内容,转到正式环境中后需要根据选择的模板信息配置
微信网页扫码授权登录:
微信文档地址: https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
/** * 网页授权 * */ public function weChatAuthorization() { // 要绑定的用户id $admin_id = 'id'; // Appid $APPID = '微信公众平台获取的appid'; // 网页授权回调地址 $callback_url = '网页授权回调接口'; // 网页授权回调接口 $redirect = urlencode($callback_url); // 编码 // 调起微信授权地址 $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$APPID."&redirect_uri=".$redirect."&response_type=code&scope=snsapi_userinfo&state=".$admin_id."#wechat_redirect"; // 跳转授权页面 header('location:'.$url);exit; } /** * 网页授权的回调 */ public function callback() { $APPID = '微信公众平台获取的appid'; $APPSECRET = '微信公众平台获取的appsecret'; // 获取当前url的参数部分 $params = $_SERVER["QUERY_STRING"]; // s=/index/Wxopera/callback&code=code&state=STATE // 拆分成数组 得到code $arr = explode('&',$params); $code = explode('=',$arr[1]); $code = $code[1]; // 得到要绑定的管理员id $admin = explode('=',$arr[2]); $admin_id = $admin[1];// 通过code获取网页授权access_token $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$APPID&secret=$APPSECRET&code=$code&grant_type=authorization_code"; $res = $this->http_curl($url); // 获取用户信息 $url2 = "https://api.weixin.qq.com/sns/userinfo?access_token=".$res['access_token']."&openid=".$res['openid']."&lang=zh_CN"; $userinfo = $this->http_curl($url2);
// 到此 $userinfo 获取到用户信息
// 获取到的具体用户信息 请移步微信文档 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
// 下面可以进行自己的逻辑处理
var_dump($userinfo);exit; } /** * curl请求 */ public function http_curl($url, $type = 'get', $res = 'json', $arr = '') { $cl = curl_init(); curl_setopt($cl, CURLOPT_URL, $url); curl_setopt($cl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($cl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($cl, CURLOPT_SSL_VERIFYHOST, false); if($type == 'post'){ curl_setopt($cl, CURLOPT_POST, 1); curl_setopt($cl, CURLOPT_POSTFIELDS, $arr); } $output = curl_exec($cl); curl_close($cl); return json_decode($output, true); }
微信访问 weChatAuthorization 接口的接口连接
或者将 weChatAuthorization 接口的接口连接 生成二维码 微信扫码访问
发送模板消息
微信文档: https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html#%E5%8F%91%E9%80%81%E6%A8%A1%E6%9D%BF%E6%B6%88%E6%81%AF
/** * 推送模板消息 * @param string $openid 接收人的微信openid * @param array $data 模板消息内容'character_string11' => ['value' => '22'],
* @return mixed */ public function do_send($openid) { // 获取 微信接口调用凭证 access_token $access_token = Cache::get('accessToken'); if(!$access_token){ $access_token = $this->accessToken(); } //模板消息 格式化 $json_template = $this->json_tempalte($openid); // 推送消息 $url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" . $access_token; $res = $this->curl_post($url, urldecode($json_template)); return json_decode($res, true); } /** * 获取 access_token * 由于是循环多次进行推送 * 所以需要暂存一下 access_token */ public function accessToken() { $appid = Db::name('config')->where('name','Appid')->value('value'); $appsecret = Db::name('config')->where('name','AppSecret')->value('value'); // 获取 access_token $access_token_url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$appsecret; $json_token = $this->curl_post($access_token_url); $json_token = json_decode($json_token, true); if(!empty($json_token['errcode'])){ $this->error('推送失败,获取微信 access_token 失败'); } // 存入缓存 1小时 Cache::set('accessToken',$json_token['access_token'],3600); return $json_token['access_token']; } /** * 将模板消息json格式化 * @return false|string */ public function json_tempalte($openid) { //模板消息 $template = [ 'touser' => $openid, //接收者openid 'template_id' => "模板id", //模板消息的模板id 'data' =>[ // 数据
'thing4' => ['value' => '模板名'],
'time14' => ['value' => date('Y年m月d日 H:i',time())],
];
]; return json_encode($template); } /** * curl请求 * @param $url * @param $data * @return bool|string */ public function curl_post($url, $data = array()) { $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; }
发送模板消息传参如下
具体传参请参考微信文档: https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html#%E5%8F%91%E9%80%81%E6%A8%A1%E6%9D%BF%E6%B6%88%E6%81%AF
标签:扫码,推送,微信,json,access,token,curl,PHP,模板 From: https://www.cnblogs.com/xvyifan/p/17565866.html