新手问题 微信 echostr 验证

red_goal · 2015年01月28日 · 最后由 ruby_sky 回复于 2015年01月28日 · 8602 次阅读

正在做微信企业帐户,设置回调地址的时候需要将 echostr 解密后将明文正确返回才能开启主动回调模式 看了微信的官方文档http://qydev.weixin.qq.com/wiki/index.php?title=%E5%8A%A0%E8%A7%A3%E5%AF%86%E6%96%B9%E6%A1%88%E7%9A%84%E8%AF%A6%E7%BB%86%E8%AF%B4%E6%98%8E

后面尝试使用 weixin_rails_middleware,直接使用 WeixinRailsMiddleware::Prpcrypt.decrypt(aes,text,corpid) 返回类似 ["\a3\xF8Y\x87\xC7\x95\xE5\xA5\xD5\xD6\xF5N\x17VMf\x92\xFFy\b\xC33\xF3\xC4:\xAF\xFE\xB0\xFBh\x95\x88\vS\xD82\x97\xE7;.\x05\xDE\x95", 401] 。 401 是输入的 corid 和解密出来的 corpid 不匹配;前面部分应该就是 echostr 的解密明文吧?

直接将"\a3\xF8Y\x87\xC7\x95\xE5\xA5\xD5\xD6\xF5N\x17VMf\x92\xFFy\b\xC33\xF3\xC4:\xAF\xFE\xB0\xFBh\x95\x88\vS\xD82\x97\xE7;.\x05\xDE\x95"返回给微信,总是验证不通过;

想问下这个怎么得到正确的 echostr 明文? @ruby_sky

如果是企业微信开发,你应该参考 https://github.com/lanrion/qy_wechat 这个 gem 的实现。

除了引用:PKCS7Encoder,Prpcrypt 依赖库外,还有以下参考代码:


# 验证URL有效性
def verify_url
  if not valid_msg_signature(params)
    render text: "", status: 401
    return
  end
  content, status = Prpcrypt.decrypt(aes_key, params[:echostr], corp_id)
  render text: content, status: status
end

private
  def encoding_aes_key
    key = @qy_app.encoding_aes_key
    raise "长度固定为43个字符" if key.length != 43
    key
  end

  def qy_token
    @qy_app.qy_token
  end

  def aes_key
    Base64.decode64(@qy_app.encoding_aes_key + "=")
  end

  def corp_id
    @qy_app.corp_id
  end

  def valid_msg_signature(params)
    timestamp         = params[:timestamp]
    nonce             = params[:nonce]
    echo_str          = params[:echostr]
    msg_signature     = params[:msg_signature]
    sort_params       = [qy_token, timestamp, nonce, echo_str].sort.join
    current_signature = Digest::SHA1.hexdigest(sort_params)
    current_signature == msg_signature
  end

需要 登录 后方可回复, 如果你还没有账号请 注册新账号