<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>抓包 on 猫猫鱼的小窝</title>
    <link>https://cat.fjh1997.top/tags/%E6%8A%93%E5%8C%85/</link>
    <description>Recent content from 猫猫鱼的小窝</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    
    <managingEditor>xxx@example.com (catcatyu)</managingEditor>
    <webMaster>xxx@example.com (catcatyu)</webMaster>
    
    <copyright>本博客所有文章除特别声明外，均采用 BY-NC-SA 许可协议。转载请注明出处！</copyright>
    
    <lastBuildDate>Tue, 14 Jul 2026 12:30:00 +0800</lastBuildDate>
    
    
    <atom:link href="https://cat.fjh1997.top/tags/%E6%8A%93%E5%8C%85/atom.xml" rel="self" type="application/rss&#43;xml" />
    

    
    

    <item>
      <title>浙江移动宽带「一站式订单」详情白屏：订单号多加密了一层</title>
      <link>https://cat.fjh1997.top/posts/2026071301.html</link>
      <pubDate>Mon, 13 Jul 2026 22:40:00 &#43;0800</pubDate>
      <author>xxx@example.com (catcatyu)</author>
      <guid>https://cat.fjh1997.top/posts/2026071301.html</guid>
      <description>
        <![CDATA[<h1>浙江移动宽带「一站式订单」详情白屏：订单号多加密了一层</h1><p>作者：catcatyu（xxx@example.com）</p>
        
          <p>PC / 手机打开浙江移动宽带「查看进度」进入一站式订单详情时整页白屏。列表有单，问题在详情接口字段形态。</p>
<p><strong>代码</strong>：<a href="https://github.com/fjh1997/wx-zjmcrm-whitescreen-fix" target="_blank" rel="noopener noreferrer">https://github.com/fjh1997/wx-zjmcrm-whitescreen-fix</a>
</p>
<p><strong>修复前：</strong> 一站式订单详情白屏，无进度内容。</p>
<p><img
  src="/images/698b423a573848effaa4044be371f986.png"
  alt="修复前：一站式订单详情白屏" width="426" height="784"
  loading="lazy"
  decoding="async"
/>
</p>
<p><strong>修复后：</strong> 进度时间线正常展示（本例订单状态为已取消）。</p>
<p><img
  src="/images/8770db89f2a5a9346ff7fe0379e29973.png"
  alt="修复后：订单进度正常展示" width="421" height="751"
  loading="lazy"
  decoding="async"
/>
</p>
<h2 id="原因">
<a class="header-anchor" href="#%e5%8e%9f%e5%9b%a0"></a>
原因
</h2><p>详情页 <code>showOrder</code> 提交的是 <strong>AES 加密后的订单号</strong>（约 32 位 Hex），而网关对 <code>customerOrderId</code> 按 <strong>原始字符串长度 ≤ 14</strong> 校验。</p>
<table>
  <thead>
      <tr>
          <th>请求体</th>
          <th>结果</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>32 位密文</td>
          <td><code>retCode: -9999</code>，<code>maximum length of 14</code>，无进度数据</td>
      </tr>
      <tr>
          <td><strong>14 位明文订单号</strong></td>
          <td><code>retCode: 200</code>，返回 <code>order</code> 进度节点</td>
      </tr>
  </tbody>
</table>
<p>没有 <code>order</code> 时，前端仍按成功去渲染 → 空页面 / 白屏。</p>
<pre class="mermaid">
  flowchart LR
  A[订单号 14 位明文] --> B[aesEncrypt]
  B --> C[32 位 Hex 提交]
  C --> D[网关 length > 14]
  D --> E[-9999 无 order]
  E --> F[白屏]
  A --> G[直接提交明文]
  G --> H[200 + order]
  H --> I[正常显示]
</pre><h2 id="原理">
<a class="header-anchor" href="#%e5%8e%9f%e7%90%86"></a>
原理
</h2><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">列表「查看进度」
</span></span><span class="line"><span class="cl">  → 详情 H5 oneStationUser.js
</span></span><span class="line"><span class="cl">  → param.customerOrderId = aesEncrypt(订单号)   // 多加密了一层
</span></span><span class="line"><span class="cl">  → POST .../service?action=QRY_RBOSS_MOBILE_DETAIL
</span></span><span class="line"><span class="cl">  → 网关校验字段长度 ≤ 14（按请求体字符串量，不是解密后再量）
</span></span><span class="line"><span class="cl">  → 失败则无进度节点可画 → 白屏
</span></span></code></pre></td></tr></table>
</div>
</div><p>前端问题写法 vs 正确写法：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="cl"><span class="c1">// 问题：加密后 32 字符，网关直接拒
</span></span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">param</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;preOrderId&#34;</span><span class="o">:</span> <span class="nx">aesEncrypt</span><span class="p">(</span><span class="nx">PRE_ORDER_ID</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;regionId&#34;</span><span class="o">:</span> <span class="nx">REGION_ID</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;customerOrderId&#34;</span><span class="o">:</span> <span class="nx">aesEncrypt</span><span class="p">(</span><span class="nx">CUST_ORDER_ID</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 正确：提交 ≤14 位数字明文（URL 侧若已解密完成）
</span></span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="nx">param</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;preOrderId&#34;</span><span class="o">:</span> <span class="s2">&#34;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;regionId&#34;</span><span class="o">:</span> <span class="nx">REGION_ID</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;customerOrderId&#34;</span><span class="o">:</span> <span class="nx">CUST_ORDER_ID</span>  <span class="c1">// 例如 &#34;5790xxxxxxxxxx&#34;
</span></span></span><span class="line"><span class="cl"><span class="p">};</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>成功请求体（脱敏）：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;preOrderId&#34;</span><span class="p">:</span> <span class="s2">&#34;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;regionId&#34;</span><span class="p">:</span> <span class="s2">&#34;579&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;customerOrderId&#34;</span><span class="p">:</span> <span class="s2">&#34;5790xxxxxxxxxx&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="修复">
<a class="header-anchor" href="#%e4%bf%ae%e5%a4%8d"></a>
修复
</h2><p><strong>只做一件事：让详情接口收到 ≤14 位明文订单号。</strong></p>
<h3 id="1-能改前端">
<a class="header-anchor" href="#1-%e8%83%bd%e6%94%b9%e5%89%8d%e7%ab%af"></a>
1. 能改前端
</h3><p>去掉 <code>showOrder</code> 里对订单号的 <code>aesEncrypt</code>，并保证 <code>customerOrderId</code> 为 10～14 位数字。</p>
<h3 id="2-不能改源码mitm">
<a class="header-anchor" href="#2-%e4%b8%8d%e8%83%bd%e6%94%b9%e6%ba%90%e7%a0%81mitm"></a>
2. 不能改源码（mitm）
</h3><p>用仓库中的 <code>minimal_fix.py</code>：</p>
<ol>
<li><strong>请求改写</strong>：命中 <code>QRY_RBOSS_MOBILE_DETAIL</code> 时，把 body 改成明文 14 位（按 <strong>action 路径</strong> 命中，不依赖域名；Host 显示为 IP 时也能改）；</li>
<li><strong>JS 热补</strong>：<code>oneStationUser.js</code> 组参不再 <code>aesEncrypt</code>，并带上 <code>retCode</code> 判断。</li>
</ol>
<p>核心请求改写：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="n">flow</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="s2">&#34;QRY_RBOSS_MOBILE_DETAIL&#34;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="n">flow</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">pretty_url</span> <span class="ow">or</span> <span class="s2">&#34;&#34;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span>
</span></span><span class="line"><span class="cl">    <span class="n">body</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">flow</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">get_text</span><span class="p">(</span><span class="n">strict</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span> <span class="ow">or</span> <span class="s2">&#34;</span><span class="si">{}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># 密文则 AES 解回数字；解不出则用配置的 14 位订单号</span>
</span></span><span class="line"><span class="cl">    <span class="n">cust</span> <span class="o">=</span> <span class="n">to_plain_order</span><span class="p">(</span><span class="n">body</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&#34;customerOrderId&#34;</span><span class="p">)</span> <span class="ow">or</span> <span class="s2">&#34;&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">new</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;preOrderId&#34;</span><span class="p">:</span> <span class="s2">&#34;&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;regionId&#34;</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="n">body</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&#34;regionId&#34;</span><span class="p">)</span> <span class="ow">or</span> <span class="s2">&#34;579&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;customerOrderId&#34;</span><span class="p">:</span> <span class="n">cust</span><span class="p">,</span>  <span class="c1"># 必须是 ≤14 位数字</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="n">text</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">new</span><span class="p">,</span> <span class="n">ensure_ascii</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">separators</span><span class="o">=</span><span class="p">(</span><span class="s2">&#34;,&#34;</span><span class="p">,</span> <span class="s2">&#34;:&#34;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">    <span class="n">flow</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">set_text</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>核心 JS 热补（概念）：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># 把 aesEncrypt(PRE/CUST) 换成明文组参</span>
</span></span><span class="line"><span class="cl"><span class="c1"># &#34;customerOrderId&#34;: aesEncrypt(CUST_ORDER_ID)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#   → &#34;customerOrderId&#34;: &#34;5790xxxxxxxxxx&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="操作步骤按这个顺序">
<a class="header-anchor" href="#%e6%93%8d%e4%bd%9c%e6%ad%a5%e9%aa%a4%e6%8c%89%e8%bf%99%e4%b8%aa%e9%a1%ba%e5%ba%8f"></a>
操作步骤（按这个顺序）
</h4><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="n">git</span> <span class="n">clone</span> <span class="n">https</span><span class="err">:</span><span class="p">//</span><span class="n">github</span><span class="p">.</span><span class="n">com</span><span class="p">/</span><span class="n">fjh1997</span><span class="p">/</span><span class="nb">wx-zjmcrm</span><span class="n">-whitescreen-fix</span><span class="p">.</span><span class="py">git</span>
</span></span><span class="line"><span class="cl"><span class="nb">cd wx-zjmcrm</span><span class="n">-whitescreen-fix</span>
</span></span><span class="line"><span class="cl"><span class="n">pip</span> <span class="n">install</span> <span class="n">mitmproxy</span> <span class="n">pycryptodome</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># 1) 设订单号兜底（强烈建议；AES 解不出时靠它）</span>
</span></span><span class="line"><span class="cl"><span class="nv">$env:ZJ_ORDER_ID</span><span class="p">=</span><span class="s2">&#34;你的14位订单号&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c"># 可选：$env:ZJ_AES_KEY=&#34;从 GET_STATIC_DATA 拿到的密钥&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># 2) 启动 mitm（推荐仓库脚本，保证 env 传入子进程）</span>
</span></span><span class="line"><span class="cl"><span class="p">.\</span><span class="n">start_minimal</span><span class="p">.</span><span class="py">ps1</span>
</span></span><span class="line"><span class="cl"><span class="c"># 等价手动：cmd /c &#34;set ZJ_ORDER_ID=你的14位订单号&amp;&amp; mitmdump -p 8888 -s minimal_fix.py --ssl-insecure --set block_global=false&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># 3) ProxyBridge 必须以【管理员】运行</span>
</span></span><span class="line"><span class="cl"><span class="c">#    Weixin.exe / WeChatAppEx.exe → 127.0.0.1:8888</span>
</span></span><span class="line"><span class="cl"><span class="c">#    非管理员会立刻退出 = 等于没挂代理</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># 4) 完全退出微信 PC 端再打开 → 一站式订单 → 查看进度</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="验收必看">
<a class="header-anchor" href="#%e9%aa%8c%e6%94%b6%e5%bf%85%e7%9c%8b"></a>
验收（必看）
</h4><p>打开仓库目录下的 <code>minimal_fix.log</code>：</p>
<table>
  <thead>
      <tr>
          <th>日志</th>
          <th>含义</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>DETAIL body -&gt; plain {...}</code></td>
          <td>改写已生效</td>
      </tr>
      <tr>
          <td><code>DETAIL resp retCode=200</code></td>
          <td>网关返回进度</td>
      </tr>
      <tr>
          <td><code>rewrote oneStationUser.js</code></td>
          <td>JS 热补命中</td>
      </tr>
      <tr>
          <td><strong>只有 <code>ready</code>，没有 DETAIL</strong></td>
          <td>流量没进 mitm：检查管理员 ProxyBridge、是否重启微信</td>
      </tr>
  </tbody>
</table>
<h4 id="常见翻车">
<a class="header-anchor" href="#%e5%b8%b8%e8%a7%81%e7%bf%bb%e8%bd%a6"></a>
常见翻车
</h4><table>
  <thead>
      <tr>
          <th>现象</th>
          <th>原因</th>
          <th>处理</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>一直白屏</td>
          <td>代理没挂上 / 未重启微信</td>
          <td>管理员 PB + 杀干净微信</td>
      </tr>
      <tr>
          <td><code>WARN: no plain order id</code></td>
          <td>未设 <code>ZJ_ORDER_ID</code> 且解不出密文</td>
          <td>设订单号后重启 mitmdump</td>
      </tr>
      <tr>
          <td>系统异常 /「请输入正确的 URL」</td>
          <td>乱改 Host/CONNECT 把其它站点指到 CRM</td>
          <td><strong>不要</strong>把 <code>218.205.68.*</code> 全改成 CRM 域名（如 <code>wap.zj.10086.cn</code> 会被搞挂）</td>
      </tr>
      <tr>
          <td>证书报错</td>
          <td>未信任 mitm CA</td>
          <td>安装 mitmproxy CA 到受信任根证书</td>
      </tr>
  </tbody>
</table>
<h2 id="小结">
<a class="header-anchor" href="#%e5%b0%8f%e7%bb%93"></a>
小结
</h2><table>
  <thead>
      <tr>
          <th></th>
          <th></th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>根因</strong></td>
          <td>详情订单号多做了 AES，字段超长被网关拒绝</td>
      </tr>
      <tr>
          <td><strong>修复</strong></td>
          <td>提交明文 14 位订单号</td>
      </tr>
      <tr>
          <td><strong>落地</strong></td>
          <td>管理员进程代理 + mitm 改 body；以 <code>minimal_fix.log</code> 的 <code>DETAIL body -&gt; plain</code> 为成功标志</td>
      </tr>
      <tr>
          <td><strong>仓库</strong></td>
          <td><a href="https://github.com/fjh1997/wx-zjmcrm-whitescreen-fix" target="_blank" rel="noopener noreferrer">wx-zjmcrm-whitescreen-fix</a>
</td>
      </tr>
  </tbody>
</table>
<p>仅供自有账号排障与学习，请勿用于未授权访问。</p>
        
        <hr><p>本文2026-07-13首发于<a href='https://cat.fjh1997.top/'>猫猫鱼的小窝</a>，最后修改于2026-07-14</p>]]>
      </description>
      
        <category>运维排错</category>
      
    </item>
    
  </channel>
</rss>
