小程序發送公眾號模板消息


前置條件:
1.小程序和公眾號必須關聯  微信公眾平台上進入設置 進行關聯  https://mp.weixin.qq.com/
2.需要在微信開放平台注冊賬號(注冊費用三百元) 然后進行關聯操作  https://open.weixin.qq.com
3.公眾號模板消息
 
整體思路:
用戶授權openid->換取unionID(前端獲取)
小程序內部引導用戶關注公眾號(official-account組件) //前端實現
公眾號批量獲取關注用戶的openid( https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN|)
兩個unionid相同的 就是同一個用戶
 
具體實現:
 
1.小程序獲取unionid和openid
      
        
    public function openid(){
            $code=$request->input('code'); //前端調用wx.login方法拿到的code
            $appid = 'XXXXXXXX';
            $secret = 'XXXXXXXX';
            $url = 'https://api.weixin.qq.com/sns/jscode2session?appid=' . $appid . '&secret=' . $secret . '&js_code=' . $code . '&grant_type=authorization_code';
            $res = $this->getJson($url); //如果不報錯 結果應該為session_key openid unionid
            $openid=$res['openid'];
            $unionid=$res['unionid'];
        }
        function getJson($url){
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            $output = curl_exec($ch);
            curl_close($ch);
            return json_decode($output, true);
        }

 

 
#獲取關注公眾號的openid列表
   
      
  public function openid(){
       $access_token = $this->returnAssKey();
       $NEXT_OPENID="oD5bqvy5elflcaJZIfrow8t9v6uU"; //該參數是從那個openid開始獲取之后的所有openid 如果不填 默認從第一個開始獲取
   
       $url="https://api.weixin.qq.com/cgi-bin/user/get?access_token=$access_token&next_openid=$NEXT_OPENID";
       
       $ass_key = $this->getJson($url); //如果沒有報錯 會返回三個參數  
       $openids=$ass_key['data']['openid'];  //這就是關注公眾號的用戶列表
      
      
    }
    #獲取access_token
    public function returnAsskey()
    {
        $appid="XXXXXX";
        $secret="XXXXXX";  //公眾號的appid和secret
        $url     = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$secret";
        $ass_key = $this->curlGet($url);
        $a1 = $ass_key->access_token;
        return $a1;
    }
    #請求鏈接地址
    public function curlGet($url)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $data = curl_exec($curl);
        $err  = curl_error($curl);
        curl_close($curl);
        return json_decode($data); //對數據進行json解碼
    }

 

 
此處我用的是一對一接口,即一個openid換取一個unionid,文檔中還有個批量用openid換取unionid的接口,按需求選擇
 
  
  #獲取unionid
    public function unionid(){
        
            $openid="XXXXX";  //剛才獲取到的openid列表中 要換取的某個openid
            $access_token = $this->returnAssKey();
            $url="https://api.weixin.qq.com/cgi-bin/user/info?access_token=$access_token&openid=$openid&lang=zh_CN";
            $ass_key = $this->getJson($url); //如果沒有報錯 回返回一大堆數據 我們只需要其中的unionid 其他看需要即可
            $unionid=$ass_key['unionid'];   //最終獲取到的unionid
           
    }
    #獲取access_token
    public function returnAsskey()
    {
        $appid="XXXXXX";
        $secret="XXXXXX";  //公眾號的appid和secret
        $url     = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$secret";
        $ass_key = $this->curlGet($url);
        $a1 = $ass_key->access_token;
        return $a1;
    }
    #請求鏈接地址
    public function curlGet($url)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $data = curl_exec($curl);
        $err  = curl_error($curl);
        curl_close($curl);
        return json_decode($data); //對數據進行json解碼
    }
    #請求鏈接地址
    function getJson($url){
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($ch);
        curl_close($ch);
        return json_decode($output, true);
    }

 

4.發送公眾號模板消息
    
public function temMsg($order,$name,$phone)
    {
            $openid=“XXXXXX"; //公眾號的openid
            $temid = 'vyCW15G-d-2PeNcUzz_kgod_ksNPSwjSKDOGYdvbljE'; //模板id
            $access_token = $this->returnAssKey();
            $url= 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=' . $access_token;
            $time=date('Y-m-d H:i',time());
        
            $data = array( //這里一定要按照微信給的格式
                "touser"      => "$openid", 
                "template_id" => $temid,
                "data"        => array(
                    "first"    => array(
                        "value" => '您有一個新訂單,請及時確認!',
                        "color" => "#173177",
                    ),
                    "keyword1" => array(
                        "value" =>"$order",
                        "color" => "#173177",
                    ),
                    "keyword3" => array(
                        "value" => "$name",
                        "color" => "#173177",
                    ),
                    "keyword4" => array(
                        "value" => "$phone",
                        "color" => "#173177",
                    ),
                    'remark'   => array('value' => "下單時間:$time,請及時到后台根據處理訂單!",
                        'color'=> '#FF0000',
                    ),
                ),
            );
 
 
        $res = $this->postCurl($url, $data, 'json'); //將data數組轉換為json數據
        if ($res) {
            return ['state' => '0', 'msg' => $res];
        } else {
            return ['state' => '1', 'msg' => '系統錯誤!'];
        }
    }
    #獲取access_token
    public function returnAsskey()
    {
        $appid="XXXXXX";
        $secret="XXXXXX";  //公眾號的appid和secret
        $url     = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$secret";
        $ass_key = $this->curlGet($url);
        $a1 = $ass_key->access_token;
        return $a1;
    }
 
        #請求鏈接 get方式
    public function curlGet($url)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $data = curl_exec($curl);
        $err  = curl_error($curl);
        curl_close($curl);
        return json_decode($data); //對數據進行json解碼
    }
 
    #獲取鏈接數據 以post方式
    public function postCurl($url, $data, $type)
    {
        if ($type == 'json') {
            $data   = json_encode($data); //對數組進行json編碼
            $header = array("Content-type: application/json;charset=UTF-8", "Accept: application/json", "Cache-Control: no-cache", "Pragma: no-cache");
        }
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        if (!empty($data)) {
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        $res = curl_exec($curl);
        if (curl_errno($curl)) {
            echo 'Error+' . curl_error($curl);
        }
        curl_close($curl);
        return $res;
    }

 

 


免責聲明!

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



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