微信端php 开发技术要求,微信第三方平台开发详解——PHP版

申请第三方平台,这个很简单直接按照提示填写,下面的授权事件接收URL中获取的component_verify_ticket是会过期的,所以不要只获取一次,缓存起来每10分钟会发送一次,每1小时会更新一次。

a42f5c918b63bbbdf536d8655d5f68f8.png

附上我的获取component_verify_ticket的代码:我是缓存和数据库都保存了

微信有提供wxBizMsgCrypt.php加解密核心代码

/**

* 授权事件接收URL

* @access public

*

*/

public function sysMessage()

{

$wxComponentTicketModel = new \app\diuber\model\WxComponentTicket();

$encodingAesKey = $this->encodingAesKey;

$token = $this->token;

$appId = $this->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']) ;

$encryptMsg = file_get_contents('php://input', 'r');

libxml_disable_entity_loader(true);

$result = json_decode(json_encode(simplexml_load_string($encryptMsg, 'SimpleXMLElement', LIBXML_NOCDATA)), true);

if(config('redis_set')['use_status']){

$redis = $wxComponentTicketModel->initializeRedis();

$redis->set('wx_component_verify_ticket_xml',$encryptMsg);

}

$pc = new \WXBizMsgCrypt($token, $encodingAesKey, $appId);

$xml_tree = new \DOMDocument();

$xml_tree->loadXML($encryptMsg);

$array_e = $xml_tree->getElementsByTagName('Encrypt');

$encrypt = $array_e->item(0)->nodeValue;

$format = "";

$from_xml = sprintf($format, $encrypt);

// 第三方收到公众号平台发送的消息

$msg = '';

$errCode = $pc->decryptMsg($msg_sign, $timeStamp, $nonce, $from_xml, $msg);

if ($errCode == 0) {

//print("解密后: " . $msg . "\n");

$xml = new \DOMDocument();

$xml->loadXML($msg);

$array_e = $xml->getElementsByTagName('ComponentVerifyTicket');

$component_verify_ticket = $array_e->item(0)->nodeValue;

//logResult('解密后的component_verify_ticket是:'.$component_verify_ticket);

$dateline = time();

$data = array(

'app_id' => $result['AppId'],

'encrypt' => $result['Encrypt'],

'create_time' => $dateline + 600,

//'info_type' => $result['AppId'],

'component_verify_ticket' => $component_verify_ticket,

'time' => date('Y-m-d H:i:s')

);

if(config('redis_set')['use_status']){

$redis = $wxComponentTicketModel->initializeRedis();

$redis->set('wx_component_verify_ticket',json_encode($data));

}

$existComponentTicke = $wxComponentTicketModel->get(array('component_verify_ticket'=>$component_verify_ticket));

if(!$existComponentTicke){

$wx = $wxComponentTicketModel->create($data);

if($wx){

echo 'success';

exit;

}else{

echo 'fail';

exit;

}

}else{

echo 'success';

exit;

}

}else{

echo 'fail';

exit;

}

}

9882fbc0be2abe0dd666a4bb1fe9f79f.png

地址:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419318479&token=bc7c35421376903886e43747e4bf165c9be36663&lang=zh_CN

公众号消息与事件接收URL,直接上代码:

这个方法处理3中不同的事件推送,

1.MsgType为text类型,并且Content信息为‘QUERY_AUTH_CODE:xxxxxxxxx’:需要通过接口’https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=xxx ’POST回复过去。

2.MsgType为text类型,并且Content信息为‘TESTCOMPONENT_MSG_TYPE_TEXT’:需要把Content信息改为‘TESTCOMPONENT_MSG_TYPE_TEXT_callback’然后加密return

3.MsgType为event类型:需要注意的是当MsgType为event类型时是没有Content信息的会增加一个Event的字段,这里只要获取到Event然后在后面加上‘from_callback’保存为Content字段信息,统一加密return。

