微信公众平台开发:初体验

由于俱乐部的需要,最近开始着手微信公众平台的开发,之前一直都有使用,不过只是简单的基于关键字的自动回复功能而没有使用开发者模式。这次开始使用开发者模式,注意【开发者模式】和【自动回复功能】不能共存,也就是说一个处于启用状态,另一个只能处于停用状态。其实微信公众平台的开发和网页编写时一样的,只不过显示在微信客户端中而不是浏览器网页界面。

一、开发者原理

二、启用开发者模式

三、一个简单的例子

一、        开发者原理

要想更好的开发微信公众平台,理解一下原理还是很重要的,如果出现了错误这样也就更容易调试。

微信平台有一个服务器A用于与手机微信客户端通讯(接收和发送消息),如果启用开发者模式,还需要一个服务器B(需要自己准备),服务器A接收客户端发来的消息a,并将消息a发送给服务器B,在服务器B中对消息进行处理返回消息b(这里便是开发者主要要实现的功能)给服务器A,微信平台的服务器A再将消息b发给客户端,这就是大体的消息发送和回应的原理。

以上描述的是在已经成为开发者之后,公众号的关注者发送消息时的情景。

在初次申请成为开发者时,你需要准备的是一个服务器(我使用的是SAE),然后需要在公众号中配置一下,主要也就是告诉公众号(处于服务器A中)你的服务器在哪里(服务器B的URL)以及其他信息。之后就需要一个初次验证,也就是让服务器A和服务器B相互熟悉熟悉,毕竟以后要一起工作啦。

开发模式成为开发者时的消息校验原理

在开发者首次提交验证申请时,微信服务器将发送GET请求到填写的URL上,并且带上四个参数(signature、timestamp、nonce、echostr),开发者通过对签名(即signature)的效验,来判断此条消息的真实性。此后,每次开发者接收用户消息的时候,微信也都会带上前面三个参数(signature、timestamp、nonce)访问开发者设置的URL。


参数


描述


signature


微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。


timestamp


时间戳


nonce


随机数


echostr


随机字符串

开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。

加密/校验流程如下:

1. 将token、timestamp、nonce三个参数进行字典序排序

2. 将三个参数字符串拼接成一个字符串进行sha1加密

3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信启用接口是由代码中的checkSignature()函数来实现校验的。

有点乱的话,也没问题,之后再例子中还会再说。

二、        启用开发者模式

上面说的是开发者的初次验证和普通消息接收发送的原理,当然这都是在启用开发者模式之后才管用的,所以现在我们就来说一说如何启用开发者模式和相关的一些配置。

进入微信公众平台公众号的首页,选择开发者中心,点击进入:

这里我的已经配置和启用完毕了,界面如上图所示。你首先做的是点击配置,在配置中你需要填写四个内容:URL、Token、EncodingAESKey、消息加解密方式,URL就是你的服务器的URL,Token就是一个令牌,填写什么都可以不过一定要记住,因为之后要使用,EncodingAESKey选择随机生成即可,加密方式我选择了明文模式,填好了这四项,确定之后可能失败,因为我们忘记了一件事情,就是在自己的服务器中要编写初次验证的代码(这个在例子中会有体现),然后确定配置即可。再选择启用即可启用开发者模式。

三、        一个简单的例子

先把测试代码抛出,然后进行讲解:

<?php
/**
  * wechat php test
  * update time: 20150114
  */

//define your token
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
if (isset($_GET['echostr'])) {
    $wechatObj->valid();
}else{
    $wechatObj->responseMsg();
}

class wechatCallbackapiTest
{
    public function valid()
    {
        $echoStr = $_GET["echostr"];

        //valid signature , option
        if($this->checkSignature()){
            echo $echoStr;
            exit;
        }
    }

    public function responseMsg()
    {
        //get post data, May be due to the different environments
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

          //extract post data
        if (!empty($postStr)){

                $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                $fromUsername = $postObj->FromUserName;
                $toUsername = $postObj->ToUserName;
                $keyword = trim($postObj->Content);
                $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>";
                if(!empty( $keyword ))
                {
                      $msgType = "text";
                    $contentStr = "Welcome to wechat world!";
                    $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                    echo $resultStr;
                }else{
                    echo "Input something...";
                }

        }else {
            echo "";
            exit;
        }
    }

    private function checkSignature()
    {
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];
        $token = TOKEN;
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr, SORT_STRING);
        $tmpStr = implode( $tmpArr );
        $tmpStr = sha1( $tmpStr );

        if( $tmpStr == $signature ){
            return true;
        }else{
            return false;
        }
    }
}

