微信端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…

java io加速器,Java 日期操作

测试代码:Calendar calendar Calendar.getInstance();Date today new Date();calendar.setTime(today);calendar.add(Calendar.DATE, -1);Date yesterday calendar.getTime();calendar.add(Calendar.DATE, 2);Date tomorrow calendar.getTime();SimpleDateForma…

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

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

Java连接mysql出现SQL异常,MySQL 这样连接为何出现这样的异常

当前位置:我的异常网 Java Web开发 MySQL 这样连接为何出现这样的异常MySQL 这样连接为何出现这样的异常www.myexceptions.net 网友分享于:2013-09-12 浏览:12次MySQL 这样连接为何出现这样的错误大家好,小弟初学JSP,在连接数据库的时候遇…

matlab usb cam,Matlab环境下使用USB2.0摄像头编程image acquisition tools(读书笔记) | 学步园...

(1)Matlab环境下使用USB2.0摄像头编程Matlab中的图像获取工具箱给我们提供了必要的函数,我们直接调用就可以了,主要就是简单的介绍如何使用该工具箱进行对USB2.0摄像头的编程。TAG: USB摄像头 MatlabMatlab中的图像获取工具箱给我们提供了必要的函数&am…

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

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

数组之间的计算matlab,matlab中的矩阵运算和数组运算方法

MATLAB 具有两种不同类型的算术运算:数组运算和矩阵运算。您可以使用这些算术运算来执行数值计算,例如两数相加、计算数组元素的给定次幂或两个矩阵相乘。矩阵运算遵循线性代数的法则。数组运算则是执行逐元素运算并支持多维数组。句点字符 (.) 将数组运…

php爬取flash的交互数据库,基于PHP的Flash与MySQL数据库通讯的实现

第 27卷 第 6期 2013年 12月 商洛学院学报 Journal of Shangluo University V01.27 NO.6 Dec. 2013 基于 PHP的 Flash与 MySQL数据库通讯的实现 聋彦 。 (商洛学院 计算机科学系,陕西商洛 726000) 摘 要 :根据新媒体 网…

mysql版本不支持 loop,loopback4, node mysql connector支持 utf8mb4字符集

场景:数据库sql语句包含emoji 表情符号,比如微信登录昵称包含有表情符号,数据库使用utf8无法插入 会提示 ‘Incorrect string value: ‘xF0x9Fx90xBExE5xAE...‘ for column ‘nick_name‘ at row 1‘,原因:使用loopback4 做后端&…

php 获取警告信息,获取PHP警告错误信息的解决方法_PHP教程

代码如下所示:复制代码 代码如下:";fileWrite($filename, $result, w);}function sendBankMsg($msg){$timestamp time();$params "msg".$msg."&posttime".$timestamp;$length strlen($params);//创建socket连接$domain "www.…

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是特定地区人民使用的偏移的过去,现在和未来变化的历史…

matlab几种循环,Matlab for 多个变量循环能不能这样啊 ,求教高手!!!!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼for a0.003:0.0005:1; b0.002:0.0005:0.9; c0.001:0.0005:0.8;d0.0005:0.0005:0.7;E1a* E_Bone;E2b* E_Bone;E3c* E_Bone;E4d* E_Bone;G1a* G_Bone;G2b* G_Bone;G3c* G_Bone;G4d* G_Bone;%% Integration for cortical bone partsIn…

宝塔asp php,宝塔Windows面板部署ASP、ASPX程序WEB网站环境方法

宝塔Windows面板部署ASP、ASPX程序WEB网站环境方法一般Windows系统建站用户可能较多是程序是ASP或者是ASPX的,这样只能在Windows系统中才能运行。说实话,对于中文软件来说也没有太多内容可以分享的,直接我们照着操作就可以了,既然…

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…

matlab汉明码psk,设计一个汉明码编码的2PSK调制的数字通信系统

汉明码信道编码的2psk调制数字通信系统设计一个采用2PSK调制的数字通信系统设计系统整体框图及数学模型&#xff1b;产生离散二进制信源&#xff0c;进行信道编码(汉明码)&#xff0c;产生BPSK信号&#xff1b; 加入信道噪声(高斯白噪声)&#xff1b;BPSK信号相干解调&#xff…

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网络控制器开发平台。不仅为开发者提供…