PHP 开发社区微信服务号实战图解

本博文就月初刚上线的微信服务号,图文进行总结分享给大家。

去年年底,我所在的团队讨论要开发微信号,话题由此拉开:

原来有一个3年前注册的微信号,但是后台操作无法从“订阅号”变更为“服务号”,随即找腾讯的客服沟通,客服还算是热情,mm耐心的告之系统已经更新,对于无法升级的微信号,只能重新注册----“*#*(*¥)¥K30#$e&#)”,一阵抓狂后,只能重新注册了,下面就开始从注册到内部需求讨论,到开发的图文总结。

Step1:微信注册

在微信公众号官网:https://mp.weixin.qq.com,点击注册

如上图所示,微信号由邮箱注册,每个邮箱仅能申请一种帐号:服务号、订阅号或企业号。

      • 基本信息
      • 邮箱激活
      • 选择类型
      • 信息登记
      • 公众号信息

这里按照说明输入公司信息即可,本次我们选择的是认证服务号的选项:

为了认证服务号,需要支付300元/年,这个步骤稍微麻烦一些:财务打款、等待7个工作日、邮递发票等。

需要注意的是,微信的认证不是腾讯官方,是其委托方的第三方,这个刚开始的时候还比较差异。

 

在完成后的认证后,认证信息如下(略过中间扫描公司的营业执照、扫描盖公章的认证协议等细节):

认证后的微信(带金色对钩的是本次开发的微信):

          

 

Step2:微信文档&API学习

微信开发和学习使用ComponentOne控件一样,需要做第一件事件是看微信官方的文档、API、demo样例代码,这样能极大减少走弯路的风险。

备注:原计划看几本热销的微信开发书籍,后来因为时间原因放弃了。

登陆微信后台,点击左侧的“开发者中心”,右侧出现的“开发者文档”、“在线接口调试工具”即是微信官方提供的文档和API利器,在开发过程中,会反复、多次使用,这2个是非常重要的资料。

在公众号“开发者中心”中,把AppID和AppSecret记下来,后面会多次用到。

微信的官方文档,首先从上往下通读一遍:

在文档的开始,微信官方就提供了PHP示例代码,下载地址。 且其明确的告之,微信公众号接口只支持80接口.

官方文档写的非常细,如获取access token是基于HTTP请求,用的是GET方式,其他的文档请直接参阅文档

access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。

http请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

 
备注:access_token的有效时间是7200s,既需要自行做一个缓存,2小时刷新一次access_token; 我在这里用的是文件的缓存方式,添加了时间戳。
 

Step3:开发环境搭建

这节,我们着手搭建环境。

首先选择http://git.oschina.net 搭建源码托管环境,OSC提供了免费的私有项目,配合使用TortoiseGit-1.8.11.0-64bit,使得搭建源码托管环境非常简单。另外,其在国内访问Git速度超快(赞一个!)

接着安装软件,配置电脑开发环境:

    • Windows 8.1 64位 中文版
    • JetBrains PhpStorm 8.0.2
    • SQL Server 2008
    • PHP 5

为了方便测试,和公司网管沟通,把微信的***.gcpowertools.com.cn/ 80端口映射到我的局域网电脑。事后证明,这种本地调试方法非常高效,极大了提高了开发、调试效率。最后,为了方便调试微信数据,需要写log进行日志呈现,这里我使用的是读写文件的方式。

function writeLogBegin($msg = "begin log..............")
{
    $logFile = date('Y-m-d') . '.txt';
    $msg = date('Y-m-d H:i:s') . ' >>> ' . $msg . "\r\n";
    file_put_contents("c:\\log.txt", $msg);
}

 

Step4:微信开发

首先,结合业务特点,规划微信底部的自定义菜单。

小技巧:自定义菜单不用写代码,用微信官方自带的调试页面即可完成。

 

规划好自定义菜单后,POST JSON到微信服务器,可直接使用微信公众平台接口调试工具

保存生成的access_token, 类似如下的文本:

vU2rq8nzdXZWmcS3jO1OAZzRL5dnm3OIlsPF8ZCKHkTGfrG8f87QpwYa4mBpkTvnuy0pQJsfyq_L5xLIqPSoIBIqdsVAaKOuEgBrPpQ4

 

