微信端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.pswp.cn/news/443564.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443564.shtml
英文地址,請注明出處:http://en.pswp.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網絡控制器開發平臺。不僅為開發者提供…