?>

我之前定义的Token是“weixin”所以在代码中也要定义相应的Token,有了之前的原理说明我们知道,如果是在开发者首次提交验证申请时,微信服务器将发送GET请求到填写的URL上,并且带上四个参数(signature、timestamp、nonce、echostr),开发者通过对签名(即signature)的效验,来判断此条消息的真实性。我们通过GET中是否含echostr来判断是不是首次提交验证申请,如果是,我们调用$wechatObj->valid()来验证消息的真实性,验证的方法在前面已经提到过,具体的代码在checkSignature()中。

如果消息并不是提交验证申请,那么,我们调用$wechatObj->responseMsg()来回应用户发送的文本消息,回应的文本是“Welcome to wechat world!”。

下面简要的说一下responseMsg()这个函数,它主要功能是用户发送非空的文本,返回给用户一个文本“Welcome to wechat world!”:

1. 获取post数据,存入$postStr中;

2. 如果非空,解析$postStr,存入对象$postObj中;

3. 通过$postObj获取$fromUsername(发送方)、$toUsername(接收方)、$keyword(关键字)、$time(时间);

说到这里,不得不提一下微信端的服务器A和我们自己的服务器B之间发送的消息是怎样的,绝不仅仅是用户在客户端发送的字符串,而是XML数据包的格式,下面是一个例子:

<xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>1348831860</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[this is a test]]></Content>
    <FuncFlag>0</FuncFlag>
</xml>

标签依次记录接收方、发送方、创建时间、消息类型、消息内容。无论是A发送给B,还是B发送给A都是以此格式发送,当B准备好数据发送给A时,B的发送方就是之前的接收方,接收方就是之前的发送方,时间不变,类型也是text,内容成为“Welcome to wechat world!”,对应的代码就是:

$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = trim($postObj->Content);
$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>";
if(!empty( $keyword ))
{
  $msgType = "text";
  $contentStr = "Welcome to wechat world!";
  $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
    echo $resultStr;
}else{
     echo "Input something...";
}

xml格式的信息就好比填空题试卷,A填完之后发给B,B修改填空题的答案之后再发给A,开发者要做的就是处理接受的数据得到新的数据,并把新的数据填到试卷上。

代码写完之后发布在服务器B上,然后配置好微信公众平台,使得微信平台服务器A和服务器B相互连接。启用开发者模式,客户端发送任何文本消息就可以接收到“Welcome to wechat world!”的信息啦。其他形式的消息也是如此,只不过更改一下XML的格式即可。

时间: 2024-10-08 19:16:09

微信公众平台开发:初体验的相关文章

第四篇 :微信公众平台开发实战Java版之完成消息接受与相应以及消息的处理

温馨提示: 这篇文章是依赖前几篇的文章的. 第一篇:微信公众平台开发实战之了解微信公众平台基础知识以及资料准备 第二篇 :微信公众平台开发实战之开启开发者模式,接入微信公众平台开发 第三篇 :微信公众平台开发实战之请求消息,响应消息以及事件消息类的封装 首先,我们看看原来写的dopost方法: /** * 处理微信服务器发来的消息 */ public void doPost(HttpServletRequest request, HttpServletResponse response) thr

微信公众平台开发之会员卡

微信公众平台开发之会员卡是商家获取用户信息和实现线上线下交易的重要途径之一.通过在微信上发布会员卡,然后让用户填写自己的个人信息之后就可以领取到线上的会员卡,这个会员卡在线下也是可以使用的.可以在会员卡上发布一些最新通知,礼品券,优惠券,会员特权等等,用户达到一定的积分或者在线下消费一定的金额才可以领取这些优惠,这样可以吸引用户去获取积分实现每日签到的功能,这样用户就能看到我们推送的消息.下面就由微时代来简单介绍一下会员卡吧: 1.在微时代后台设置会员卡的回复信息,当用户回复关键词"会员卡&qu

微信公众平台开发之万能表单

微信公众平台开发之万能表单是为了方便我们得到用户的信息.我们可以在后台设置任何需要用户填写的信息,比如:电话,姓名,性别,工作等等信息,当然我们也可以设置一定的奖励,只要完善这些信息就可以得到一定的礼品,这样用户才会去填写这些信息,通过这样的方式可以很快的获取用户信息.下面就由微时代来简单介绍一下万能表单功能吧: 1. 在微时代后台万能表单的内容,给该万能表单设置关键词,这样当用户回复该关键词的时候就能进去填写资料了. 2. 为该表单添加选项,设置用户需要填写的内容,比如姓名,电话,性别,工作这

