接上篇,本文繼續深入微信公眾號開發實戰中的核心坑點:XML 菜單事件處理、網頁授權雙模式、JS-SDK 圖片上傳 iOS 遞歸兼容、H5 頁面返回刷新、微信內關閉窗口等,附生產級 C# 代碼(邏輯通用,PHP/Java 同理)。
微信推送 XML:ToUserName = 公眾號 ID,FromUserName = 用戶 OpenID。
回覆 XML 必須互換:ToUserName = 用戶 OpenID,FromUserName = 公眾號 ID。
寫反 = 用戶收不到消息,後台無報錯,極難排查。
// 正確回覆 XML 構造 string xml = $@""; {timestamp}
微信服務器驗證(GET 請求驗證 signature)通過後,才會推送 POST 事件。
若在驗證階段就輸出回覆 XML,會導致驗證失敗。
正確位置:驗證通過的分支中處理 POST 請求並輸出回覆。
自定義菜單接口:"url": "https://your.com/page"。
缺少 https:// 會導致菜單發布失敗或點擊無反應。
特別注意:JS-SDK 安全域名配置不需要協議頭,菜單 URL必須帶協議頭。
現象:Android 可 for (id of ids) wx.uploadImage(id),iOS 只能上傳最後一張。
原因:iOS 微信 WebView 並發限制,需串行上傳。
// ❌ iOS 只會上傳最後一張
localIds.forEach(id => {
wx.uploadImage({ localId: id, success: res => uploadServer(res.serverId) });
});
function uploadChain(localIds, index = 0) {
if (index >= localIds.length) return;
wx.uploadImage({
localId: localIds[index],
isShowProgressTips: 1,
success: res => {
uploadServer(res.serverId).then(() => {
uploadChain(localIds, index + 1); // 成功後遞歸下一張
});
},
fail: err => {
console.error('上傳失敗', err);
uploadChain(localIds, index + 1); // 失敗也繼續下一張
}
});
}
// 調用入口
wx.chooseImage({
count: 9,
success: res => {
let ids = res.localIds;
// 兼容 iOS 大小寫 bug
if (typeof ids === 'string') ids = ids.replace('wxlocalresource', 'wxLocalResource').split(',');
uploadChain(ids);
}
});
// PHP 端生成簽名時
$url = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
if (($pos = strpos($url, '#')) !== false) $url = substr($url, 0, $pos);
// 這個 $url 必須與前端 location.href.split('#')[0] 完全一致
| 特性 | snsapi_base | snsapi_userinfo |
|---|---|---|
| 用戶感知 | 靜默,無彈窗 | 彈窗「授權獲取用戶信息」 |
| 可獲取 | 僅 openid | openid + unionid + 昵稱/頭像/性別/地區 |
| 適用場景 | 已關注公眾號、僅需標識用戶 | 開放平台綁定、需展示用戶資料、未關注也要獲取信息 |
| 授權頁域名 | 需配置業務域名 | 需配置業務域名 + 網頁授權域名 |
建議:統一用 snsapi_userinfo,一次授權拿全量信息,避免二次跳轉。
// 頁面載入時執行
if (window.name !== 'hasLoad') {
location.reload(); // 首次進入/返回時強制刷新
window.name = 'hasLoad';
} else {
window.name = ''; // 刷新後重置,避免循環刷新
}
原理:window.name 在同標籤頁跳轉/返回時保持不變,刷新會重置。
// 必須在 WeixinJSBridgeReady 後調用
document.addEventListener('WeixinJSBridgeReady', function() {
WeixinJSBridge.call('closeWindow');
}, false);
適用場景:授權成功頁、支付結果頁、活動結束頁,自動關閉避免用戶手動返回。
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script> // 必須在 wx.config 之前引入,建議放在 <head> 中
微信開發「坑」多源於「文檔滯後、平台差異、審核機制」。建議建立團隊內部「微信開發規範文檔」,新人必讀、老人必改,將踩坑成本降為零。