微信公众号开发基本接口

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 [email protected] -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}
时间: 2024-10-12 21:01:02

微信公众号开发基本接口的相关文章

.net微信公众号开发——基础接口

本文讲述微信公众号开发中基础接口的使用,包括以下内容:    (1)获取许可令牌(AccessToken):    (2)获取微信服务器地址:    (3)上传.下载多媒体文件:    (4)创建.显示二维码:    (5)长链接转短链接.    开源项目地址:http://git.oschina.net/xrwang2/xrwang.weixin.PublicAccount    本文的源代码地址:http://git.oschina.net/xrwang2/xrwang.weixin.Pub

微信公众号开发API接口大全

在本文中,我们列出微信公众平台上可以使用的API接口以及举例如何在微信公众平台调用这些接口实现相应的功能. 接口调用说明: ① Appkey请使用的微信公众号,不要使用默认的trailuser ② 接口返回类型为文本.图文.及音乐三种基本消息 ③ 请在所有消息底部主动加上“技术支持 方倍工作室” ④ JSON验证网址 http://pro.jsonlint.com/ ⑤ 接口将不定期增加或更新,欢迎指出错误 ⑥ 如果有想要实现的,请在下面评论中列出并提供数据来源 ⑦ 提供的例子为天气.笑话.点歌

微信公众号开发工具包,封装常用接口等

微信公众号开发套件 涵盖微信提供的大多数常用接口,具体实现功能如下: 一.消息管理 1.模板消息.支持单个用户发送和批量发送,支持同步发送和一步发送. 2.一次性订阅消息. 3.客服消息.包括下发文本.图片等. 二.菜单管理 1.自定义菜单创建.查询.删除.个性化菜单配置等功能. 三.素材管理 1.获取临时素材 2.获取永久素材 3.删除素材 4.获取素材总数 5.获取素材列表 四.账号管理 1.生成带参数的二维码 2.长连接转短连接 五.用户管理 1.用户标签管理 2.设置用户备注名称 3.获

微信公众号开发总结

最近公司用到了微信公众平台,所以研究了一下微信公众号的开发技术,总体来说比较简单,结合现有的平台核技术,实现起来非常方便. 首先先来了解一下微信公众平台. "微信,是一个生活方式" ,这是微信的自我评价,是不是觉得如果那天不在朋友圈里分享一下自己的最新状态, 并且收到几个赞和评价的话,会觉得空虚寂寞呢?它实实在在的改变了我们的生活方式. " 微信,也是一个生意方式 ",在微信成为我们日常必备之app的同时,它同样具备巨大的的商业 或许不应该称为潜力,因为有很多人已经

C#微信公众号开发 -- (五)自定义菜单创建

公众号中,底部都是有自己定义的功能按钮,通过点击某个按钮来实现指定的业务逻辑操作. 下面就来说说这些按钮是怎样放到微信公众平台的,还是先来看看微信的官方解释: 请注意: 1.自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单. 2.一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替. 3.创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单, 如果菜单有更新,就会刷

利用OpenShift托管Node.js Web服务进行微信公众号开发

最近写了一个微信的翻译机器人.用户只要关注该微信号,发送英文的消息,就能收到中文翻译的回复.后台是用Node.js写的,托管在OpenShift的Paas平台上.翻译过程实际上是调用微软的Bing translation API做的,代码中用到了alexu84的bing-translate和JacksonTian的wechat这两个npm模块.下面把做的过程详细说一下. 1. 微信公众号开发 首先是要到https://mp.weixin.qq.com 申请一个公众号,并申请成为开发者.目前个人只

nodejs + BAE 搭建微信公众号开发平台

闲来无事创建了一个微信公众账号,名曰“深圳生活小助手”, 关注的人不多,平时发一些深圳新闻,趣事啥的,为了丰富公众号的内容,准备添加一些便民查询功能,例如天气预报.快递查询等等. 于是就有了本文的内容. 深圳的读者扫描关注支持下啊... 闲话不多说,本文主要介绍的就是如何基于nodejs和百度云搭建微信公众号开发平台,下一节介绍如何基于该平台实现了一个简单的天气预报查询功能的小例子. 1. 使用Express搭建本地站点 Express 是一个简洁.灵活的 node.js Web 应用开发框架,

微信公众号开发及时获取当前用户Openid及注意事项

目录 (一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 (四)微信公众号开发之网页授权获取用户基本信息 (五)微信公众号开发之网页中及时获取当前用户Openid及注意事项 前言 这篇主要是承接上篇的网页授权获取用户基本信息的后文,也是对第一种静默授权之后,用户点击公众号内链接时,如何再次取得当前用户的OpenId的大致讲解和一些注意事项. 看过上一篇的小伙伴都知道,我们在用户关注的时候就已经将该用户的基本信息存入数据库中,那么如果

C#微信公众号开发系列教程二(新手接入指南)

http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可直接跳过,也欢迎大神吐槽. 目录 C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) 微信公众平台消息接口的工作原理大概可以这样理解:从用户端到公众号端一个流程是这样的,用户发送消息到微信服务器,微