Wechat API получения сообщений не отправляет XML?

Я не уверен, является ли это проблемой со стороны Wechat или они изменили свой API. У нас есть конечная точка, которая правильно отвечает на проверку конечной точки WeChat (повторяет echostr), и мы также получаем сообщения POST всякий раз, когда получаем новое сообщение.

Проблема в том, что сообщение POST, которое мы получаем, когда наша учетная запись получает сообщение, не содержит XML-содержимого. Он отправляет все остальное (подпись, одноразовый номер и т. д.), но не XML-сообщение.

Мы сделали что-то не так? Изменился ли API? Разве мы не пожимаем им руки должным образом?


person ays0110    schedule 19.08.2015    source источник


Ответы (1)


XML-данные отправляются в необработанном теле запроса HTTP.

Необработанное тело HTTP-запроса в виде строки байтов. Это полезно для обработки данных способами, отличными от обычных форм HTML: двоичные изображения, полезная нагрузка XML и т. д.

Это запрос, отправленный из Wechat на мой сервер Django:

GET:<QueryDict: {u'nonce': [u'886****76'], u'timestamp': [u'1440041636'], u'signature': [u'29cb245a0f9399*******33956c3e96c500c56']}>, 
POST:<QueryDict: {}>,

request.POST пуст, что означает, что это не обычные данные формы.

Вот как я обрабатываю сообщение POST от Wechat на Django: используйте 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;
        }
    }
person Jiawei Dai    schedule 20.08.2015