公众号消息推送,下单成功推送示例,或许只有我本人能看懂……发出来给大家瞅瞅,说不定能立马焕然大悟……
1、管理员先关注公众号,2、扫码授权公众号门店授权码,3、在公众号推送列表开启此管理员,开启后用户付款此管理员可以收到通知
《1》通过门店去推送消息。
《2》获取该用户的公众号openid。
大概是以下图片的模样。
公众号openid列表。
某个用户的公众号openid;
需要一个公众号模板;
$data = [ "touser" => '某个用户的公众号openid;', "template_id" => '需要一个公众号模板;', "data" => [ "first" => [ "value" => '门店名称', "color" => "#173177" ], "keyword1" => [ "value" => '商品名称', "color" => "#173177" ], "keyword2" => [ "value" => '订单号', "color" => "#173177" ], "keyword3" => [ "value" => '下单金额', "color" => "#173177" ], "remark" => [ "value" => '这里是备注,通常随便你放什么文字', "color" => "#173177" ], ], ]; $get_all_access_token = $this->get_all_access_token(); $json_data = json_encode($data); //转化成json数组让微信可以接收 $url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" . $get_all_access_token; $this->curl_post($url, urldecode($json_data)); //请求开始
$get_all_access_token; 这个是公众号的token; /** * 发起POST请求 * @param string $url 请求地址 * @param string $data 请求参数 * @param string string $cookiePth */ function curl_post($url, $data = [], $cookiePath = '') { $ch = curl_init(); // 初始化 curl_setopt($ch, CURLOPT_URL, $url); // 抓取指定网页 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 要求结果为字符串且输出到屏幕上 curl_setopt($ch, CURLOPT_POST, 1); // POST提交方式 curl_setopt($ch, CURLOPT_POSTFIELDS, $data); // 请求参数 curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiePath); // 连接结束后保存cookie信息的文件 curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiePath); // 包含cookie信息的文件 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // 禁用后cURL将终止从服务端进行验证 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // 检查服务器SSL证书中是否存在一个公用名 $res = curl_exec($ch); // 执行一个cURL会话 curl_close($ch); // 关闭一个cURL会话 return $res; } //放在同一个页面调用这个函数,请求微信api的post方法
//接下来我在说说什么获取公众号的token,这段代码就是获取微信那边公众号的token $appId = $config['appid']; $appSecret = $config['secret']; $res = file_get_contents("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . $appId . "&secret=" . $appSecret); $resdata = json_decode($res, true);
(1)获取公众号token成功就是下面这样,7200代表7200之后才过期,建议大家用一个函数,7200过期之后在调用token,没过期就继续用之前的。【不知道你们能不能看懂我说的话,比较乱……】
(2)将这个token存起来,存到数据库,同时将当前时间也存进去。
(3)然后在进行,将token取出来,对比存进去的时间和现在的时间,是否超过7200。
//就像这个代码 /** * 7200 */ public function user_access_token() { $user_access_token_time = $reg['user_access_token_time'];//这是数据库存的token时间 if ($user_access_token_time + 7000 < time()) { //如果上次更新时间+7200小于当前时间说明该令牌已经过期 $token = $this->user_access_token_();//说明过期,那就调用在获取一个token,再存到数据库。这里我就省略了一个存到数据库的步骤。 if (!empty($token)) { $result = json_decode($token, true); if (!empty($result['user_access_token'])) { if (!empty($result['user_access_token'])) { return $result['user_access_token']; } } } } else { //如果没过期,那就用之前的token $user_access_token = $reg['user_access_token']; return $user_access_token; } }
这就是公众号token成功的样子。
//这段代码,是获取公众号openid class 类名 extends \app\api\controller\Base { /* @catalog app\api\controller\user * @title 获取公众号openid,写入数据 * @method POST * @url https://zxzhdc.zx-xcx.com/api/user/open * @description: * @param 必选 store_id 门店ID * @param 必选 code 公众号code * @return {"code"=>"200","message" = >"成功" ,"data":[]} */ public function open(Request $request) { $code = $request->param('code');//这个是公众号的code $store_id = $request->param('store_id'); if (empty($code) || empty($store_id)) { return jsonr('400', '不可为空'); } $store = Db::name("store")->where(['id' => $store_id])->find(); if (empty($store)) { return jsonr('400', $store_id . '不存在该门店', ''); } $admin = db('admin')->where(['id'=>$store['admin_id']])->find(); $super_id = !empty($admin['super_id']) ?$admin['super_id']: ''; //获取access_token和openid $data = $this->getOpenids($code,$super_id); if ($data) { //获取用户详细信息,通过token获取详细信息,信息会有许多,等下我将截图放在后面。 $info = $this->userinfo($data['access_token'], $data['openid']); if ($info) { $res = Db::name("public")->where(['openid' => $info['openid']])->find(); $arr['nickname'] = base64_encode($info['nickname']); $arr['sex'] = $info['sex']; $arr['headimgurl'] = $info['headimgurl']; $arr['unionid'] = $info['unionid']; $arr['country'] = $info['country'] . ',' . $info['province'] . ',' . $info['city']; $arr['store_id'] = $store_id; $arr['admin_id'] = $store['admin_id']; if (!empty($res)) { $arr['updatetime'] = time(); Db::startTrans(); try { db('public')->where(['openid' => $info['openid']])->update($arr);//将关注公众号,然后授权公众号用户的openid存起来,也就有了前面的,公众号openid。 Db::commit(); return jsonr('200', 'success', ''); } catch (Exception $e) { Db::rollback(); return jsonr('400', '绑定失败', ''); } } else { $arr['openid'] = $info['openid']; $arr['createtime'] = time(); $in = Db::name('public')->insert($arr);//将关注公众号,然后授权公众号用户的openid存起来,也就有了前面的,公众号openid。 // dump($arr,$in);exit; if ($in) { return jsonr('200', 'success', ''); } else { return jsonr('400', '绑定失败', ''); } } } else { return jsonr('400', '获取openid失败'); } } else { return jsonr('400', '获取openid失败'); } } //获取微信公众号opid public function getOpenids($code,$super_id) { if($super_id){ $config = db('weixin_config')->where('super_id', $super_id)->find(); }else{ $config = db('weixin_config')->where('super_id', $this->super_id)->find(); } $appId = $config['appid']; $appSecret = $config['secret']; // 获取openid $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appId&secret=$appSecret&code={$code}&grant_type=authorization_code"; $data = json_decode(file_get_contents($url), true); if (array_key_exists('openid', $data)) { return $data; } return false; } public function userinfo($access_token, $openid) { //获取用户信息地址 $urlid = 'https://api.weixin.qq.com/sns/userinfo?access_token=' . $access_token . '&openid=' . $openid . '&lang=zh_CN'; $curl = curl_init(); // 启动一个CURL会话 curl_setopt($curl, CURLOPT_URL, $urlid); 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); $userinfo = json_decode($tmpInfo, true); return $userinfo; } }
这里就是获取公众号openid的基本信息了,有些我没存,这些基本上就是常用的。
祝你开心=.=