微信公众号开发基本接口


1,接口配置填写服务器对接微信通知的接口地址及鉴权token
配置网页授权获取用户信息 域名mytest.com(用于网站获取用户基本信息)


2,服务器端实现

a,修改library/Curl.php扩展支持postjson格式数据

public function postjson($params = array(), $options = array())
{
// If its an array (instead of a query string) then format it correctly
if (is_array($params))
{
$params = json_encode($params, JSON_UNESCAPED_UNICODE);
}

// Add in the specific options provided
$this->options($options);

$this->http_method('post');

$this->option(CURLOPT_POST, TRUE);
$this->option(CURLOPT_POSTFIELDS, $params);

$this->option(CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Content-Length: '.strlen($params)));
}

b,ci基本接口实现

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Weixin extends CI_Controller {

    var $_wxappid = "wxappid";
    var $_wxappsecret = "wxappsecret";

    var $_cachekey = "wx_access_token";
    var $_cacheticket = "wx_ticket";

    function __construct()
    {
        parent::__construct();
        $this->load->model('weixin_model', 'weixin');//alias name
    }

    //获取AccessToken,有调用次数限制,存在Redis缓存
    private function getAccessToken()
    {
        $token = $this->redis->get($this->_cachekey);
        if(is_null($token)){
            $result = $this->curl->simple_get("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->_wxappid."&secret=".$this->_wxappsecret);
            $result = json_decode($result);
            if(array_key_exists("access_token", $result)){
                $token = $result->access_token;
                $expire = $result->expires_in;
            }
            if(!is_null($token)){
                $this->redis->setex($this->_cachekey, $expire - 1800, $token);
            }
        }
        return $token;
    }

    //获取Ticket用于生成QRCode
    private function getTicket($uid, $token)
    {
        $ticket = $this->redis->get($this->_cacheticket);
        if(is_null($ticket)){
            $param = array(
                "expire_seconds"=>3600*4,
                "action_name"=>"QR_SCENE",
                "action_info"=>array(
                    "scene" => array("scene_id"=>$uid),
                    ),
                  );
            $result = $this->curl->simple_postjson("https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=".$token, $param);
            $result = json_decode($result);
            if(array_key_exists("ticket", $result)){
                $ticket = $result->ticket;
                $expire = $result->expire_seconds;
            }
            if(!is_null($ticket)){
                $this->redis->setex($this->_cacheticket, $expire - 1800, $ticket);
            }
        }
        return $ticket;
    }

    public function getQRCode()
    {
            $mac = $this->input->post("mac");
        $extradata = 1234567;
        $token = $this->getAccessToken();
        $ticket = $this->getTicket($extradata, $token);
        $url = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=".urlencode($ticket);
        $data = array("code"=>0, "url"=>$url); 
        echo $data;
    }

    //处理消息
    private function handleMessage($postObj, $answer = "thank you for your message")
    {
        $fromUsername = $postObj->FromUserName;
        $toUsername = $postObj->ToUserName;
        $time = time();
        //可返回图文消息,视频,音频,图片等(需要调用素材管理接口上传)
        $textTpl = "<xml>
            <ToUserName><![CDATA[%s]]></ToUserName>
            <FromUserName><![CDATA[%s]]></FromUserName>
            <CreateTime>%s</CreateTime>
            <MsgType><![CDATA[%s]]></MsgType>
            <Content><![CDATA[%s]]></Content>
            <FuncFlag>0</FuncFlag>
            </xml>";             
        $msgType = "text";
        $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $answer);
        return $resultStr;
    }

    //处理用户事件
    private function handleEvent($postObj)
    {
        $fromUsername = $postObj->FromUserName;
        $toUsername = $postObj->ToUserName;
        $keyword = trim($postObj->Content);
        $event = $postObj->Event;
        //扫描二维码并关注
        if($event == "subscribe"){
            $eventkey = $postObj->EventKey;
            $extradata = str_replace("qrscene_","",$eventkey);
            
            $res = $this->weixin->subscribe($extradata, $fromUsername);
            if($res){
                return $this->handleMessage($postObj, "subscribe success");
            }
        }
        //取消关注公众号
        else if($event == "unsubscribe"){
            $res = $this->weixin->unsubscribe($fromUsername);
            if($res){
                return $this->handleMessage($postObj, "unsubscribe success");
            }
        }
        //已关注用户扫描
        else if($event == "SCAN"){
            $eventkey = $postObj->EventKey;
            $extradata = $eventkey;
            
            $res = $this->weixin->subscribe($extradata, $fromUsername);
            if($res){
                return $this->handleMessage($postObj, "subscribe success");
            }
        }

        return null;
    }

    //分发消息
    private function dispatch()
    {
        $postStr = file_get_contents("php://input");

        log_message("info", $postStr);
        if (!empty($postStr)){
            libxml_disable_entity_loader(true);
            $postObj = simplexml_load_string($postStr);
            if($postObj->MsgType == "text"){
                $keyword = trim($postObj->Content);
                if(is_null($keyword) or $keyword == ""){
                    return;
                }
                $resp = $this->handleMessage($postObj);
            }else{
                $resp = $this->handleEvent($postObj);
            }
        }
        log_message("info", $resp);
        echo $resp;
    }

    //检查签名
    private function check()
    {
        $signature = $this->input->get("signature");
        $timestamp = $this->input->get("timestamp");
        $nonce = $this->input->get("nonce");    

        $token = "weixin";
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr, SORT_STRING);
        $tmpStr = implode( $tmpArr );
        $tmpStr = sha1( $tmpStr );
        if( $tmpStr == $signature ){
            return true;
        }
        return false;
    }

    public function process()
    {
        if(self::check()){
            $echostr = $this->input->get("echostr");    
            if($echostr){
                echo $echostr;
            }
            else{
                self::dispatch();
            }
        }else{
            echo "error";
        }
    }    


    private function OpenIdPage()
    {
        $result = $this->curl->simple_get("https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$this->_wxappid."&secret=".$this->_wxappsecret."&code=".$code."&grant_type=authorization_code");
        $result = json_decode($result);
    
        return $rid;
    }

    public function UserInfoPage()
    {
        $result = $this->getUserToken();
        $token = $result->access_token;
        $openid = $result->openid;

        $result = $this->curl->simple_get("https://api.weixin.qq.com/sns/userinfo?access_token=$token&openid=$openid&lang=zh_CN");
        $result = json_decode($result);
        var_dump($result);
    }

    //生成自定义菜单,微信客户端隔天刷新,可取消关注再关注实现立即刷新
    public function genmenu(){
        
        $cpage = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$this->_wxappid."&redirect_uri=".urlencode("http://mytest.com/weixin/OpenIdPage")."&response_type=code&scope=snsapi_base&state=12345#wechat_redirect";
        $ppage = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$this->_wxappid."&redirect_uri=".urlencode("http://mytest.com/weixin/UserInfoPage")."&response_type=code&scope=snsapi_userinfo&state=12345#wechat_redirect";

        $token = $this->getAccessToken();
        $param = array(
            "button" => array(
                array("type"=>"view","name"=>"不需要授权的页面","url"=>$cpage),
                array("type"=>"view","name"=>"需要授权的页面","url"=>$cpage)
            )
        );
        $result = $this->curl->simple_postjson("https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$token, $param);
        var_dump($result);
    }
}

/* End of file weixin.php */
/* Location: ./application/controllers/weixin.php */

c,素材管理等接口

上传
curl -F media=@1.jpg -F type=image -v "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=TVaBtXR8CJH3dd_dNaPae45a-aU2T1CpW2KsxUNjOlvpKWZ01QT-9BH1Jp_eumniu7ojpFUmRXn8oNgpQxNvgeYsv09QllK9gPvouVISUoo"

{"media_id":"im03apKihxUcy45i1Cu30E2WFdPONd_8yyG7VwE7as0","url":"https:\/\/mmbiz.qlogo.cn\/mmbiz\/vyiaPGicTjvibZHtrldAfEahzD0RdQVS9iaXA90Y0uibu1kTOUSO7cu7CbsHlJicrHXubvnHrTmolibK8amJzQIPLAkGg\/0?wx_fmt=jpeg"}⏎

查看
https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=...

统计数量
https://api.weixin.qq.com/cgi-bin/material/get_materialcount?access_token=TVaBtXR8CJH3dd_dNaPae45a-aU2T1CpW2KsxUNjOlvpKWZ01QT-9BH1Jp_eumniu7ojpFUmRXn8oNgpQxNvgeYsv09QllK9gPvouVISUoo

{"voice_count":0,"video_count":0,"image_count":3,"news_count":0}
posted @ 2015-08-15 11:19  ciaos  阅读(838)  评论(0编辑  收藏  举报