2015-08-19 2 views
1

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

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

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

ответ

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: {}>, 

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

Вот как я обрабатываю сообщение POST от Wechat on 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-код, который я еще не подтвердил. Получите DATA из $ 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; 
     } 
    }