公眾號消息推送,下單成功推送示例,或許只有我本人能看懂……發出來給大家瞅瞅,說不定能立馬煥然大悟……


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

 

 

 

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM