近日,公众号有很多朋友留言,需要微信公众号开发和微信支付相关的文章。近日来工作较多,但仍然要为大家提供有价值的内容。依照常规,此次为各位奉上尽可能的完整方案。

 关于公众号

申请公众号的URL为:https://mp.weixin.qq.com

微信公众号分为如下三类:

公众号分类本质其实就是权限不同。

测试号申请

一些开发人员急于开发,以为需要在真实环境下调试。其实微信提供了测试环境,或者称Sandbox沙箱。

地址为:https://mp.weixin.qq.com/wiki

申请菜单如下网页界面:

微信公众平台接口测试申请页面如下界面:

通过扫描二维码后,点击手机屏幕上的【确认登录】

网页自动进入如下界面:

 

微信工作流程:

 

Access Token

Access_token是微信公众号的全局唯一票据,公众号调用各接口时都需使用access_token。

如何获取Access Token,来看如下界面:

我们通过PHP来获取Access Token,使用curl函数库(参见以下代码)

 

生成二维码

QRCode:quick response code,简称二维码。

第一步我们生成ticket:

第二步用ticket换取二维码

 

接入校验

找到下载位置进行下载:

使用下载的样本文件,修改其中的TOKEN常量,这个校验只是第一次接入微信平台使用。

 

以后修改使用该文件中的responseMsg方法就可以完成和微信用户的交互。

 

我们的服务器通过微信平台发送的XML文档中的MsgType判断微信用户发送的消息类型。

制作聊天机器人

我们可以使用网站http://www.sobot.com/chat/h5/index.html的聊天机器人制作我们的微信聊天。(另外还有小i机器人,微软小冰等API可以利用)

分析聊天网站的数据传送方式如下之界面:

分析网站的提交数据的格式及返回数据。分析结果体现在方法 _doText中的如下部分:

$curl = 'http://www.sobot.com/chat/robot/chat.action';

$data =

'requestText='.$postObj->Content.'&sysNum=4c349791a07b46c1a70b8ac88aa23257&uid=ea24c9b3b0664225af4d21ba94ddbaa0&cid=5347dd7f65b24515b93700ded838d5df';

$content = $this->_request($curl, false, 'POST', $data);

$content = json_decode($content);

$contentStr = $content->answer;

 

注:详细见代码。运行结果如下:

创建菜单

微信公众号菜单的形式如下:

如何创建菜单接口。格式与说明:

创建菜单的格式是我们熟悉的JSON格式:

 

代码实现如下:

 

public function _createMenu($menu){

$curl = 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token='.$this->_getAccessToken();

$content = json_decode($this->_request($curl,true,'POST',$menu));

if($content->errcode == 0)

echo "菜单成功创建";

}

 

界面效果如下图:

用户点击“休闲”菜单中的“打蛋蛋”就可以进行游戏了:

发送图文信息到微信用户

此功能为用户在公众号上写相应文字,自动回复图文消息。消息格式如下:

主要PHP代码如下:

private function _sendNews($postObj){ //发送图文消息

//制定图文消息模板

$newstpl = '<xml>

<ToUserName><![CDATA[%s]]></ToUserName>

<FromUserName><![CDATA[%s]]></FromUserName>

<CreateTime>%s</CreateTime>

<MsgType><![CDATA[news]]></MsgType>

<ArticleCount>%s</ArticleCount>

<Articles>

%s;

</Articles>

</xml> ';

$news_item_tpl = '

<item>

<Title><![CDATA[%s]]></Title>

<Description><![CDATA[%s]]></Description>

<PicUrl><![CDATA[%s]]></PicUrl>

<Url><![CDATA[%s]]></Url>

</item>';

$news = array(

array(

'title' =>'俱乐部排名:恒大亚洲第2 中超8队进亚洲前100',

'desc'=>'北京时间9月8日消息,足球数据统计网站“footballdatabase”发布了最新一期世界足球俱乐部排行榜,沙特豪门阿尔希拉尔亚洲排名第1,广州恒大以1606分位居世界第85位,在亚洲俱乐部中排名第2位。',

'picurl'=>'http://k.sinaimg.cn/n/transform/20150908/7Jwd-fxhqhun8508720.jpg/w570557.jpg',

'url'=>'http://sports.sina.com.cn/china/j/2015-09-08/doc-ifxhqhuf8215452.shtml'),

array(

'title' =>'郭艾伦搭上亚锦赛末班车 12人名单提前曝光',

'desc'=>'北京时间9月8日消息,据男篮内部人士透露,近期刚刚回归国家队的郭艾伦已经确定进入亚锦赛12人名单。目前,男篮12人名单已经基本出炉,篮协将在明天(9日)将12人名单正式上报。',

'picurl'=>'http://k.sinaimg.cn/n/transform/20150624/SjZz-fxefurs2835558.jpg/w57028f.jpg',

'url'=>'http://sports.sina.com.cn/cba/2015-09-08/doc-ifxhqtsx3621664.shtml')

);

$news_list = '';

foreach($news as $n){

$news_list.=sprintf($news_item_tpl,$n['title'],$n['desc'],$n['picurl'],$n['url']);

}

echo sprintf($newstpl,$postObj->FromUserName,$postObj->ToUserName,time(),2,$news_list);

 

}

