微信接收消息API 未发送XML?
Wechat Receive Message API Not Sending XML?
我不确定这是微信端的问题,还是他们改变了API。我们有一个正确响应微信端点验证的端点(回显 echostr),并且每当我们收到新消息时我们也会收到 POST 消息。
问题是当我们的帐户收到一条消息时,我们收到的 POST 消息中没有任何 XML 内容。它发送其他所有内容(签名、随机数等),但没有消息 XML.
我们是不是做错了什么? API 有变化吗?我们握手不恰当吗?
XML 数据在原始 HTTP 请求正文中发送。
The raw HTTP request body as a byte string. This is useful for
processing data in different ways than conventional HTML forms: binary
images, XML payload etc.
这是微信发送到我的Django服务器的请求:
GET:<QueryDict: {u'nonce': [u'886****76'], u'timestamp': [u'1440041636'], u'signature': [u'29cb245a0f9399*******33956c3e96c500c56']}>,
POST:<QueryDict: {}>,
request.POST为空,表示不是常规的表单数据。
这是我在 Django 上处理来自微信的 POST 消息的方式:使用 request.read()。
@csrf_exempt
def weixin(request):
logger.debug(request)
token = #YOUR TOKEN
if not validate(request.GET['signature'],request.GET['timestamp'],request.GET['nonce'],token):
return Http404('')
if request.method == 'GET':
echo_str = request.GET['echostr']
if echo_str != None:
return HttpResponse(echo_str)
else:
return Http404('')
elif request.method == 'POST':
reply_str = reply(request.read())
return HttpResponse(reply_str)
return Http404('')
def validate(signature, timestamp, nonce, token):
if signature == None or timestamp == None or nonce == None or token == None:
return False
seq = sorted([token, timestamp, nonce])
logger.debug(seq)
tmp_str = ''.join(seq)
encode_str = hashlib.sha1(tmp_str).hexdigest()
logger.debug(encode_str)
if signature == encode_str:
return True
else:
return False
PHP 我没有验证过的代码。从 $GLOBALS["HTTP_RAW_POST_DATA"].
获取数据
public function responseMsg()
{
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr)){
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$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>0</FuncFlag>
</xml>";
if($keyword == "?" || $keyword == "?")
{
$msgType = "text";
$contentStr = date("Y-m-d H:i:s",time());
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}
}else{
echo "";
exit;
}
}
我不确定这是微信端的问题,还是他们改变了API。我们有一个正确响应微信端点验证的端点(回显 echostr),并且每当我们收到新消息时我们也会收到 POST 消息。
问题是当我们的帐户收到一条消息时,我们收到的 POST 消息中没有任何 XML 内容。它发送其他所有内容(签名、随机数等),但没有消息 XML.
我们是不是做错了什么? API 有变化吗?我们握手不恰当吗?
XML 数据在原始 HTTP 请求正文中发送。
The raw HTTP request body as a byte string. This is useful for processing data in different ways than conventional HTML forms: binary images, XML payload etc.
这是微信发送到我的Django服务器的请求:
GET:<QueryDict: {u'nonce': [u'886****76'], u'timestamp': [u'1440041636'], u'signature': [u'29cb245a0f9399*******33956c3e96c500c56']}>,
POST:<QueryDict: {}>,
request.POST为空,表示不是常规的表单数据。
这是我在 Django 上处理来自微信的 POST 消息的方式:使用 request.read()。
@csrf_exempt
def weixin(request):
logger.debug(request)
token = #YOUR TOKEN
if not validate(request.GET['signature'],request.GET['timestamp'],request.GET['nonce'],token):
return Http404('')
if request.method == 'GET':
echo_str = request.GET['echostr']
if echo_str != None:
return HttpResponse(echo_str)
else:
return Http404('')
elif request.method == 'POST':
reply_str = reply(request.read())
return HttpResponse(reply_str)
return Http404('')
def validate(signature, timestamp, nonce, token):
if signature == None or timestamp == None or nonce == None or token == None:
return False
seq = sorted([token, timestamp, nonce])
logger.debug(seq)
tmp_str = ''.join(seq)
encode_str = hashlib.sha1(tmp_str).hexdigest()
logger.debug(encode_str)
if signature == encode_str:
return True
else:
return False
PHP 我没有验证过的代码。从 $GLOBALS["HTTP_RAW_POST_DATA"].
获取数据public function responseMsg()
{
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr)){
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$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>0</FuncFlag>
</xml>";
if($keyword == "?" || $keyword == "?")
{
$msgType = "text";
$contentStr = date("Y-m-d H:i:s",time());
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}
}else{
echo "";
exit;
}
}