公司准备在微信公众号上做个东西,所以研究了一周的微信公众号开发,今天在这里做一个总结。 在总结之前,先说一下本人使用的环境,语言是PHP,框架是 CI 和CI框架下的一个RESTFul框架 codeigniter-restserver 。 一、配置服务器在开发之前,我们首先需要在微信公众号下设置服务器配置,这里完全可以参考官方的 接入指南 。 需要说明两点的是:
/** * 检查消息是否来自微信 * @return bool */ private function check_from_wx() { //检查$_GET中的参数 param_check($_GET, ['signature', 'timestamp', 'nonce']); //获取参数 $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = WX_APP_TOKEN; $tmpArr = array($token, $timestamp, $nonce); // use SORT_STRING rule sort($tmpArr, SORT_STRING); $tmpStr = implode($tmpArr); $tmpStr = sha1($tmpStr); //验证 if($tmpStr == $signature) { return true; } else { return false; } } /** * 配合微信服务器验证是否有效 */ public function check_get() { $echoStr = $this->get("echostr"); if($this->check_from_wx()) { echo $echoStr; } else { echo "验证不通过"; } exit; } 看到上面的代码,你也许会有疑问,为什么在 到这里,我们算是配置好了,下面我们来看看如何接收和回复用户发来的消息。 二、接收消息和回复消息接收和回复消息的流程图大概就是这样的:
看了上面的消息接收和回复流程图,我们下面使用代码进行实现。在配置服务器的时候,我先前填写的URL地址对应的接口是 /** * 检查消息是否来自微信 * @return bool */ private function check_from_wx() { //检查$_GET中的参数 param_check($_GET, ['signature', 'timestamp', 'nonce']); //获取参数 $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = WX_APP_TOKEN; $tmpArr = array($token, $timestamp, $nonce); // use SORT_STRING rule sort($tmpArr, SORT_STRING); $tmpStr = implode($tmpArr); $tmpStr = sha1($tmpStr); //验证 if($tmpStr == $signature) { return true; } else { return false; } } public function check_post() { //检查消息是否来自微信 if(!$this->check_from_wx()) { //非法 echo "非法操作"; } //获取POST参数 $param = file_get_contents("php://input"); //将xml格式中的数据读取成数组 $param = $this->format->factory($param, 'xml')->to_array(); //将消息插入by_message表中 $result = $this->share_model->insert($msg_info, 'by_message'); //回复空字符串 echo ""; } 上面代码值得注意有三个地方,第一个地方是我们检查消息是否来自微信,是获取 当写好代码之后,我们在微信公众号中发送消息,它就会将消息存入到 当接收消息没问题之后,我们就可以进行回复消息了,代码如下: public function check_post() {
//检查消息是否来自微信
if(!$this->check_from_wx()) {
//非法
echo "非法操作";
}
//获取POST参数
$param = file_get_contents("php://input");
//获取xml中的数据
$param = $this->format->factory($param, 'xml')->to_array();
//选出参数
$msg_info = array_choose($param, ['Content', 'ToUserName', 'FromUserName', 'MsgId', 'MsgType']);
//将消息插入数据库
$result = $this->share_model->insert($msg_info, 'by_message');
//获取信息
$to_user = $param['ToUserName'];
$from_user = $param['FromUserName'];
$content = $param['Content'];
//去掉消息id
unset($param['MsgId']);
//回复的内容
$content = 'http://xxxxxx.com/';
$response_text = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$response_text = sprintf($response_text, $from_user, $to_user, time(), $param['MsgType'], $content);
echo $response_text;
}
配置好之后,我们在微信公众输入字符,它就会回复 上面代码需要注意的是,我们回复消息的时候,返回的数据格式是 还有,上面回复的消息是文本消息,我们还可以回复图片、图文、语音、视频、音乐等消息,其实它们都大体相同,查看官方的文档 被动回复用户消息 这一节,按照对应的格式进行回复就行了。 到这一步的时候,是不是很有成就感?其实,这还是很小的一步,微信开发还有很多的内容,就消息管理这部分来说,它就分接收和发送消息两大类。 其中,接收消息有两种:
而发送消息就有被动
了解了流程之后,我们下面来实现模板消息的发送。 三、发送模板消息模板消息可以定制,而且发送模板消息后,微信会主动推送给用户,这是我们开发很需要的一个功能。(注:模板消息只有认证后的服务号才可以使用)。 首先,我们在微信公众平台的 然后,我们对应着模板详情的数据格式,写一个接口专门用来发送模板消息。 下面是模板详情:
对应上面的模板消息,我们的接口这么写: /** * 发送模板消息 */ public function send_template_message_get() { //检查参数 param_check($this->get(), ['uid']); $uid = $this->get('uid'); //wx appid $wx_app_id = WX_APP_ID; $wx_app_secret = WX_APP_SECRET; //get access token $token_info = file_get_contents("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$wx_app_id&secret=$wx_app_secret"); $token_info = json_decode($token_info, true); $access_token = $token_info['access_token']; //获取用户信息 $openid = $this->user_model->get_value('openid', $uid); //组织参数 $param = array( "touser" => $openid, "template_id" => "jt_Rl5X9QWXMiRihrQz67n4riGt3kaPA81Zku0wLm9M", "url" => "http://www.beyondwinlaw.com/test/wx/test/home.html", "data" => [ "first" => [ "value" => "案件有新进展", "color" => "#173177" ], "keyword1" => [ "value" => "jkfdjafjdsfjdjfs", "color" => "#173177" ], "keyword2" => [ "value" => "jkfdjafjdsfjdjfs", "color" => "#173177" ], "keyword3" => [ "value" => "jkfdjafjdsfjdjfs", "color" => "#173177" ], "keyword4" => [ "value" => "2016-07-12 11:11:11", "color" => "#173177" ], "keyword5" => [ "value" => "jkfdjafjdsfjdjfs", "color" => "#173177" ], "remark" => [ "value" => "点击查看案件进度详情", "color" => "#173177" ] ] ); //发送请求 $url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=$access_token"; $result = send_post($url, $param); answer([ "result" => $result ]); } 效果是这样的:
这样,我们就实现了模板消息的发送,至于客服消息、群发接口,原理差不多,因为我没实现过,这里就不多说了。 四、网页授权,获取用户信息微信采用的是OAuth对开发者进行授权的,具体OAuth授权原理请google查询。在开发之前,我们需要先到公众平台官网中的
整个授权过程,其实微信官方已经说的很清楚了。我这里简略说一下,算是总结下吧! 首先,我们需要获取access_token,它的时序图和微信开放平台类似,如下: 这整个过程是当用户要登录我们的网站时,我们带上回调地址、AppId、scope等参数跳转到微信授权页面;然后获得用户的同意之后,它会跳转到我们的回调地址,并带上code参数;最后我们通过code、AppId、AppSecret请求接口,获取access_token。 之后,我们通过access_token请求对应的接口,就可以获取用户的基本信息了。 需要注意地方有两个:
具体的实现细节,根据官方文档 微信网页授权 和 网站应用微信登录开发指南 的步骤来就行了。 五、JS-SDK的使用在我们要做的产品中,我们希望能够控制每个页面分享的链接,而JS-SDK就可以做到这一切。 它的使用步骤可以查阅 微信JS-SDK说明文档 这个文档,而且在网页最后还有对应的 DEMO页面 和 示例代码 。 我们的实现是这样的,在前端专门写了一个JS文件 var server_url = "http://192.168.30.249/by/wx_api/index.php/share/wx_config"; var url = window.location.href; //配置微信 $.ajax({ type: "GET", url: server_url, data: { url: encodeURI(url) }, dataType: "json", success: function(data){ // alert('请求分享配置数据成功'); wx.config({ debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: data.data.appId, // 必填,公众号的唯一标识 timestamp: data.data.timestamp, // 必填,生成签名的时间戳 nonceStr: data.data.nonceStr, // 必填,生成签名的随机串 signature: data.data.signature,// 必填,签名,见附录1 jsApiList: ['onMenuShareAppMessage', 'onMenuShareTimeline'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function() { // alert("分享验证完毕"); }); wx.error(function() { // alert("分享验证失败"); }); //获取uid和link_id var uid = localStorage.getItem("uid"); var linkId = localStorage.getItem("link_id"); var shareUrl = "http://www.baidu.com"; //存在linkId, 则分享带上link_id等参数 if(linkId != undefined && linkId != "" && linkId != null) { shareUrl = shareUrl + "?super_id=" + uid + "&link_id=" + linkId; } // alert("分享链接: "+shareUrl); wx.onMenuShareAppMessage({ title: '分享测试', // 分享标题 desc: '测试一下', // 分享描述 link: shareUrl, // 分享链接 imgUrl: 'http://www.beyondwinlaw.com/gw4/images/zhongjie.jpg', // 分享图标 type: 'link', // 分享类型,music、video或link,不填默认为link dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空 success: function () { // 用户确认分享后执行的回调函数 // alert("分享成功"); }, cancel: function () { // 用户取消分享后执行的回调函数 // alert("取消分享"); } }); }, error: function(data) { alert('请求分享配置数据失败'); } }); 而具体JS-SDK权限签名算法的实现是放在后台的,这个实现我是直接使用官方的 /** * 获取微信配置 */ public function wx_config_get() { //获取参数 param_check($this->get(), ['url']); $url = $this->get('url'); $url = urldecode($url); $jssdk = new JSSDK(WX_APP_ID, WX_APP_SECRET, $url); $signPackage = $jssdk->GetSignPackage(); answer($signPackage); } 而修改后的JS-SDK代码如下:
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|