微信开放平台SDK,简易教程

微信第三方平台开发包

  1. 实现公众号授权和绑定
  2. 代公众号实现业务
  3. 代公众号使用JS SDK
  4. 第三方平台事件通知处理
  5. 实现公众号全网发布接入检测的自动化测试代码

访问网址

  1. 官网地址
  2. Github地址

简单使用说明

  1. 假设配置网站根目录为/data/wx_component/
  2. 网站目录结构为/data/wx_component/example/和/data/wx_component/src/
  3. 假设网站域名为www.xxx.com
  4. 配置公众号第三方平台参数
  1. 把配置的第三方平台参数配置/example/config.php
  2. 配置完成后,进行全网发布接入检测。
  3. 如果不成功,检查以下几项
  • 检查/example/目录是否可写
  • 检查/example/cache/目录的日志文件,查看原因
  • 检查apache rewrite模块是否开启,是否支持.htaccess
  1. 发布成功后,用浏览器打开example的php样例,检测授权、js_sdk功能。

PHP全网发布自动化测试代码如下

<?php
/**
 * 授权后代替公众号实现业务
 * @author  lv_fan2008@sina.com
 */

include_once "config.php";
include_once dirname(dirname(__FILE__)) . "/src/WxComponentService.class.php";

$cfg = get_wx_config();
if (!$cfg) {
    die("no access!");
}

$wxComponentConfig = $cfg['component_cfg'];
$wxComponentService = new WxComponentService($wxComponentConfig, new FileCache($GLOBALS['cacheDir']));
$appId = $cfg['app_id'];

// 如果为全网发布接入检测的专用测试公众号,转入自动化测试代码
if ($appId == 'wx570bc396a51b8ff8') {
    test_auto_case($wxComponentService, $appId);
    exit;
}

// 正常业务处理
$weObj = $wxComponentService->getWechat($appId);
$ret = $weObj->valid(true);
if ($ret === false) {
    log_ex('wx_auth_msg', "appId:{$appId}, auth valid failed! param:" . print_r($_GET, true));
    die('no access');
} else if ($ret !== true) {
    log_ex('wx_auth_msg', "appId:{$appId}, only die echostr:" . $ret);
    die($ret);
}
$weObj->getRev();
log_ex('wx_auth_msg', "appId:{$appId} receive data:" . $weObj->getRevData());
$weObj->text("success")->reply('', true); // 简单测试回复success


/**
 * 得到地址对应的配置信息以及appId
 * @return bool
 */
function get_wx_config()
{
    $url = is_https() ? "https://" : "http://" . $_SERVER['HTTP_HOST']
        . ($_SERVER["SERVER_PORT"] != 80 ? ":" . $_SERVER["SERVER_PORT"] : "")
        . $_SERVER['REQUEST_URI'];
    $url_param = parse_url($url);
    $url_path_arr = explode("/", $url_param['path']);
    foreach ($GLOBALS['wxComponentConfig'] as $wxComponentConfig) {
        $cfg_url_param = parse_url($wxComponentConfig['receive_app_event_url']);
        if ($url_param['scheme'] == $cfg_url_param['scheme'] && $url_param['host'] == $cfg_url_param['host']
            && $url_param['port'] == $cfg_url_param['port']
        ) {
            $cfg_path_arr = explode("/", $cfg_url_param['path']);
            $appId = "";
            foreach ($cfg_path_arr as $i => $v) {
                if ($v != '$APPID$' && $v != $url_path_arr[$i]) {
                    $appId = "";
                    break;
                } elseif ($v == '$APPID$') {
                    $appId = $url_path_arr[$i];
                }
            }
            if ($appId) {
                return array('component_cfg' => $wxComponentConfig, 'app_id' => $appId);
            }
        }
    }
    return false;
}