接着选择“自定义菜单”,输入刚才保存的access_token,输入如下的JSON字符串:

{
      "button":[

      {

           "name":"学习中心",

           "sub_button":[

            {

               "type":"click",

               "name":"联系葡萄城",

               "key":"101"

            }]

       },

       {

           "name":"我的服务",

           "sub_button":[

            {

                "type": "view",

                "name": "最新动态",

                "url": "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx9665cf3fcdaee2f1&redirect_uri=http://www.gcpowertools.com.cn&response_type=code&scope=snsapi_base&state=118#wechat_redirect"

            },

            {

                "type": "view",

                "name":"最新版本",

                "url": "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx9665cf3fcdaee2f1&redirect_uri=http://www.gcpowertools.com.cn&response_type=code&scope=snsapi_base&state=118#wechat_redirect"

            },

            {

                "type":"click",

                "name":"金牌服务查询",

                "key":"102"

            },

            {

                "type":"click",

                "name":"金牌服务条款",

                "key":"103"

            }

            ]

       },

       {

           "name":"GCDN社区",

           "sub_button":[

           {

               "type":"click",

               "name":"每日签到",

               "key":"104"

            },

            {

               "type":"click",

               "name":"信息查询",

               "key":"105"

            },

            {

               "type":"click",

               "name":"我的帖子",

               "key":"106"

            },

            {

               "type":"click",

               "name":"热门问答",

               "key":"107"

            },

            {

                "type":"view",

                "name":"礼品兑换",

                "url":"https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx9665cf3fcdaee2f1&redirect_uri=http://www.gcpowertools.com.cn&response_type=code&scope=snsapi_base&state=118#wechat_redirect"

            }]

       }]

}

 

备注:创建自定义菜单后,由于微信客户端缓存,需要24小时微信客户端才会展现出来。建议测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。

接着,我们进行核心的功能开发。

微信服务号的核心围绕GCDN社区,故“GCDN社区”子菜单有5个二级菜单,其中每日签到、信息查询、我的帖子、礼品兑换功能需要首先绑定自己的GCDN账号GCDN账号。

依据上面的逻辑,绑定GCDN账号是前提环节,故需要开发绑定功能。 绑定功能,做了一个页面,通过a标签跳转,用户在输入用户名、密码后进行GCDN鉴权验证,验证通过存储在表:包含GCDN ID、微信的OpenID,既完成账号绑定。

后面的多个功能,通过这个表,可从微信的OpenID获得GCDN ID,继而可以使用GCDN论坛中的个人信息。

 

每日签到功能

打开论坛页面,在底部可看到目前GCDN使用的引擎较早,是Discuz!NT 3.6.711版本,故X3.1版本中时尚的签到功能是没有的。针对这个遗憾,本次微信开发做了弥补:用户可通过微信的签到完成这个功能。

 

GCDN回帖微信通知

这是另外一个特色功能:无需操作,只需要绑定GCDN账号,当你在GCDN的发帖有人回复时,会自动收到微信通知。

这个功能的开发,主要是为了还GCDNer的一个期待:在《2013年葡萄城控件用户满意度调查》,论坛用户对此类功能呼声很高,“谢谢你们的努力和尽职尽责,我希望GCDN回帖及时些,最好有及时的短信通知功能,省的我时不时的刷新GCDN页面,催促你们!”--某GCDN用户。

 

实现思路如下图所示:

 

微信通知用户,刚开始想的是文本通知,结果发现微信公众号的政策:如果用户未在24小时内主动和微信互动,则无法用文本通知用户。想到另外一个变通的办法,各大银行的余额动态通知功能。接着仔细找微信提供的功能,原来这种功能是“微信模板消息”。

 

这段文档关于微信的模板消息写的很详细:

为了保证用户不受到骚扰,在开发者出现需要主动提醒、通知用户时,才允许开发者在公众平台网站中模板消息库中选择模板,选择后获得模板ID,再根据模板ID向用户主动推送提醒、通知消息。

约花了半天时间,开发出的功能效果看起来还不错(用户是否在24小时内主动联系,均可发送模板消息),截图如下:

