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的基本信息了,有些我沒存,這些基本上就是常用的。