当前位置:首页 > 技术分享 > 正文内容

关于微信第三方平台(全网发布检测)检测流程以及踩到的坑

admin4年前 (2020-12-14)技术分享2896

能点到全网发布这一步,说明你已经弄好了获取component_verify_ticketcomponent_access_token等这些参数,通常这个时候点击全网发布只会有这两个失败。

在这里插入图片描述


如果其他失败的那就要好好检查一下你的代码了,或者查看其他博主的文章,这里有个推荐https://www.jianshu.com/p/0bd94af8ad7a

以下代码仅供参考流程.

两个文本消息都是发送到消息与事件接收URL这里,也就是带/$APPID$的地址上,这个是我发布检查通过的代码块

 public function index(){

	 require_once('../extend/php/WXBizMsgCrypt.php');

	 //encodingAesKey和token均为申请三方平台是所填写的内容
	 $encodingAesKey = '****************';
	 $token = '****************';
	 $appId = '****************';
	 $timeStamp = empty($_GET ['timestamp'] ) ? "" : trim ( $_GET ['timestamp'] );
	 $nonce = empty ($_GET['nonce'] ) ? "" : trim ( $_GET ['nonce'] );
	 $msg_sign = empty($_GET ['msg_signature'] ) ? "" : trim ( $_GET ['msg_signature'] );
	 $pc = new \WXBizMsgCrypt( $token, $encodingAesKey, $appId );
	 //获取到微信推送过来post数据(xml格式)
	 $postArr=file_get_contents('php://input');

	 $sMsg = '';
	 $errCode=$pc->decryptMsg($msg_sign, $timeStamp, $nonce, $postArr,$sMsg);

	 if($errCode == 0){
	   //处理消息类型,并设置回复类型和内容
	   $postObj=simplexml_load_string($sMsg,'SimpleXMLElement',LIBXML_NOCDATA);

	   //判断该数据包是否是订阅(用户关注)的事件推送
	   if(strtolower($postObj-> MsgType) == 'event'){
				//如果是关注subscribe事件
				if(strtolower($postObj->Event== 'subscribe')){
						 $public_name=strval($postObj->ToUserName);
						 $map['public_name']=$public_name;
						 $cont=M('Subscribe')->where($map)->find();
						 //回复用户消息
						 $content=$cont['content'];
						 responseText($postObj,$content);
				}
	   }
	   //第三方平台全网发布检测普通文本消息测试
	   if(strtolower($postObj-> MsgType) == 'text' &&trim($postObj->Content)=='TESTCOMPONENT_MSG_TYPE_TEXT'){

				$toUsername= $postObj -> ToUserName;
				if($toUsername== 'gh_3c884a361561'){

					$content= 'TESTCOMPONENT_MSG_TYPE_TEXT_callback';
					$res = $this->respontext($postObj,$content);
					//对xml信息加密后发送
					$jmsg = '';
				$sEncryptMsg = $pc->encryptMsg($res, $timeStamp, $nonce,$jmsg);

				  return $jmsg;

				}
	   }
	   //第三方平台全网发布检测返回api文本消息测试
	   if(strpos ($postObj->Content, 'QUERY_AUTH_CODE' ) !== false){
	   $content='';
	    responseText($postObj,$content);//注意这里要先回复空消息
			   $query_auth_code= trim(str_replace ( 'QUERY_AUTH_CODE:', '', $postObj->Content));

		 $access_info = $this->api_readly($query_auth_code);

				$fromusername = json_decode(json_encode($postObj));
				$param['touser'] = $fromusername->FromUserName;
				$param['msgtype'] = 'text';
				$param['text']['content'] = $query_auth_code . '_from_api';
				$jsonStr = json_encode($param);

				$url='https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='.$access_info;
				//调用客服消息api回复文本消息
				$access_token = new Accesstoken();
				$res = $access_token->post_data($url,$jsonStr);

	   }
	 }

检测时候微信会发送好几次到这个接口上的,每次信息都不同。

普通文本消息检测
如果进入到上面代码的普通文本消息检测的时候,就需要我们直接生成一段xml文本信息发送会微信,当然我们是要使用微信提供的加密方法来加密后发送。

记住要发送加密后的xml信息过去

加密后的xml信息过去

加密后的xml信息过去
重要的事情说三遍,免得你们也踩了这个坑,上面代码已经注释说明了,接下来附上回复xml信息的代码

    private function respontext($object, $content)
    {
        $textTpl = "<xml>
                      <ToUserName><![CDATA[%s]]></ToUserName>
                      <FromUserName><![CDATA[%s]]></FromUserName>
                      <CreateTime>%s</CreateTime>
                      <MsgType><![CDATA[text]]></MsgType>
                      <Content><![CDATA[%s]]></Content>
                    </xml>";
        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);
        return $result;
    }
