XML データは生の HTTP 要求本文で送信されます。
バイト文字列としての未加工の HTTP 要求本文。これは、バイナリ イメージ、XML ペイロードなど、従来の HTML フォームとは異なる方法でデータを処理する場合に役立ちます。
これは、Wechat から Django サーバーに送信された要求です。
GET:<QueryDict: {u'nonce': [u'886****76'], u'timestamp': [u'1440041636'], u'signature': [u'29cb245a0f9399*******33956c3e96c500c56']}>,
POST:<QueryDict: {}>,
request.POST は空です。つまり、従来のフォーム データではありません。
これは、Django で Wechat からの 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"] から 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;
}
}