标签 微信 下的文章

很简短的备忘, 通过 user-agent 来识别
但据说因为泄露私隐等原因(籍口) Chrome正在倡导淘汰 UA 新版的chrome-core 会丢弃这个头信息,我想到时我会因此再更新一篇博客吧

$isWechat = false;
if(strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false){
    $isWechat = true;
}

如果你厌倦了朋友圈里冷不防的跳出个练尸鲲的小姨子或者打传奇拦不住的成龙大哥,以下是减少微信官方广告推送的办法。
为什么不是【关闭】而是【减少】,下文详述。

准备

你需要两台手机,两个微信账号。也可以找一个朋友/家人相互帮忙。


- 阅读剩余部分 -

接续处理前几天的需求,这两天原本是在思考公众号的响应交互有没有办法在被动回给用户一条多图文消息后,根据用户的点击动作继续给用户响应文本或图文消息。

不查不要紧,一查发现™D水真深,又是一个大坑。
首先我在官方的文档原文看到了一句之前未曾见到的补充说明
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543

回复图文消息 的参数说明内

ArticleCount 是(是否必须) 图文消息个数;当用户发送文本、图片、视频、图文、地理位置这五种消息时,开发者只能回复1条图文消息;其余场景最多可回复8条图文消息
Articles 是(是否必须) 图文消息信息,注意,如果图文数超过限制,则将只发限制内的条数

似乎是2018年底开始的改动,而且是偷偷改的,并未在微信开发者更新上进行公告。
?!! 那就是说, 只有事件型的响应例如关注、扫码 才可以触发最多8个items的图文消息,消息型的响应被阉割成1条了

然后我又查到了微信公众号开发者论坛的这条
https://developers.weixin.qq.com/community/develop/doc/0006c2dd60c6188526e7194ec56800?page=1#comment-list

里面也是一片惨叫。1250张八骏图从心里滚过..

立刻自己测试一下..

//该测试显示多图文
unset($its);

$its[0]["Title"]="测试显示多图文信息的复数查询结果";
$its[0]["PicUrl"]="http://wx.praysatoshi.top/wxservice/ruoyu_test/test_location_sm.png";    
$its[1]["Title"]="lat:".$lat;    
$its[2]["Title"]="lon:".$lon;
$its[3]["Title"]="以上是刚才上报的位置信息";
$its[4]["Title"]="多图文推送测试结束.";
die($this->xmlNews($fromUsername,$toUsername,$its)); //应推送出1+4 的5项图文信息块

...

/**
 * wechatCallbackapiTest::xmlNews()
 * 生成图文信息
 * @param mixed $fromUsername
 * @param mixed $toUsername
 * @param Array $items  
 * @return String $xml
 * items的元素(keys)有
 * Title
 * Description
 * PicUrl 首图360*200,小图200*200
 * Url
 */
 private function xmlNews($fromUsername,$toUsername,$items){
    $time = time();
    $xmlTpl = "<xml>
                <ToUserName><![CDATA[%s]]></ToUserName>
                <FromUserName><![CDATA[%s]]></FromUserName>
                <CreateTime>%s</CreateTime>
                <MsgType><![CDATA[news]]></MsgType>
                <ArticleCount>%s</ArticleCount>
                <Articles>
                %s
                </Articles>
               </xml>";

    $itemCount = count($items);

    //组织items串
    $stritem = "";
    foreach($items as $item){
        $stritem .="<item>";

        if($item["Title"]) $stritem .= "
                <Title><![CDATA[{$item["Title"]}]]></Title>";
        if($item["Description"]) $stritem .= " 
                <Description><![CDATA[{$item["Description"]}]]></Description>";
        if($item["PicUrl"]) $stritem .= "
                <PicUrl><![CDATA[{$item["PicUrl"]}]]></PicUrl>";
        if($item["Url"]) $stritem .= "
                <Url><![CDATA[{$item["Url"]}]]></Url>";
            else  $stritem .= "
                <Url><![CDATA[]]></Url>";          

        $stritem .="</item>";
    }

    $resultStr = sprintf($xmlTpl, $fromUsername, $toUsername, $time, $itemCount, $stritem);
    return $resultStr; 
}

微信图片_20190416021044.jpg

触发交互——SHIT! 实锤了!!

结论

安逸了..不用想微信内的交互了,明天向甲方解释一下..死了心做jssdk上的H5交互..

微信固然有自己的考虑,但从来当开发者和公众号用户的呼声是屎一样..着实被恶心了一次又一次,大家都想逃离然而又显得那么无可奈何。
当有实力抗衡这匹独角兽的挑战者出现的时候大家的义无反顾也会变得理所当然吧。

微信公众号的文档以多错漏著称,这次遇到的是关于获得用户发送位置信息的事件
顺着惯性思维翻看官方关于事件的文档
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140454

上报地理位置事件

用户同意上报地理位置后,每次进入公众号会话时,都会在进入时上报地理位置,或在进入会话后每5秒上报一次地理位置,公众号可以在公众平台网站中修改以上设置。上报地理位置时,微信会将上报地理位置事件推送到开发者填写的URL。

哇,这个不得了。发送之后就等于授权,每5秒都会在手机后台推送的吗?如果没有处理好可能会频繁轰炸用户消息的(误,并不会)
文档还附上了相应事件的xml原文

<xml>
  <ToUserName><![CDATA[toUser]]></ToUserName>
  <FromUserName><![CDATA[fromUser]]></FromUserName>
  <CreateTime>123456789</CreateTime>
  <MsgType><![CDATA[event]]></MsgType>
  <Event><![CDATA[LOCATION]]></Event>
  <Latitude>23.137466</Latitude>
  <Longitude>113.352425</Longitude>
  <Precision>119.385040</Precision>
</xml>

按照evnet: LOCATION 测试了之后却什么也捕获不到

原来我都搞错了,根本不是这个event,这个event是怎样触发的也是迷,对应的应该是消息类型的文档
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453
里的 地理位置消息

实验所得,得到的事件xml是类似

<xml>
<ToUserName><![CDATA[gh_9f025824da8c]]></ToUserName>
<FromUserName><![CDATA[oKzs50m0BFVm6X2sXc3lAzbrZUK8]]></FromUserName>
<CreateTime>1555092634</CreateTime>
<MsgType><![CDATA[location]]></MsgType>
<Location_X>22.*****5</Location_X>
<Location_Y>113.*****1</Location_Y>
<Scale>15</Scale>
<Label><![CDATA[广州市***地址马赛克***]]></Label>
<MsgId>22263574791840510</MsgId>
</xml>

其中并没有 event 元素, MsgType为小写 location

经验证:取值是 GPS的 WGS84坐标系,不需要转换。
(调用百度地图的API时需要标点时需要转换为百度坐标系 bd09ll, 文档参考 http://lbsyun.baidu.com/index.php?title=webapi/guide/changeposition

不负责地猜测这些类似的坑的原因

  • 微信内部缺乏有效的机制去回归和核对不同版本更新后的文档是否正确
  • 故意为之,在文档甚至源码中挖下一些并非十分严重的坑,用来提高公众号开发的门槛确保实施方的实力和代码质量
  • 因为鹅厂内部血汗工厂996的关系,导致工程师身兼数职没有足够的时间精力兼顾文档的更新(猜测这个事件的文档部分大部分从js-sdk部分复制过来)