如想配置这个功能,通过回复文字指令。

    • 回复"取消提醒": 自动关闭微信通知提醒
    • 回复"开通提醒":自动开通微信通知提醒(需要你绑定GCDN账号)

 

上面的开发过程,用到的PHP的 curl 实现HTTP GET、POST请求的源码:

/** * @param $url * @param null $data * @return mixed */function https_request($url, $data = null){    // 模拟提交数据函数    $curl = curl_init(); // 启动一个CURL会话    curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在    curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转    curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer    if (!empty($data)) {        curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求        curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包    }    curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环    curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回

$tmpInfo = curl_exec($curl); // 执行操作    if (curl_errno($curl)) {        echo 'Errno' . curl_error($curl);//捕抓异常    }    curl_close($curl); // 关闭CURL会话    return $tmpInfo; // 返回数据}

 

雷区:如果你所在电脑有代理,务必添加如下代码:

   //使用网络代理begin    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);    curl_setopt($curl, CURLOPT_PROXY, '192.168.0.1');  //替换代理地址    curl_setopt($curl, CURLOPT_PROXYPORT, '880');      //替换代理端口    curl_setopt($curl, CURLOPT_PROXYTYPE, 'HTTP');    curl_setopt($curl, CURLOPT_PROXYUSERPWD, 'grapecity/r:r'); //替换代理用户名    //使用网络代理end
 

Step5:开发总结

  • 近2个月的开发时间,投入了约1.5人,粗略估算有3个人月开发投入。
  • 少数的几次非控件业务的研发,主要为了方便GCDN社区用户的使用,桥接微信、GCDN。
  • 选择使用PHP脚本语言不错,微信官方用PHP作为默认微信开发脚本,另外PHP开发微信的博客非常多。
  • 完整项目经验很重要:“坑才是大爱!”

坑的定义:有时候没有问题,有时候有问题。100%有问题的,不叫坑,叫bug。

  • Git利器: 协作开发,牛!
  • include_onece 路径错误这个坑,PHPStorm提供了足够的智能感知,要重视。
  • include_onece 路径用单引号,不要用双引号
  • 团队协力:人心齐、泰山移。微信功能的迭代,是一点一点沟通出来的。

 

小伙伴们,有微信的不妨扫一扫,看看大家还有啥需求,我们接着开发、写博客吧:

关注微信绑定GCDN账号,有GCDN勋章哟!

相关阅读:

微软 Build 2017 开发者大会:Azure 与 AI 的快速发展

是什么让C#成为最值得学习的编程语言

从Visual Studio看微软20年技术变迁

C#开发人员应该知道的13件事情

Visual Studio 2017正式版发布全纪录

 

时间: 2024-10-23 08:53:43

PHP 开发社区微信服务号实战图解的相关文章

微信服务号开发模式下,如何获取用户发送给服务号的信息,转给客服,再将客服回答信息转给用户?

问题描述 微信服务号开发模式下,如何获取用户发送给服务号的信息,转给客服,再将客服回答信息转给用户? 开发一个微信转接接口,需求是:微信服务号在开发者模式下,也就是有基本配置(服务器配置),获取到用户向服务号发送的信息,转接到在线客服,然后客服回答的信息在转接到用户,起到转接作用. 解决方案 收到信息后回复success或者空内容,保存微信发送的相关信息:http://mp.weixin.qq.com/wiki/1/6239b44c206cab9145b1d52c67e6c551.html 怎么

微信公众平台-微信服务号开发后台页面技术选型问题?

问题描述 微信服务号开发后台页面技术选型问题? 柳老师您好: 最近看了您的微信公众平台开发受益匪浅,但是遇到一些问题,例如你做的小q机器人,里面有一个关于作者的菜单,点击[阅读全文]后会跳入一个页面,我想问的就是这个页面一般是用什么技术开发的,有没有一些相关的要求. 解决方案 html5 jqueryMobile 就这些吧

站长网播报:QQ浏览器推视频广告遮盖 微信服务号改新规

中介交易 SEO诊断淘宝客 站长团购 云主机 技术大厅 1. QQ浏览器推视频广告遮盖 或冲击视频网站 专家指出,如果用户形成用浏览器寻找和播放视频的依赖后,必将对视频网站APP的入口地位构成冲击. 作为浏览器,似乎天然就有拦截广告的冲动,新近推出的QQ浏览器5.1版也不例外,在"广告拦截"上开始出手.不过,与此前某些浏览器不同的是,该功能并未对视频网站的贴片广告进行"拦截",而是将视频内容从经常骚扰用户的浮窗广告中"提取"出来.不论怎样,只要是

微信公众平台又宣布支持微信服务号开微店功能

这一切举动都反应微信在封闭的道路越走越远,但这一切结果究竟如何呢? 微信闭门做朋友圈营销 上次铁哥说微信封闭并预测朋友圈营销微信官方会来做时,一干网友表示不满并各种吐槽我是专注黑微信.微信小店,针对的主要用户应该是有实体公司挂靠能够过的了微信服务号的小企业,一般以代卖为主,这点区别于京东微店的B店模式.而微信小店在未来也一定会鼓励朋友圈营销的(否则没有线下支撑没有统一首页入口,流量何来).当然,京东微店未来也一定会借此风可以做朋友圈营销. 未来很有可能朋友圈的广告信息只能允许微信小店亦或京东微店

从招商证券官方微信活动看企业微信服务号运营

作者:沈志勇 最近,笔者的一位在某电梯企业负责品牌市场工作的朋友向我抱怨:他们公司的官方服务号微信,但由于没有有效的服务功能,加上微信服务号每月只能推送一次的限制,他们的官方微信一直没有运转起来. 这位朋友遇到的情况并非个例.微信5.0版以后,越来越多的企业服务号微信上线,很多企业在没有考虑清楚的情况下就贸然将原先注册的订阅号升级为服务号,但是真正能够提供有针对性的服务的账号却屈指可数,大量服务号由于没有实用功能,用户活跃度和互动大幅下降,很多企业的官方服务号微信也因此停滞,逐步沦为鸡肋. 那么

测试-微信服务号关于苹果手机不能授权登录

问题描述 微信服务号关于苹果手机不能授权登录 网站进行评论的时候测试苹果手机并不能跳转到微信服务号授权登陆的页面,但是安卓手机却可以跳转,并且评论成功,这是因为什么原因,是微信服务号接口的原因吗? 解决方案 用模拟器看下,看下http网络发包有没有成功,用fiddler 解决方案二: 能详细的说明一下吗,我这是半路接下来的,很多东西都不清楚.谢谢.

java-怎样实现微信企业号回复微信服务号的发来的消息

问题描述 怎样实现微信企业号回复微信服务号的发来的消息 例如我在微信服务号上发送消息为"你好", 内容会发送到企业号上, 企业号根据接收到的信息来进行回复, 企业号将回复的消息发送到服务号上, 服务号再把信息展示给用户. 一般我们发送信息给服务号,服务号进行回复.但现在我想通过服务号作为中转,将消息发送给企业号,企业号再把回复信息发送给作为中转的服务号,然后给用户进行回复

spring mvc开发公众号-spring mvc开发的微信公众号怎么设置验证时的URL

问题描述 spring mvc开发的微信公众号怎么设置验证时的URL 您好. 我想咨询一下用spring mvc开发的微信公众号,在填写服务器配置时的url时应该写哪些?我的项目名是:weixinGo RequestMapping是valid.do 解决方案 就写上域名/valid.do就行,然后把你这个应用的token写上,在把剩下的填完就行了 解决方案二: http://域名/valid.do/? 这样吗?

微信服务号能取代App吗?

腾讯科技 宗秀倩 7月22日报道 7月1日,iHealth.咕咚.乐心.荣耀手环微信版在京东上首发,微信智能硬件平台从此曝光.此后,越来越多的智能硬件厂商开始选择接入微信平台. 最新的消息是,用微信做管理的智能插座"微插座"也已经在点名时间上众筹.天气管理软件墨迹天气的硬件产品"空气果"团队也已和微信接触,准备接入微信硬件平台.在硬件开发者跃跃欲试的同时,无论是从硬件开发者对微信硬件平台的反馈,还是从腾讯科技交替试带ihealth智能手表和咕咚手环的体验来看,微信硬