微信公众平台开发之无线订餐

微信公众平台开发之无线订餐功能是餐饮行业必备的工具.无线订餐可以方便打工一族,特别是白领们的日常生活.很多白领中午都不愿出去吃饭,这时候他们就喜欢叫外卖,传统的打电话叫外卖的方式已经过时了,现在都用微信实现无线订餐,在微信上可以看到所有的菜品和价格,只要选择好自己想吃的菜然后点击下单,设置好地址和时间以及联系电话就可以很轻松的完成订餐了,货到付款的方式也给客户带来很好的体验.下面就由微时代来简单介绍一下无线订餐功能吧: 1.在微时代后台设置无线订餐的触发关键词,和无线订餐的简介. 2.添加菜品分

微信公众平台开发之微预约

微信公众平台开发之微预约是为了方便我们和用户进一步的沟通.用户在微信上看到我们的产品后当觉得好,并且有意向想进一步了解的时候,就会抽个时间到商店里面去看实际效果,那么这个时候就需要预约,预约好以后到这个时间来就行了.这样双方都能有个事先的准备从而提高办事效率.下面就由微时代来简单介绍一下微预约功能吧: 1. 在微时代后台添加预约的内容,给该预约设置关键词,这样当用户回复该关键词的时候就能进行预约了. 可以设置预约的地点,并且用地图标记出来方便用户一键导航.当然用户预约的时候需要填写时间和电话以及

微信公众平台开发--获取用户基本信息

本文介绍如何获得微信公众平台关注用户的基本信息,包括昵称.头像.性别.国家.省份.城市.语言.本文的方法将囊括订阅号和服务号以及自定义菜单各种场景,无论是否有高级接口权限,都有办法来获得用户基本信息,而无需模拟登录. 在本文中,特别要注意的是有两个不同的Access Token,他们产生的方式不一样,一种是使用AppID和AppSecret获取的access_token,一种是OAuth2.0授权中产生的access_token,方倍工作室分别称为全局Access Token和授权Access

网络架构、云平台和微信公众平台开发接入

版权声明:本文为博主原创文章,未经博主允许不得转载. 云与后端相关的技术似乎并不属于嵌入式和物联智能硬件开发工程师的范畴,但是嵌入式开发工程师有必要认识成熟的网络架构和相关的云技术,以拓展自己在系统架构方面的视野.大数据分析是物联网背后的核心价值,物联智能硬件是物联大系统的终端,开发工程师不仅要深入精通物联技术,也应该去理解大系统,甚至整个生态领域的相关技术. 作为嵌入式开发工程师,也许并不需要熟悉云和后端的技术开发,但至少要对其中用到的技术和接口有一定的认识. 一.网络架构 常见的网络架构分为

***微信公众平台开发: 获取用户基本信息+OAuth2.0网页授权

本文介绍如何获得微信公众平台关注用户的基本信息,包括昵称.头像.性别.国家.省份.城市.语言.本文的方法将囊括订阅号和服务号以及自定义菜单各种场景,无论是否有高级接口权限,都有办法来获得用户基本信息,而无需模拟登录. 在本文中,特别要注意的是有两个不同的Access Token,他们产生的方式不一样,一种是使用AppID和AppSecret获取的access_token,一种是OAuth2.0授权中产生的access_token,方倍工作室分别称为全局Access Token和授权Access

Senparc.Weixin.MP SDK 微信公众平台开发教程(十二):OAuth2.0说明

紧接上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(十一):高级接口说明>,这里专讲OAuth2.0. 理解OAuth2.0 首先我们通过一张图片来了解一下OAuth2.0的运作模式: 从上图我们可以看到,整个过程进行了2次"握手",最终利用授权的AccessToken进行一系列的请求,相关的过程说明如下: A:由客户端向服务器发出验证请求,请求中一般会携带这些参数 ID标识,例如appId 验证后跳转到的URL(redirectUrl) 状态参数

微信公众平台开发入门教程

在这篇微信公众平台开发教程中,我们假定你已经有了PHP语言程序.MySQL数据库.计算机网络通讯.及HTTP/XML/CSS/JS等基础. 我们将使用微信公众账号方倍工作室作为讲解的例子,二维码见底部. 本系列教程将引导你完成如下任务: 创建新浪云计算平台应用 启用微信公众平台开发模式 基础接口消息及事件 微信公众平台PHP SDK 微信公众平台开发模式原理 开发天气预报功能 第一章 申请服务器资源 创建新浪云计算应用 申请账号 我们使用SAE新浪云计算平台作为服务器资源,并且申请PHP环境+M