近日,公众号有很多朋友留言,需要微信公众号开发和微信支付相关的文章。近日来工作较多,但仍然要为大家提供有价值的内容。依照常规,此次为各位奉上尽可能的完整方案。
关于公众号
申请公众号的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;
}
小结
本篇为公众号申请与互动开发篇。下一篇将继续介绍微信支付为主题的开发详解,敬请期待