一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - PHP教程 - 關(guān)于php微信訂閱號(hào)開(kāi)發(fā)之token驗(yàn)證后自動(dòng)發(fā)送消息給訂閱號(hào)但是沒(méi)有消息返回的問(wèn)題

關(guān)于php微信訂閱號(hào)開(kāi)發(fā)之token驗(yàn)證后自動(dòng)發(fā)送消息給訂閱號(hào)但是沒(méi)有消息返回的問(wèn)題

2020-12-09 14:54小小mo PHP教程

最近做了個(gè)項(xiàng)目,當(dāng)token驗(yàn)證之后,發(fā)送消息給訂閱號(hào),但是沒(méi)有消息返回,下面小編通過(guò)本篇文章給大家分享我的解決辦法

相信很多人會(huì)跟我一樣,token驗(yàn)證之后,發(fā)送消息給訂閱號(hào),沒(méi)有消息返回。

以下,說(shuō)一下我辛苦調(diào)試得到的解決辦法:

首先,token驗(yàn)證:

自己寫的token一直驗(yàn)證失敗,找了好久,沒(méi)有發(fā)現(xiàn)bug。實(shí)在沒(méi)辦法,就用了官方的示例代碼。并且通過(guò)示例代碼調(diào)試,發(fā)現(xiàn)了一個(gè)讓我吐血的bug(也不算bug):

token驗(yàn)證貌似要求字符編碼格式!?。?!

官方的示例代碼,直接上傳到服務(wù)器,token直接過(guò)!

把官方示例代碼改為UTF-8格式,再上傳覆蓋,token失??!失敗!失??!

后來(lái),把自己寫的修改為ANSI格式還是token失??!醉了醉了!那只好用官方示例代碼。在此,說(shuō)下,token是一次握手驗(yàn)證,驗(yàn)證過(guò)一次就不用了。

下面,言歸正傳,貌似偏題了...orz

token驗(yàn)證之后,直接用官方示例代碼,趕緊測(cè)試自己的訂閱號(hào),結(jié)果....發(fā)出去的消息就跟潑出去的水一樣,什么鬼都沒(méi)有返回...orz

又各種找bug,各種群?jiǎn)枺鞣N搜索....歷經(jīng)本博主九九八十一的努力,終于找出了問(wèn)題所在(這里是指我自己開(kāi)發(fā)的,并不包括全部,如果你有不同的bug,歡迎交流):

1、最容易被忽視的一個(gè)bug,官方給的示例代碼,壓根就沒(méi)調(diào)用寫好的那個(gè)responseMsg()函數(shù)!

2、把之前的token代碼注釋,也就是$wechatObj->valid();這行代碼。因?yàn)閠oke驗(yàn)證那段代碼會(huì)有一個(gè)echo $echostr,會(huì)把responseMsg()函數(shù)里的echo $resultStr;(56行)xml格式混亂,輸回給微信服務(wù)器就無(wú)法識(shí)別了(貌似只能識(shí)別xml格式,還有json格式)。(token驗(yàn)證是一次握手驗(yàn)證,驗(yàn)證開(kāi)發(fā)者之后,就可以不用了,趕緊讓它消失在我們整潔的代碼orz...)

3、最惡心的一個(gè)bug,還是字符編碼問(wèn)題!orz...xml要求UTF-8編碼,所以,把示例代碼改回UTF-8編碼!這個(gè)bug找的讓我崩潰!??!

下面是我修改后的代碼,能正常運(yùn)行,無(wú)bug,需要的可以參考一下

php" id="highlighter_23625">
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<?php
 /**
 * wechat php test
 */
 //define your token
 define("TOKEN", "codcodog");
 $wechatObj = new wechatCallbackapiTest();
 //$wechatObj->valid();
 $wechatObj->responseMsg();
 class wechatCallbackapiTest
 {
  public function valid()
  {
   $echoStr = $_GET["echostr"];
   //valid signature , option
   if($this->checkSignature()){
   header('content-type:text');
    echo $echoStr;
    exit;
   }
  }
  public function responseMsg()
  {
   //get post data, May be due to the different environments
   $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
   //$postStr = file_get_contents("php://input");
   file_put_contents("log.txt",$postStr,FILE_APPEND );
   //extract post data
   if (!empty($postStr)){
     /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
     the best way is to check the validity of xml by yourself */
     libxml_disable_entity_loader(true);
     $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
     $fromUsername = $postObj->FromUserName; //用戶
     $toUsername = $postObj->ToUserName;  //公眾平臺(tái)
     $keyword = trim($postObj->Content);
     $time = time();
     $textTpl = "<xml>
        <ToUserName><![CDATA[%s]]></ToUserName>
        <FromUserName><![CDATA[%s]]></FromUserName>
        <CreateTime>%s</CreateTime>
        <MsgType><![CDATA[%s]]></MsgType>
        <Content><![CDATA[%s]]></Content>
        <FuncFlag></FuncFlag>
        </xml>";   
     if(!empty( $keyword ))
     {
      $msgType = "text";
      $contentStr = "Welcome to wechat world!";
      $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
      echo $resultStr;
     }else{
      echo "Input something...";
     }
   }else {
    echo "";
    exit;
   }
  }
  private function checkSignature()
  {
   // you must define TOKEN by yourself
   if (!defined("TOKEN")) {
    throw new Exception('TOKEN is not defined!');
   }
   $signature = $_GET["signature"];
   $timestamp = $_GET["timestamp"];
   $nonce = $_GET["nonce"];
   $token = TOKEN;
   $tmpArr = array($token, $timestamp, $nonce);
   // use SORT_STRING rule
   sort($tmpArr, SORT_STRING);
   $tmpStr = implode( $tmpArr );
   $tmpStr = sha( $tmpStr );
   if( $tmpStr == $signature ){
    return true;
   }else{
    return false;
   }
  }
 }
 ?>

以上所述是小編給大家分享的php微信訂閱號(hào)開(kāi)發(fā)之token驗(yàn)證后自動(dòng)發(fā)送消息給訂閱號(hào)但是沒(méi)有消息返回的解決方案,希望大家喜歡。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 大象传媒1234区 | 精品小视频在线观看 | 久久久无码精品亚洲欧美 | 火影小南被爆羞羞网站 | 无限资源在线观看8 | 性猛交娇小69hd | 小浪妇奶真大水多 | 国产欧美综合精品一区二区 | 蜜桃88av | 久久性生大片免费观看性 | 99r在线播放 | 动漫美女人物被黄漫在线看 | 夫妇交换小说全文阅读 | 免费一级毛片完整版在线看 | 国产精品va在线观看不 | 国产精品国色综合久久 | 久久全国免费久久青青小草 | 久久久精品日本一区二区三区 | 大肥臀风间由美 中文字幕 大东北chinesexxxx露脸 | 国产大片视频免费观看 | 91精品国产品国语在线不卡 | 亚洲国产精品综合一区在线 | 91麻豆网址| 国产成人www免费人成看片 | 嫩草香味| 国产人va在线 | 亚洲AV无码乱码在线观看浪潮 | 精品免费久久久久久成人影院 | s8017加密路线免费 | 操尼姑| 亚洲国产在线播放在线 | 59日本人xxxxxxxxx69 | 免费观看国产大片资源视频 | 无删减影视免费观看 | 亚洲天堂2016 | 果冻传媒在线播放观看w | 俄罗斯一级淫片 | 5x社区在线观看直接进入 | 日本性生活大片 | 乳 好大h | 黄a 大片a v 永久免费 |