[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"knowledge-\u002Fapi\u002Fknowledge\u002Fteam-documents\u002F17":3,"knowledge-related-\u002Fknowledge\u002Fteam-documents\u002F17":1399,"knowledge-series-\u002Fknowledge\u002Fteam-documents\u002F17":1425},{"source":4,"connector":5,"page":6},"sqlite","better-sqlite3",{"path":7,"title":8,"description":9,"category":10,"tags":11,"date":17,"pinned":18,"draft":18,"body":19,"seo":1395,"stem":1396,"id":1397,"extension":1398},"\u002Fknowledge\u002Fteam-documents\u002F17","支付中转页面升级实践","本次需求是支付链路升级：在兼容原有支付能力的基础上，新增不同版本的支付方案（如原生微信支付、小程序拉起支付）。","团队文档",[12,13,14,15,16],"team","vue","mobile","payment","input","2022-10-15",false,{"type":20,"value":21,"toc":1385},"minimark",[22,25,29,32,35,45,48,51,54,62,80,83,90,92,95,100,107,433,444,641,644,657,659,663,673,1095,1097,1101,1108,1234,1237,1373,1375,1378,1381],[23,24,8],"h1",{"id":8},[26,27,28],"h2",{"id":28},"背景",[30,31,9],"p",{},[30,33,34],{},"升级动因主要有两点：",[36,37,38,42],"ul",{},[39,40,41],"li",{},"旧链路能力单一，面对不同支付场景时扩展性不足；",[39,43,44],{},"新商家小程序上线后，支付入口和参数形态更加多样，需要统一中转层承接。",[30,46,47],{},"另外，第三方支付链路涉及签名与加解密，复杂逻辑统一下沉后端实现，前端以接口返回结果为准，减少前端安全风险与维护成本。",[49,50],"hr",{},[26,52,53],{"id":53},"整体思路",[30,55,56,57,61],{},"构建一个统一的 ",[58,59,60],"code",{},"H5"," 支付中转页面，负责：",[36,63,64,67,74,77],{},[39,65,66],{},"统一接收并兼容不同来源的支付参数；",[39,68,69,70,73],{},"兼容扫码场景下的 ",[58,71,72],{},"query"," 解析差异；",[39,75,76],{},"按支付版本动态分流到不同支付方式；",[39,78,79],{},"在异常场景下提供兜底回退（默认原生微信支付）。",[30,81,82],{},"流程示意图：",[30,84,85],{},[86,87],"img",{"alt":88,"src":89},"效果","https:\u002F\u002Fcdn.wangxiaoze.cn\u002Fstatic\u002Fimages\u002F1ca7879d-14d3-4a1a-ad61-3b4632e7e6e4.png",[49,91],{},[26,93,94],{"id":94},"关键实现细节",[96,97,99],"h3",{"id":98},"_1-h5-页面拉起小程序","1) H5 页面拉起小程序",[30,101,102,103,106],{},"在微信 H5 中拉起小程序可使用开放标签 ",[58,104,105],{},"wx-open-launch-weapp","：",[108,109,114],"pre",{"className":110,"code":111,"language":112,"meta":113,"style":113},"language-html shiki shiki-themes material-theme-lighter github-light github-dark","\u003Cwx-open-launch-weapp\n  id=\"launch-btn\"\n  appid=\"wx12345678\"\n  path=\"pages\u002Fhome\u002Findex?user=123&action=abc\"\n>\n  \u003Cscript type=\"text\u002Fwxtag-template\">\n    \u003Cstyle>\n      .btn {\n        padding: 12px;\n      }\n    \u003C\u002Fstyle>\n    \u003Cbutton class=\"btn\">打开小程序\u003C\u002Fbutton>\n  \u003C\u002Fscript>\n\u003C\u002Fwx-open-launch-weapp>\n\u003Cscript>\n  const btn = document.getElementById(\"launch-btn\");\n  btn.addEventListener(\"launch\", () => console.log(\"success\"));\n  btn.addEventListener(\"error\", (e) => console.log(\"fail\", e.detail));\n\u003C\u002Fscript>\n","html","",[58,115,116,129,150,165,180,186,209,216,222,228,234,240,246,256,266,275,315,366,424],{"__ignoreMap":113},[117,118,121,125],"span",{"class":119,"line":120},"line",1,[117,122,124],{"class":123},"sP7_E","\u003C",[117,126,128],{"class":127},"sQzsp","wx-open-launch-weapp\n",[117,130,132,136,139,143,147],{"class":119,"line":131},2,[117,133,135],{"class":134},"s9AJx","  id",[117,137,138],{"class":123},"=",[117,140,142],{"class":141},"sjJ54","\"",[117,144,146],{"class":145},"s_sjI","launch-btn",[117,148,149],{"class":141},"\"\n",[117,151,153,156,158,160,163],{"class":119,"line":152},3,[117,154,155],{"class":134},"  appid",[117,157,138],{"class":123},[117,159,142],{"class":141},[117,161,162],{"class":145},"wx12345678",[117,164,149],{"class":141},[117,166,168,171,173,175,178],{"class":119,"line":167},4,[117,169,170],{"class":134},"  path",[117,172,138],{"class":123},[117,174,142],{"class":141},[117,176,177],{"class":145},"pages\u002Fhome\u002Findex?user=123&action=abc",[117,179,149],{"class":141},[117,181,183],{"class":119,"line":182},5,[117,184,185],{"class":123},">\n",[117,187,189,192,195,198,200,202,205,207],{"class":119,"line":188},6,[117,190,191],{"class":123},"  \u003C",[117,193,194],{"class":127},"script",[117,196,197],{"class":134}," type",[117,199,138],{"class":123},[117,201,142],{"class":141},[117,203,204],{"class":145},"text\u002Fwxtag-template",[117,206,142],{"class":141},[117,208,185],{"class":123},[117,210,212],{"class":119,"line":211},7,[117,213,215],{"class":214},"su5hD","    \u003Cstyle>\n",[117,217,219],{"class":119,"line":218},8,[117,220,221],{"class":214},"      .btn {\n",[117,223,225],{"class":119,"line":224},9,[117,226,227],{"class":214},"        padding: 12px;\n",[117,229,231],{"class":119,"line":230},10,[117,232,233],{"class":214},"      }\n",[117,235,237],{"class":119,"line":236},11,[117,238,239],{"class":214},"    \u003C\u002Fstyle>\n",[117,241,243],{"class":119,"line":242},12,[117,244,245],{"class":214},"    \u003Cbutton class=\"btn\">打开小程序\u003C\u002Fbutton>\n",[117,247,249,252,254],{"class":119,"line":248},13,[117,250,251],{"class":123},"  \u003C\u002F",[117,253,194],{"class":127},[117,255,185],{"class":123},[117,257,259,262,264],{"class":119,"line":258},14,[117,260,261],{"class":123},"\u003C\u002F",[117,263,105],{"class":127},[117,265,185],{"class":123},[117,267,269,271,273],{"class":119,"line":268},15,[117,270,124],{"class":123},[117,272,194],{"class":127},[117,274,185],{"class":123},[117,276,278,282,286,290,293,296,300,303,305,307,309,312],{"class":119,"line":277},16,[117,279,281],{"class":280},"sbsja","  const",[117,283,285],{"class":284},"s_hVV"," btn",[117,287,289],{"class":288},"smGrS"," =",[117,291,292],{"class":214}," document",[117,294,295],{"class":123},".",[117,297,299],{"class":298},"sGLFI","getElementById",[117,301,302],{"class":214},"(",[117,304,142],{"class":141},[117,306,146],{"class":145},[117,308,142],{"class":141},[117,310,311],{"class":214},")",[117,313,314],{"class":123},";\n",[117,316,318,321,323,326,328,330,333,335,338,341,344,347,349,352,354,356,359,361,364],{"class":119,"line":317},17,[117,319,320],{"class":214},"  btn",[117,322,295],{"class":123},[117,324,325],{"class":298},"addEventListener",[117,327,302],{"class":214},[117,329,142],{"class":141},[117,331,332],{"class":145},"launch",[117,334,142],{"class":141},[117,336,337],{"class":123},",",[117,339,340],{"class":123}," ()",[117,342,343],{"class":280}," =>",[117,345,346],{"class":214}," console",[117,348,295],{"class":123},[117,350,351],{"class":298},"log",[117,353,302],{"class":214},[117,355,142],{"class":141},[117,357,358],{"class":145},"success",[117,360,142],{"class":141},[117,362,363],{"class":214},"))",[117,365,314],{"class":123},[117,367,369,371,373,375,377,379,382,384,386,389,393,395,397,399,401,403,405,407,410,412,414,417,419,422],{"class":119,"line":368},18,[117,370,320],{"class":214},[117,372,295],{"class":123},[117,374,325],{"class":298},[117,376,302],{"class":214},[117,378,142],{"class":141},[117,380,381],{"class":145},"error",[117,383,142],{"class":141},[117,385,337],{"class":123},[117,387,388],{"class":123}," (",[117,390,392],{"class":391},"s99_P","e",[117,394,311],{"class":123},[117,396,343],{"class":280},[117,398,346],{"class":214},[117,400,295],{"class":123},[117,402,351],{"class":298},[117,404,302],{"class":214},[117,406,142],{"class":141},[117,408,409],{"class":145},"fail",[117,411,142],{"class":141},[117,413,337],{"class":123},[117,415,416],{"class":214}," e",[117,418,295],{"class":123},[117,420,421],{"class":214},"detail))",[117,423,314],{"class":123},[117,425,427,429,431],{"class":119,"line":426},19,[117,428,261],{"class":123},[117,430,194],{"class":127},[117,432,185],{"class":123},[30,434,435,439,440,443],{},[436,437,438],"strong",{},"接入前提","：开放标签可用前，必须先完成 ",[58,441,442],{},"wx.config"," 校验：",[108,445,449],{"className":446,"code":447,"language":448,"meta":113,"style":113},"language-javascript shiki shiki-themes material-theme-lighter github-light github-dark","wx.config({\n  debug: true,\n  appId: \"\",\n  timestamp: 0,\n  nonceStr: \"\",\n  signature: \"\",\n  jsApiList: [],\n  openTagList: [], \u002F\u002F 例如 [\"wx-open-launch-weapp\"]\n});\n\nwx.ready(function () {\n  \u002F\u002F config 校验成功后，开放标签能力才可用\n});\n\nwx.error(function (res) {\n  \u002F\u002F 签名过期或参数错误时可在此上报并重拉签名\n});\n","javascript",[58,450,451,466,482,494,507,518,529,541,556,565,571,590,595,603,607,628,633],{"__ignoreMap":113},[117,452,453,456,458,461,463],{"class":119,"line":120},[117,454,455],{"class":214},"wx",[117,457,295],{"class":123},[117,459,460],{"class":298},"config",[117,462,302],{"class":214},[117,464,465],{"class":123},"{\n",[117,467,468,472,475,479],{"class":119,"line":131},[117,469,471],{"class":470},"skxfh","  debug",[117,473,474],{"class":123},":",[117,476,478],{"class":477},"syTEX"," true",[117,480,481],{"class":123},",\n",[117,483,484,487,489,492],{"class":119,"line":152},[117,485,486],{"class":470},"  appId",[117,488,474],{"class":123},[117,490,491],{"class":141}," \"\"",[117,493,481],{"class":123},[117,495,496,499,501,505],{"class":119,"line":167},[117,497,498],{"class":470},"  timestamp",[117,500,474],{"class":123},[117,502,504],{"class":503},"srdBf"," 0",[117,506,481],{"class":123},[117,508,509,512,514,516],{"class":119,"line":182},[117,510,511],{"class":470},"  nonceStr",[117,513,474],{"class":123},[117,515,491],{"class":141},[117,517,481],{"class":123},[117,519,520,523,525,527],{"class":119,"line":188},[117,521,522],{"class":470},"  signature",[117,524,474],{"class":123},[117,526,491],{"class":141},[117,528,481],{"class":123},[117,530,531,534,536,539],{"class":119,"line":211},[117,532,533],{"class":470},"  jsApiList",[117,535,474],{"class":123},[117,537,538],{"class":214}," []",[117,540,481],{"class":123},[117,542,543,546,548,550,552],{"class":119,"line":218},[117,544,545],{"class":470},"  openTagList",[117,547,474],{"class":123},[117,549,538],{"class":214},[117,551,337],{"class":123},[117,553,555],{"class":554},"sutJx"," \u002F\u002F 例如 [\"wx-open-launch-weapp\"]\n",[117,557,558,561,563],{"class":119,"line":224},[117,559,560],{"class":123},"}",[117,562,311],{"class":214},[117,564,314],{"class":123},[117,566,567],{"class":119,"line":230},[117,568,570],{"emptyLinePlaceholder":569},true,"\n",[117,572,573,575,577,580,582,585,587],{"class":119,"line":236},[117,574,455],{"class":214},[117,576,295],{"class":123},[117,578,579],{"class":298},"ready",[117,581,302],{"class":214},[117,583,584],{"class":280},"function",[117,586,340],{"class":123},[117,588,589],{"class":123}," {\n",[117,591,592],{"class":119,"line":242},[117,593,594],{"class":554},"  \u002F\u002F config 校验成功后，开放标签能力才可用\n",[117,596,597,599,601],{"class":119,"line":248},[117,598,560],{"class":123},[117,600,311],{"class":214},[117,602,314],{"class":123},[117,604,605],{"class":119,"line":258},[117,606,570],{"emptyLinePlaceholder":569},[117,608,609,611,613,615,617,619,621,624,626],{"class":119,"line":268},[117,610,455],{"class":214},[117,612,295],{"class":123},[117,614,381],{"class":298},[117,616,302],{"class":214},[117,618,584],{"class":280},[117,620,388],{"class":123},[117,622,623],{"class":391},"res",[117,625,311],{"class":123},[117,627,589],{"class":123},[117,629,630],{"class":119,"line":277},[117,631,632],{"class":554},"  \u002F\u002F 签名过期或参数错误时可在此上报并重拉签名\n",[117,634,635,637,639],{"class":119,"line":317},[117,636,560],{"class":123},[117,638,311],{"class":214},[117,640,314],{"class":123},[30,642,643],{},"注意事项：",[36,645,646,652],{},[39,647,648,649,651],{},"只有 ",[58,650,460],{}," 成功后，开放标签才会正常渲染与点击；",[39,653,654,656],{},[58,655,204],{}," 内样式需写在模板内部，不可完全依赖页面外部样式。",[49,658],{},[96,660,662],{"id":661},"_2-支付参数兼容与解析","2) 支付参数兼容与解析",[30,664,665,666,668,669,672],{},"由于不同入口参数形态不统一（普通 ",[58,667,72],{}," 与拼接 ",[58,670,671],{},"param"," 并存），中转页需要先做解析归一：",[108,674,676],{"className":446,"code":675,"language":448,"meta":113,"style":113},"getUrlQuery() {\n  const { param = \"\" } = this.$route.query || {};\n  const hasParam = Object.keys(this.$route.query).includes(\"param\");\n  return hasParam ? handlerQueryParams(param) : this.$route.query;\n}\n\n\u002F\u002F 示例：\n\u002F\u002F http:\u002F\u002Fxxx.com\u002FpayPage?param=businessType:9;payId:1668909350495006721;totalAmt:100000\nexport function handlerQueryParams(url) {\n  const splitArr = url.split(\";\").filter((item) => item !== \"\");\n  const query = {};\n  splitArr.forEach((item) => {\n    const index = item.indexOf(\":\");\n    if (index !== -1) {\n      const key = item.substring(0, index);\n      const val = item.substring(index + 1);\n      query[key] = val;\n    }\n  });\n  return query;\n}\n",[58,677,678,688,726,775,810,815,819,824,829,848,904,915,937,966,988,1018,1047,1067,1072,1081,1090],{"__ignoreMap":113},[117,679,680,683,686],{"class":119,"line":120},[117,681,682],{"class":298},"getUrlQuery",[117,684,685],{"class":214},"() ",[117,687,465],{"class":123},[117,689,690,692,695,698,700,702,705,707,711,713,716,718,720,723],{"class":119,"line":131},[117,691,281],{"class":280},[117,693,694],{"class":123}," {",[117,696,697],{"class":284}," param",[117,699,289],{"class":288},[117,701,491],{"class":141},[117,703,704],{"class":123}," }",[117,706,289],{"class":288},[117,708,710],{"class":709},"s39Yj"," this",[117,712,295],{"class":123},[117,714,715],{"class":214},"$route",[117,717,295],{"class":123},[117,719,72],{"class":214},[117,721,722],{"class":288}," ||",[117,724,725],{"class":123}," {};\n",[117,727,728,730,733,735,738,740,743,745,748,750,752,754,756,758,760,763,765,767,769,771,773],{"class":119,"line":152},[117,729,281],{"class":280},[117,731,732],{"class":284}," hasParam",[117,734,289],{"class":288},[117,736,737],{"class":214}," Object",[117,739,295],{"class":123},[117,741,742],{"class":298},"keys",[117,744,302],{"class":470},[117,746,747],{"class":709},"this",[117,749,295],{"class":123},[117,751,715],{"class":214},[117,753,295],{"class":123},[117,755,72],{"class":214},[117,757,311],{"class":470},[117,759,295],{"class":123},[117,761,762],{"class":298},"includes",[117,764,302],{"class":470},[117,766,142],{"class":141},[117,768,671],{"class":145},[117,770,142],{"class":141},[117,772,311],{"class":470},[117,774,314],{"class":123},[117,776,777,781,783,786,789,791,793,796,798,800,802,804,806,808],{"class":119,"line":167},[117,778,780],{"class":779},"sVHd0","  return",[117,782,732],{"class":214},[117,784,785],{"class":288}," ?",[117,787,788],{"class":298}," handlerQueryParams",[117,790,302],{"class":470},[117,792,671],{"class":214},[117,794,795],{"class":470},") ",[117,797,474],{"class":288},[117,799,710],{"class":709},[117,801,295],{"class":123},[117,803,715],{"class":214},[117,805,295],{"class":123},[117,807,72],{"class":214},[117,809,314],{"class":123},[117,811,812],{"class":119,"line":182},[117,813,814],{"class":123},"}\n",[117,816,817],{"class":119,"line":188},[117,818,570],{"emptyLinePlaceholder":569},[117,820,821],{"class":119,"line":211},[117,822,823],{"class":554},"\u002F\u002F 示例：\n",[117,825,826],{"class":119,"line":218},[117,827,828],{"class":554},"\u002F\u002F http:\u002F\u002Fxxx.com\u002FpayPage?param=businessType:9;payId:1668909350495006721;totalAmt:100000\n",[117,830,831,834,837,839,841,844,846],{"class":119,"line":224},[117,832,833],{"class":779},"export",[117,835,836],{"class":280}," function",[117,838,788],{"class":298},[117,840,302],{"class":123},[117,842,843],{"class":391},"url",[117,845,311],{"class":123},[117,847,589],{"class":123},[117,849,850,852,855,857,860,862,865,867,869,872,874,876,878,881,883,885,888,890,892,895,898,900,902],{"class":119,"line":230},[117,851,281],{"class":280},[117,853,854],{"class":284}," splitArr",[117,856,289],{"class":288},[117,858,859],{"class":214}," url",[117,861,295],{"class":123},[117,863,864],{"class":298},"split",[117,866,302],{"class":470},[117,868,142],{"class":141},[117,870,871],{"class":145},";",[117,873,142],{"class":141},[117,875,311],{"class":470},[117,877,295],{"class":123},[117,879,880],{"class":298},"filter",[117,882,302],{"class":470},[117,884,302],{"class":123},[117,886,887],{"class":391},"item",[117,889,311],{"class":123},[117,891,343],{"class":280},[117,893,894],{"class":214}," item",[117,896,897],{"class":288}," !==",[117,899,491],{"class":141},[117,901,311],{"class":470},[117,903,314],{"class":123},[117,905,906,908,911,913],{"class":119,"line":236},[117,907,281],{"class":280},[117,909,910],{"class":284}," query",[117,912,289],{"class":288},[117,914,725],{"class":123},[117,916,917,920,922,925,927,929,931,933,935],{"class":119,"line":242},[117,918,919],{"class":214},"  splitArr",[117,921,295],{"class":123},[117,923,924],{"class":298},"forEach",[117,926,302],{"class":470},[117,928,302],{"class":123},[117,930,887],{"class":391},[117,932,311],{"class":123},[117,934,343],{"class":280},[117,936,589],{"class":123},[117,938,939,942,945,947,949,951,954,956,958,960,962,964],{"class":119,"line":248},[117,940,941],{"class":280},"    const",[117,943,944],{"class":284}," index",[117,946,289],{"class":288},[117,948,894],{"class":214},[117,950,295],{"class":123},[117,952,953],{"class":298},"indexOf",[117,955,302],{"class":470},[117,957,142],{"class":141},[117,959,474],{"class":145},[117,961,142],{"class":141},[117,963,311],{"class":470},[117,965,314],{"class":123},[117,967,968,971,973,976,978,981,984,986],{"class":119,"line":258},[117,969,970],{"class":779},"    if",[117,972,388],{"class":470},[117,974,975],{"class":214},"index",[117,977,897],{"class":288},[117,979,980],{"class":288}," -",[117,982,983],{"class":503},"1",[117,985,795],{"class":470},[117,987,465],{"class":123},[117,989,990,993,996,998,1000,1002,1005,1007,1010,1012,1014,1016],{"class":119,"line":268},[117,991,992],{"class":280},"      const",[117,994,995],{"class":284}," key",[117,997,289],{"class":288},[117,999,894],{"class":214},[117,1001,295],{"class":123},[117,1003,1004],{"class":298},"substring",[117,1006,302],{"class":470},[117,1008,1009],{"class":503},"0",[117,1011,337],{"class":123},[117,1013,944],{"class":214},[117,1015,311],{"class":470},[117,1017,314],{"class":123},[117,1019,1020,1022,1025,1027,1029,1031,1033,1035,1037,1040,1043,1045],{"class":119,"line":277},[117,1021,992],{"class":280},[117,1023,1024],{"class":284}," val",[117,1026,289],{"class":288},[117,1028,894],{"class":214},[117,1030,295],{"class":123},[117,1032,1004],{"class":298},[117,1034,302],{"class":470},[117,1036,975],{"class":214},[117,1038,1039],{"class":288}," +",[117,1041,1042],{"class":503}," 1",[117,1044,311],{"class":470},[117,1046,314],{"class":123},[117,1048,1049,1052,1055,1058,1061,1063,1065],{"class":119,"line":317},[117,1050,1051],{"class":214},"      query",[117,1053,1054],{"class":470},"[",[117,1056,1057],{"class":214},"key",[117,1059,1060],{"class":470},"] ",[117,1062,138],{"class":288},[117,1064,1024],{"class":214},[117,1066,314],{"class":123},[117,1068,1069],{"class":119,"line":368},[117,1070,1071],{"class":123},"    }\n",[117,1073,1074,1077,1079],{"class":119,"line":426},[117,1075,1076],{"class":123},"  }",[117,1078,311],{"class":470},[117,1080,314],{"class":123},[117,1082,1084,1086,1088],{"class":119,"line":1083},20,[117,1085,780],{"class":779},[117,1087,910],{"class":214},[117,1089,314],{"class":123},[117,1091,1093],{"class":119,"line":1092},21,[117,1094,814],{"class":123},[49,1096],{},[96,1098,1100],{"id":1099},"_3-多版本支付分流","3) 多版本支付分流",[30,1102,1103,1104,1107],{},"根据后端返回版本号（如 ",[58,1105,1106],{},"V1\u002FV2\u002FV3","）决定支付方式：",[108,1109,1111],{"className":446,"code":1110,"language":448,"meta":113,"style":113},"\u002F\u002F 需要跳转小程序支付\nisPayWeapp() {\n  return [\"V2\", \"V3\"].includes(this.version);\n},\n\n\u002F\u002F 需要原生微信支付\n\u002F\u002F 接口异常或未知版本时建议兜底到原生支付\nisPayWx() {\n  return [\"V1\"].includes(this.version);\n}\n",[58,1112,1113,1118,1127,1171,1176,1180,1185,1190,1199,1230],{"__ignoreMap":113},[117,1114,1115],{"class":119,"line":120},[117,1116,1117],{"class":554},"\u002F\u002F 需要跳转小程序支付\n",[117,1119,1120,1123,1125],{"class":119,"line":131},[117,1121,1122],{"class":298},"isPayWeapp",[117,1124,685],{"class":214},[117,1126,465],{"class":123},[117,1128,1129,1131,1134,1136,1139,1141,1143,1146,1149,1151,1154,1156,1158,1160,1162,1164,1167,1169],{"class":119,"line":152},[117,1130,780],{"class":779},[117,1132,1133],{"class":470}," [",[117,1135,142],{"class":141},[117,1137,1138],{"class":145},"V2",[117,1140,142],{"class":141},[117,1142,337],{"class":123},[117,1144,1145],{"class":141}," \"",[117,1147,1148],{"class":145},"V3",[117,1150,142],{"class":141},[117,1152,1153],{"class":470},"]",[117,1155,295],{"class":123},[117,1157,762],{"class":298},[117,1159,302],{"class":470},[117,1161,747],{"class":709},[117,1163,295],{"class":123},[117,1165,1166],{"class":214},"version",[117,1168,311],{"class":470},[117,1170,314],{"class":123},[117,1172,1173],{"class":119,"line":167},[117,1174,1175],{"class":123},"},\n",[117,1177,1178],{"class":119,"line":182},[117,1179,570],{"emptyLinePlaceholder":569},[117,1181,1182],{"class":119,"line":188},[117,1183,1184],{"class":554},"\u002F\u002F 需要原生微信支付\n",[117,1186,1187],{"class":119,"line":211},[117,1188,1189],{"class":554},"\u002F\u002F 接口异常或未知版本时建议兜底到原生支付\n",[117,1191,1192,1195,1197],{"class":119,"line":218},[117,1193,1194],{"class":298},"isPayWx",[117,1196,685],{"class":214},[117,1198,465],{"class":123},[117,1200,1201,1203,1205,1207,1210,1212,1214,1216,1218,1220,1222,1224,1226,1228],{"class":119,"line":224},[117,1202,780],{"class":779},[117,1204,1133],{"class":470},[117,1206,142],{"class":141},[117,1208,1209],{"class":145},"V1",[117,1211,142],{"class":141},[117,1213,1153],{"class":470},[117,1215,295],{"class":123},[117,1217,762],{"class":298},[117,1219,302],{"class":470},[117,1221,747],{"class":709},[117,1223,295],{"class":123},[117,1225,1166],{"class":214},[117,1227,311],{"class":470},[117,1229,314],{"class":123},[117,1231,1232],{"class":119,"line":230},[117,1233,814],{"class":123},[30,1235,1236],{},"原生微信支付示例：",[108,1238,1240],{"className":446,"code":1239,"language":448,"meta":113,"style":113},"wxJsBridge(\n  {\n    appId: wxJsBridgeJson.appId,\n    timeStamp: wxJsBridgeJson.timeStamp,\n    nonceStr: wxJsBridgeJson.nonceStr,\n    package: wxJsBridgeJson.package,\n    signType: wxJsBridgeJson.signType,\n    paySign: wxJsBridgeJson.sign,\n  },\n  () => {}\n);\n",[58,1241,1242,1250,1255,1272,1288,1304,1320,1336,1352,1357,1367],{"__ignoreMap":113},[117,1243,1244,1247],{"class":119,"line":120},[117,1245,1246],{"class":298},"wxJsBridge",[117,1248,1249],{"class":214},"(\n",[117,1251,1252],{"class":119,"line":131},[117,1253,1254],{"class":123},"  {\n",[117,1256,1257,1260,1262,1265,1267,1270],{"class":119,"line":152},[117,1258,1259],{"class":470},"    appId",[117,1261,474],{"class":123},[117,1263,1264],{"class":214}," wxJsBridgeJson",[117,1266,295],{"class":123},[117,1268,1269],{"class":214},"appId",[117,1271,481],{"class":123},[117,1273,1274,1277,1279,1281,1283,1286],{"class":119,"line":167},[117,1275,1276],{"class":470},"    timeStamp",[117,1278,474],{"class":123},[117,1280,1264],{"class":214},[117,1282,295],{"class":123},[117,1284,1285],{"class":214},"timeStamp",[117,1287,481],{"class":123},[117,1289,1290,1293,1295,1297,1299,1302],{"class":119,"line":182},[117,1291,1292],{"class":470},"    nonceStr",[117,1294,474],{"class":123},[117,1296,1264],{"class":214},[117,1298,295],{"class":123},[117,1300,1301],{"class":214},"nonceStr",[117,1303,481],{"class":123},[117,1305,1306,1309,1311,1313,1315,1318],{"class":119,"line":188},[117,1307,1308],{"class":470},"    package",[117,1310,474],{"class":123},[117,1312,1264],{"class":214},[117,1314,295],{"class":123},[117,1316,1317],{"class":214},"package",[117,1319,481],{"class":123},[117,1321,1322,1325,1327,1329,1331,1334],{"class":119,"line":211},[117,1323,1324],{"class":470},"    signType",[117,1326,474],{"class":123},[117,1328,1264],{"class":214},[117,1330,295],{"class":123},[117,1332,1333],{"class":214},"signType",[117,1335,481],{"class":123},[117,1337,1338,1341,1343,1345,1347,1350],{"class":119,"line":218},[117,1339,1340],{"class":470},"    paySign",[117,1342,474],{"class":123},[117,1344,1264],{"class":214},[117,1346,295],{"class":123},[117,1348,1349],{"class":214},"sign",[117,1351,481],{"class":123},[117,1353,1354],{"class":119,"line":224},[117,1355,1356],{"class":123},"  },\n",[117,1358,1359,1362,1364],{"class":119,"line":230},[117,1360,1361],{"class":123},"  ()",[117,1363,343],{"class":280},[117,1365,1366],{"class":123}," {}\n",[117,1368,1369,1371],{"class":119,"line":236},[117,1370,311],{"class":214},[117,1372,314],{"class":123},[49,1374],{},[26,1376,1377],{"id":1377},"结论",[30,1379,1380],{},"通过“统一中转页 + 参数归一 + 版本分流 + 后端加解密下沉”，可以在不破坏旧能力的前提下平滑引入新支付方案，并显著降低多入口支付链路的维护复杂度。",[1382,1383,1384],"style",{},"html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sQzsp, html code.shiki .sQzsp{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .s9AJx, html code.shiki .s9AJx{--shiki-light:#9C3EDA;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s99_P, html code.shiki .s99_P{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}",{"title":113,"searchDepth":131,"depth":131,"links":1386},[1387,1388,1389,1394],{"id":28,"depth":131,"text":28},{"id":53,"depth":131,"text":53},{"id":94,"depth":131,"text":94,"children":1390},[1391,1392,1393],{"id":98,"depth":152,"text":99},{"id":661,"depth":152,"text":662},{"id":1099,"depth":152,"text":1100},{"id":1377,"depth":131,"text":1377},{"title":8,"description":9},"knowledge\u002Fteam-documents\u002F17","knowledge\u002Fknowledge\u002Fteam-documents\u002F17.md","md",{"items":1400},[1401,1405,1409,1413,1417,1421],{"path":1402,"title":1403,"description":1404,"category":10,"score":268},"\u002Fknowledge\u002Fteam-documents\u002F03","键盘弹起导致底部被顶起问题（H5 适配）","在移动端 H5 页面中，当用户聚焦 input、textarea 等可编辑元素、软键盘弹出时，常见表现包括：",{"path":1406,"title":1407,"description":1408,"category":10,"score":242},"\u002Fknowledge\u002Fteam-documents\u002F18","中英文输入法下搜索触发冲突复盘","在“边输入边查询”场景中，很多实现会直接在 input 事件中请求接口。 但在中文输入法（IME）场景下，如果不处理输入合成过程，容易出现“未完成输入就提前触发查询”的问题。",{"path":1410,"title":1411,"description":1412,"category":10,"score":242},"\u002Fknowledge\u002Fteam-documents\u002F22","企业微信 uni-app H5：OAuth 回退白屏与列表缓存","第三方 BI 报表项目，企业微信内嵌 H5，uni-app 编译，history 模式。主页面 BiLink 同时承担静默授权和列表展示，上线后碰到两个问题：授权完清掉 URL 参数，iOS 侧滑返回还是白屏；列表加了缓存以后，刷新行…",{"path":1414,"title":1415,"description":1416,"category":10,"score":242},"\u002Fknowledge\u002Fteam-documents\u002F15","移动端返回事件触发两次问题复盘","App + H5 混合开发中，点击返回后直接跳出 H5 页面回到原生首页。复盘现象、复现路径、双触发的根因、两种修复方案及取舍建议，并给出回归检查清单。",{"path":1418,"title":1419,"description":1420,"category":10,"score":224},"\u002Fknowledge\u002Fteam-documents\u002F19","GridView 宫格加载渲染优化","系统首页 GridView 宫格模块接口耗时不高，但首次进入总耗时接近 22s。复盘耗时分层定位过程、代码层面的瓶颈（约 2000 行、100 个 tab 重复节点）、优化手段与最终指标对比。",{"path":1422,"title":1423,"description":1424,"category":10,"score":224},"\u002Fknowledge\u002Fteam-documents\u002F06","企业微信与小程序工单问题","企微师傅端与商家小程序端长期共用一套代码，页面与组件嵌套边界不清晰、引入规范缺失、公共代码与端侧代码耦合度高，导致维护成本持续上升。本文给出拆分为两套独立项目的架构建议，并说明边界划分、迁移注意事项与性能优化方向。",{"series":1426,"title":1427,"items":1428,"index":277,"prev":1502,"next":1503},"team-documents","team documents",[1429,1433,1437,1439,1443,1447,1449,1453,1457,1461,1465,1469,1473,1477,1481,1483,1487,1488,1490,1492,1496,1500],{"path":1430,"title":1431,"date":1432,"pinned":18},"\u002Fknowledge\u002Fteam-documents\u002F01","执行价格弹窗：表头 \u002F 表体合并与可配置表格","2024-07-27",{"path":1434,"title":1435,"date":1436,"pinned":18},"\u002Fknowledge\u002Fteam-documents\u002F02","防篡改水印","2024-01-09",{"path":1402,"title":1403,"date":1438,"pinned":18},"2024-09-17",{"path":1440,"title":1441,"date":1442,"pinned":18},"\u002Fknowledge\u002Fteam-documents\u002F04","老系统升级与兼容改造实践","2024-12-12",{"path":1444,"title":1445,"date":1446,"pinned":18},"\u002Fknowledge\u002Fteam-documents\u002F05","内部插件 \u002F 工具库开发实践","2021-08-19",{"path":1422,"title":1423,"date":1448,"pinned":18},"2025-10-01",{"path":1450,"title":1451,"date":1452,"pinned":18},"\u002Fknowledge\u002Fteam-documents\u002F07","企业微信群工具打开缓慢原因分析","2020-04-12",{"path":1454,"title":1455,"date":1456,"pinned":18},"\u002Fknowledge\u002Fteam-documents\u002F08","属性排序需求","2024-06-16",{"path":1458,"title":1459,"date":1460,"pinned":18},"\u002Fknowledge\u002Fteam-documents\u002F09","同业主重复单提醒规则","2020-06-07",{"path":1462,"title":1463,"date":1464,"pinned":18},"\u002Fknowledge\u002Fteam-documents\u002F10","图片上传前的自定义水印实践","2021-06-10",{"path":1466,"title":1467,"date":1468,"pinned":18},"\u002Fknowledge\u002Fteam-documents\u002F11","系统下单（重复单提示框）异常复盘","2023-11-21",{"path":1470,"title":1471,"date":1472,"pinned":18},"\u002Fknowledge\u002Fteam-documents\u002F12","系统自动更新说明","2025-05-26",{"path":1474,"title":1475,"date":1476,"pinned":18},"\u002Fknowledge\u002Fteam-documents\u002F13","新商家系统性能优化实践","2025-04-08",{"path":1478,"title":1479,"date":1480,"pinned":18},"\u002Fknowledge\u002Fteam-documents\u002F14","选项卡切换与 Loading 状态封装","2019-11-03",{"path":1414,"title":1415,"date":1482,"pinned":18},"2021-03-09",{"path":1484,"title":1485,"date":1486,"pinned":18},"\u002Fknowledge\u002Fteam-documents\u002F16","在线协作表格接入实践","2023-10-27",{"path":7,"title":8,"date":17,"pinned":18},{"path":1406,"title":1407,"date":1489,"pinned":18},"2024-09-01",{"path":1418,"title":1419,"date":1491,"pinned":18},"2026-03-17",{"path":1493,"title":1494,"date":1495,"pinned":18},"\u002Fknowledge\u002Fteam-documents\u002F20","H5 GPS 定位问题说明","2023-08-31",{"path":1497,"title":1498,"date":1499,"pinned":18},"\u002Fknowledge\u002Fteam-documents\u002F21","vxe-table 行 Hover 联动高亮","2024-08-31",{"path":1410,"title":1411,"date":1501,"pinned":18},"2023-08-17",{"path":1484,"title":1485,"date":1486,"pinned":18},{"path":1406,"title":1407,"date":1489,"pinned":18}]