最终实现结果如下图:

上传素材

微信公众平台,须按以下格式上传媒体资源:

上传素材代码如下:

public function _createMedia($type, $file){

$curl='https://api.weixin.qq.com/cgi-bin/media/upload?access_token='.$this->_getAccessToken().'&type='.$type;

$data['type'] = $type;

$data['media'] = '@'.$file;

file_put_contents('./medialib',$this->_request($curl, true, 'POST', $data));

}

搜索歌曲

在这里,我们利用百度的歌曲搜索功能来实现。首先分析百度音乐掌门的URL。

1.按歌曲名称和歌手的URL

http://box.zhangmen.baidu.com/x?op=12&count=1&title=歌曲名$$歌手名$$$$

2.按歌曲名称的URL

http://box.zhangmen.baidu.com/x?op=12&count=1&title=歌曲名$$

我们进行搜索结果的拼接。如下图:

代码实现:

private function _getMusicUrl($song,$singer){

if($singer == ''){

$curl = 'http://box.zhangmen.baidu.com/x?op=12&count=1&title='.$song.'$$';

}else{

$curl = 'http://box.zhangmen.baidu.com/x?op=12&count=1&title='.$song.'$$'.$singer.'$$$$';

}

$content = $this->_request($curl,false);

$content = simplexml_load_string($content, 'SimpleXMLElement', LIBXML_NOCDATA);

$musicurl = substr($content->url->encode,0,strrpos($content->url->encode,'/')+1).substr($content->url->decode,0,strrpos($content->url->decode,'&'));

return $musicurl;

}

 

 

回复歌曲消息的格式如下:

 

代码实现如下:

 

private function _sendMusic($postObj){

$postObj->Content = mb_substr($postObj->Content,2, mb_strlen($postObj->Content,'UTF-8')-2,'UTF-8');

$songinfo = explode('@',$postObj->Content);

$song = trim($songinfo[0]);

$singer = '';

if(isset($songinfo[1])){

$singer = trim($songinfo[1]);

}

$musicUrl = $this->_getMusicUrl($song,$singer);

$musictpl = '<xml>

<ToUserName><![CDATA[%s]]></ToUserName>

<FromUserName><![CDATA[%s]]></FromUserName>

<CreateTime>%s</CreateTime>

<MsgType><![CDATA[music]]></MsgType>

<Music>

<Title><![CDATA[%s]]></Title>

<Description><![CDATA[%s]]></Description>

<MusicUrl><![CDATA[%s]]></MusicUrl>

<HQMusicUrl><![CDATA[%s]]></HQMusicUrl>

<ThumbMediaId><![CDATA[PIfRVcpn3q3c8C8-Iw0jn-bEMJRYeTTNDWElJzJfmQxfsODHNyvnEZ7ODBICL_EM]]></ThumbMediaId>

</Music>

</xml>';

$resultStr = sprintf($musictpl,$postObj->FromUserName,$postObj->ToUserName,time(),$song,$singer,$musicUrl,$musicUrl);

echo $resultStr;

exit;

}

 

 

小结

本篇为公众号申请与互动开发篇。下一篇将继续介绍微信支付为主题的开发详解,敬请期待

微信公众号开发指南接入与互动开发篇