回复api文本信息
到了这里就比较麻烦了,这里需要我们获取到发送过来的信息中有
"QUERY_AUTH_CODE:queryauthcode@@@vfDdKCKMkG4XAuVWadL4EzQvPipkwLr5YHv48HFGEF6nUR5TUdWBuRLIf3vzINKCb6oOSV46jzXgvA6W_ZIqEw"
这样信息的字段,然后截取到这样一段内容queryauthcode@@@vfDdKCKMkG4XAuVWadL4EzQvPipkwLr5YHv48HFGEF6nUR5TUdWBuRLIf3vzINKCb6oOSV46jzXgvA6W_ZIqEw;


在这里插入图片描述


通过调用这个接口拿到我们需要的authorizer_access_token授权码,这个后面调用回复文本信息api接口需要用到,下面是调用接口获取authorizer_access_token授权码

//根据授权码获取api回复信息中需要的数据public function api_readly($query_auth_code){

	$access_token = new Accesstoken();
	$token = $access_token->get_component_access_token();
	$post['component_appid'] = "wx335de0babdad9ff8";
	$post['authorization_code'] = $query_auth_code;
	$jsonStr = json_encode($post);

	$url = "https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token=".$token;
	$result = $access_token->post_data($url,$jsonStr);

	$data = json_decode($result,true);

	return $data['authorization_info']['authorizer_access_token'];}

好了,获取到授权码,返回回去,编写好主动回复信息(tip:最上面的代码有些),转换成json格式,然后把拿到的authorizer_access_token放到

$url='https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='.$access_info;

回复信息接口的参数上,调用接口返回,这样就ok了。
说实话,官方写的文档真的太难看明白了,感觉不是同一个地球上的,我的的建议手册就适当看一下,作为辅助,主要还是看一些比较厉害的博主写的文档来进行开发吧,这样比较容易懂.如果都设置好了还是不是,多试几次吧

来源:https://blog.csdn.net/weixin_43442553/article/details/92795330

扫描二维码推送至手机访问。

版权声明:本文由小刚刚技术博客发布,如需转载请注明出处。

本文链接:https://blog.bitefu.net/post/110.html

分享给朋友:

相关文章

thinkphp等框架开发中容易忽略的xss攻击及应对XSS攻击方法

thinkphp等框架开发中容易忽略的xss攻击及应对XSS攻击方法

虽然说现在的web开发框架都是挺成熟的框架,在性能、安全等方面都有比较好的表现,但问题往往出现在业务逻辑上,如上周我再公司发现的一个跨站脚本攻击,(通常公司是这么过滤的,max(0,$_GET[‘a’])、strip_tags($_GET[...

微软Windows 10升级密钥(例如家庭版升级为企业版) 不能用于激活系统

微软Windows 10升级密钥(例如家庭版升级为企业版) 不能用于激活系统

下面的密钥,是微软官方提供的,仅能用于Windows10系统版本的升级,比如从家庭版升级为专业版、专业版升级为企业版等。升级密钥不能用于激活系统,激活需要KMS或者数字权利,由于涉及到版权问题,在此不宜分享,请大家自行查找激活相关的内容。准...

PIP 更换国内安装源linux/windows

pip国内的一些镜像  阿里云 http://mirrors.aliyun.com/pypi/simple/   中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/   豆瓣(...

Nginx服务崩溃自动重启脚本(监控进程服务并自动重启进程服务)脚本

有一台服务器运行着Ngin最近突然有一次崩溃,导致使用方当天无法访问网页端,然后我不得不登录服务器,检查各项服务,发现nginx崩溃了,于是重启Nginx,问题解决。后来为了防止Nginx再发生这种情况给运维带来的运维成本,于是写了一个脚本...

用CMD命令查询域名的DNS解析记录:A,NS,MX,CNAME,TXT

1、查询域名的A记录nslookup -qt=A bitefu.net当然查询A记录你直接用ping命令来ping域名也可以获得A记录。2、查询域名的NS记录nslookup -qt=NS bitefu.net3、查询域名的MX记录nslo...

百度云网盘高速下载方法[测试可用]

百度云网盘高速下载方法[测试可用]

大前提这是一个油猴脚本,安装脚本之前,必须先安装油猴浏览器扩展(如已安装则跳过):【第一步】下载油猴 --> 如有提示安装,则直接安装即可,否则继续执行第二步【第二步】安装油猴 --> 参考其中章节:&nbs...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。