具体逻辑看代码

/**

* 公众号消息与事件接收URL

* @access public

*

*/

public function callback()

{

$wxComponentTicketModel = new \app\diuber\model\WxComponentTicket();

$wxCallbackModel = new \app\diuber\model\WxCallback();

$wxAccessTokenModel = new \app\diuber\model\WxAccessToken();

$encodingAesKey = $this->encodingAesKey;

$token = $this->token;

$appId = $this->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']) ;

$encryptMsg = file_get_contents('php://input');

$pc = new \WXBizMsgCrypt($token, $encodingAesKey, $appId);

$xml_tree = new \DOMDocument();

$xml_tree->loadXML($encryptMsg);

$array_e = $xml_tree->getElementsByTagName('Encrypt');

$encrypt = $array_e->item(0)->nodeValue;

$format = "";

$from_xml = sprintf($format, $encrypt);

// 第三方收到公众号平台发送的消息

$msg = '';

$errCode = $pc->decryptMsg($msg_sign, $timeStamp, $nonce, $from_xml, $msg);

if ($errCode == 0) {

$xml = new \DOMDocument();

$xml->loadXML($msg);

$array_e2 = $xml->getElementsByTagName('ToUserName');

$ToUserName = $array_e2->item(0)->nodeValue;

$array_e3 = $xml->getElementsByTagName('FromUserName');

$FromUserName = $array_e3->item(0)->nodeValue;

$array_e5 = $xml->getElementsByTagName('MsgType');

$MsgType = $array_e5->item(0)->nodeValue;

$nowTime = date('Y-m-d H:i:s');

$contentx = '';

if($MsgType=="text") {

$array_e = $xml->getElementsByTagName('Content');

$content = $array_e->item(0)->nodeValue;

$needle ='QUERY_AUTH_CODE:';

$tmparray = explode($needle,$content);

if(count($tmparray) > 1){

//3、模拟粉丝发送文本消息给专用测试公众号,第三方平台方需在5秒内返回空串

//表明暂时不回复,然后再立即使用客服消息接口发送消息回复粉丝

$contentx = str_replace ($needle,'',$content);

$info = $wxAccessTokenModel->getMiniAppInfo($contentx);

$test_token = $info['info']['authorizer_access_token'];

$content_re = $contentx."_from_api";

echo '';

$data = '{

"touser":"'.$FromUserName.'",

"msgtype":"text",

"text":

{

"content":"'.$content_re.'"

}

}';

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

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_POST, 1);

curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

curl_exec($ch);

curl_close($ch);

}else{

//2、模拟粉丝发送文本消息给专用测试公众号

$contentx = "TESTCOMPONENT_MSG_TYPE_TEXT_callback";

}

}elseif($MsgType == "event"){ //1、模拟粉丝触发专用测试公众号的事件

$array_e4 = $xml->getElementsByTagName('Event');

$event = $array_e4->item(0)->nodeValue;

$contentx = $event.'from_callback';

}

$text = "

$nowTime

";

//加密消息

$encryptMsg = '';

$errCode = $pc->encryptMsg($text, $timeStamp, $nonce, $encryptMsg);

$wxCallbackModel->create(array('from_user_name'=>$FromUserName,'to_user_name'=>$ToUserName,'msg_type'=>$MsgType,'content'=>$contentx,'create_time'=>$timeStamp));

echo $encryptMsg;

exit();

} else {

if(config('redis_set')['use_status']){

$redis = $wxComponentTicketModel->initializeRedis();

$redis->set('wx_call_back_err',$errCode);

}

exit();

}

}

到这里已经全部完成了全网发布的准备了。可以直接点击全网发布监测,通过以后一般会在2-3之内通过审核。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443564.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

刷题神器怎么导入java,怎么导题库_有没有比较好的可以自己导入题库进行模拟考试练习的软件_淘题吧...