function is_https()
{
    if (!isset($_SERVER['HTTPS']))
        return FALSE;
    if ($_SERVER['HTTPS'] === 1) {  //Apache
        return TRUE;
    } elseif ($_SERVER['HTTPS'] === 'on') { //IIS
        return TRUE;
    } elseif ($_SERVER['SERVER_PORT'] == 443) { //其他
        return TRUE;
    }
    return FALSE;
}

/**
 * 全网发布接入检测自动化测试代码
 * @param WxComponentService $wxComponentService
 * @param string $appId
 */
function test_auto_case(&$wxComponentService, $appId)
{
    $weObj = $wxComponentService->getWechat($appId);
    $ret = $weObj->valid(true);
    if ($ret === false) {
        log_ex('wx_auth_msg', "appId:{$appId}, auth valid failed! param:" . print_r($_GET, true));
        die('no access');
    } else if ($ret !== true) {
        log_ex('wx_auth_msg', "appId:{$appId}, only die echostr:" . $ret);
        die($ret);
    }
    $weObj->getRev();
    log_ex('wx_auth_msg', "appId:{$appId} receive data:" . $weObj->getRevData());

    if ($weObj->getRevType() == Wechat2::MSGTYPE_TEXT) {
        $recv_txt = $weObj->getRevContent();
        if ($recv_txt == 'TESTCOMPONENT_MSG_TYPE_TEXT') {
            log_ex('wx_auth_msg', "test_auto_case send TESTCOMPONENT_MSG_TYPE_TEXT_callback");
            $weObj->text('TESTCOMPONENT_MSG_TYPE_TEXT_callback')->reply('', false);
            exit;
        } else if (preg_match('#QUERY_AUTH_CODE:(.*)#', $recv_txt, $matches)) {
            log_ex('wx_auth_msg', "test_auto_case send QUERY_AUTH_CODE");

            $weObj->text('')->reply('', false);

            $ret = $wxComponentService->authorizeCallbackProcess($matches[1], 10);
            if ($ret['code'] != 0) {
                log_ex('wx_auth_msg', 'test_auto_case authorizeCallbackProcess  failed! ret:' . print_r($ret, true));
                exit;
            }
            $weObj->access_token = $wxComponentService->getAppAccessToken($ret['appAcountInfo']['authorization_info']['authorizer_appid']);
            $res_arr = array('touser' => $weObj->getRevFrom(), 'msgtype' => 'text', 'text' => array('content' => $matches[1] . "_from_api"));

            log_ex('wx_auth_msg', 'test_auto_case sendCustomMessage data:' . print_r($res_arr, true));
            $ret = $weObj->sendCustomMessage($res_arr);
            log_ex('wx_auth_msg', 'test_auto_case sendCustomMessage: ret:' . print_r($weObj, true));
            if (!$ret) {
                log_ex('wx_auth_msg', 'test_auto_case sendCustomMessage failed');
            }
            exit;
        }
    } else if ($weObj->getRevType() == Wechat2::MSGTYPE_EVENT) {
        $data = $weObj->getRevData();
        $ev = $data['Event'];
        log_ex('wx_auth_msg', 'test_auto_case send ' . $ev . "from_callback");
        $weObj->text($ev . "from_callback")->reply('', false);
        log_ex('wx_auth_msg', 'test_auto_case send ' . $ev . "from_callback done.");
    } else {
        die("no access");
    }
    exit;
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,123评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,031评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,723评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,357评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,412评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,760评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,904评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,672评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,118评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,456评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,599评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,264评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,857评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,731评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,956评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,286评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,465评论 2 348

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,628评论 18 139
  • 给提问的开发者的建议:提问之前先查询 文档、通过社区右上角搜索搜索已经存在的问题。 写一个简明扼要的标题,并且...
    极乐叔阅读 13,394评论 0 3
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,773评论 6 342
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,743评论 25 707
  • 看过很多书 书上说 时间可以掩盖所有的人和事 见过很多人 人们说 纯粹的爱情也会被世俗玷污 听过很多歌 歌里唱 相...
    楚小天lulu阅读 338评论 0 0