OpenID:用戶在某公眾號下的唯一標識,同一微信用戶對不同公眾號有不同 OpenID。獲取 OpenID 是發送模板消息、發放紅包、網頁授權等業務的前提。
event=subscribe 的 XML 報文;<FromUserName><![CDATA[OPENID]]></FromUserName>;OpenID,後續業務直接讀取;https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base&state=STATE#wechat_redirectscope=snsapi_base 靜默授權(不彈窗), 需用戶確認;redirect_uri?code=CODE&state=STATE;code 換取 access_token + openid:https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code;openid,業務邏輯處理後重定向回目標頁。@GetMapping("/wx/redirect")
public String wxRedirect(@RequestParam String code) {
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?" +
"appid=" + appId + "&secret=" + secret + "&code=" + code + "&grant_type=authorization_code";
JSONObject json = restTemplate.getForObject(url, JSONObject.class);
String openid = json.getString("openid");
// 存庫、設置 Session、跳轉業務頁...
return "redirect:/business/page";
}
| 場景 | 推薦方式 |
|---|---|
| 已關注用戶、需長期觸達 | 關注事件入庫 |
| 未關注用戶、H5 頁面、一次性業務 | 網頁授權 snsapi_base |
| 需獲取頭像/昵稱等用戶信息 | 網頁授權 snsapi_userinfo |
code 只能使用一次、5 分鐘過期,換取 access_token 後應緩存(有效期 2 小時);