① 本人有一题库,怎么把里面的试题全部导出题库都加密了,没有导出功能。只能固定抽题后,整理出来。② 在线考试系统题库怎么导入数据库优考试的考试系统导入题库是用word和excel的模板去编辑试题,再进行导入③ 如何导出机考app题库…

Java读取指定目录下的所有文件名

1.效果图:在控制台输出所有的文件的文件名如下: 2.FileUtil.java: package cn.gov.csrc.base.report.util;import java.io.File; import java.util.ArrayList;public class FileUtil {/*** 获取指定目录下的所有文件名* * param obj* return*/public sta…

php min命令,php min函数怎么用?

php min函数用于返回一个数组中的最小值,或者几个指定值中的最小值,其语法是min(array_values),参数array_values必需,指规定一个包含值的数组。php min函数怎么用?定义和用法min() 函数返回一个数组中的最小值&#x…

php协程和goroutine,浅谈协程和Go语言的Goroutine

0x00.前言前面写了一篇今天来学习Go语言的Goroutine机制,这也可能是Go语言最为吸引人的特性了,理解它对于掌握Go语言大有裨益,话不多说开始吧!通过本文你将了解到以下内容:什么是协程以及横向对比优势Go语言的Goroutin…

Java实现:月,日,年,周,访问量统计

一:工程截图: 二:运行效果图: 三:CountObjectInfo.java: package cn.csrc.base.count;import java.util.Date;public class CountObjectInfo {// 总访问量合计protected int totalCount 0;// 日访问量protected int d…

JavaMelody开源系统性能监控软件:

一:从网上搜索,发现 javamelody 监控web应用程序不错。 JavaMelody能够在QA和实际运行生产环境监测Java或Java EE应用程序服务器。并以图表的形式显示:Java内存和Java CPU使用情况,用户Session数量,JDBC连接数&#x…

java zoneoffset,java - 如何在java8中获取默认的ZoneOffset? - SO中文参考 - www.soinside.com...

tl;drOffsetDateTime.now().getOffset()但您可能应该使用时区而不是仅仅偏离UTC。ZoneId.systemDefault()Offset versus Time Zoneoffset-from-UTC只是一小时,几分钟和几秒钟 - 仅此而已。time zone是特定地区人民使用的偏移的过去,现在和未来变化的历史…

php声波模拟开门,关于 php使用扩展控制树莓派io 驱动超声波测距

经过昨天一下午&#xff0c;终于写好了基于只需要安装完毕&#xff0c;就可以调用函数了&#xff1a;<?php /*** Created by PhpStorm.* User: tioncico* Date: 19-7-6* Time: 下午4:45*/define(PI_TRIG,0);define(PI_ECHO,1);if (wiringPiSetup()false){echo "初始化…

Java和poi导出excel报表

一&#xff1a;poi jar下载地址&#xff1a;点击打开链接&#xff1a; 二&#xff1a;工程截图&#xff1a; 三&#xff1a;运行效果截图&#xff1a; 四&#xff1a;源代码&#xff1a; Student.java: package com.poi.bean;import java.util.Date;public class Student {pri…

sh.k7p.work/index.php,Laowang's Blogs

OpenDayLight(硼Boron版本)实战开发入门OpenDayLight[1](简写为ODL)的硼Boron(0.5.0)版本于2016-09-16 这几天刚刚发布。作为一款开源SDN网络控制器&#xff0c;依托于强大的社区支持以及丰富的功能特性&#xff0c;ODL成为了目前主流的SDN网络控制器开发平台。不仅为开发者提供…

Java和iText导出pdf文档

一&#xff1a;工程截图&#xff1a; 二&#xff1a;项目运行截图&#xff1a; 三&#xff1a;源代码&#xff1a; Book.java package com.iText.bean;public class Book {private int bookId;// 图书编号private String name;// 图书名称private String author;// 图书作者pr…

linux多进程原理,Linux进程调度

极简模式假设我的系统只有一种调度算法cfs那么有个调度的队列 cfs_rq所有running的进程都会 进入这个队列&#xff0c;不在running 或者其他情况会出队列&#xff0c;ok。则假设队列控制的算法有以下。cfs_rq_enqueuecfs_rq_dequeuecfs_rq_pick所操作的是进程描述符 task_struc…

openwrt使用linux内核版本,降低OpenWRT的Linux内核版本

不久前&#xff0c;为了移植某驱动程序&#xff0c;笔者可谓绞尽脑汁&#xff0c;在4.1内核版本上&#xff0c;尝试了很多次都没能成功&#xff0c;后来仔细分析&#xff0c;才知道是内核版本过高导致的&#xff0c;本文给出降低内核版本的方法&#xff0c;具体编译环境的搭建&…

linux天气软件,类似智能手机!Linux中安装Conky天气插件

如今&#xff0c;智能手机中很多都安装相匹配外观的天气小插件&#xff0c;而对于喜欢操作系统平台的用户而言&#xff0c;可以在你的Linux桌面中拥有像智能手机一样的天气外观。通过Flair Weather Conky可以将使用一个GUI工具Conky Manager在Linux中轻松地管理Conky。这里介绍…

linux安装下载中文包,linux下安装中文包和字体

在虚拟机中使用中文输入法和中文显示使用的是rhel5的镜像我把其镜像挂载在/mnt/cdrom中&#xff0c;然后切换到/Server目录下&#xff0c;安装支持中文字体Mount /dev/cdrom /mnt/cdromCd /mnt/cdrom/serverrpm -ivh fonts-chinese-3.02-9.6.el5.noarch.rpmrpm -ivh fonts-ISO8…

linux无桌面重做系统,Linux不需要重做系统

感谢hsyyf的投递但从系统构架上来讲&#xff0c;总所周知&#xff0c;Linux的稳定性远大于windows&#xff0c;单纯的使用不会引起系统的损坏。当不进行危险操作时&#xff0c;例如执行sudo rm-rf/*之类的命令&#xff0c;或者混用分区工具&#xff0c;是不会引起各种彻底性损坏…

linux远程连接工具putty使用方法,linux远程登陆工具putty使用

#putty工具百度下载即可&#xff0c;最好从官网下。安装时&#xff0c;除安装位置外&#xff0c;其余默认即可。1、使用命令ifconfig命令&#xff0c;记下eth0的IP&#xff0c;我的是192.168.1.1692、打开putty&#xff0c;并将查到的ip写在图中位置&#xff0c;下侧的Saved Se…

linux mint安装步骤,Linux mint 安装步骤

##Linux mint 安装步骤##家里的笔记本以前一直用Deepin系统&#xff0c;但是Deepin系统的wifi实在是太慢了。还有就是启动软件是有时候总没响应&#xff0c;卡死机。 最近重装系统&#xff0c;选择了mint ,在这里记录下安装步骤。###1.制作U盘启动盘###下载iso文件&#xff0c;…

linux 商业游戏,Ubuntu下安装试玩原生Linux版商业游戏Braid

这款原生Linux版商业游戏Braid国外出售价大约在80美元左右。每年在Linux平台上发布的原生商业游戏是屈指可数&#xff0c;而且这些游戏的质量也是参差不齐。不过这款原生Linux版商业游戏Braid还是值得一玩的&#xff0c;这款Braid游戏创意十足&#xff0c;您可以通过拼图和时间…

linux centos 7 crontab 启动,CentOS 7 Linux执行crontab 计划任务实操 - 好应网

[inlosc_lg_title]一、环境准备[/inlosc_lg_title]yum install vixie-cron #安装定时任务插件yum install crontabs #安装定时任务crontabs/bin/systemctl restart crond.service #启动服务/bin/systemctl reload crond.service #重新载入配置/bin/systemctl status crond.serv…