一、頁面授權
// 進入頁面獲取權限code
function initAuthorizeCode() {
var appid = $("#appid").val();//公眾號appid
var openid = $("#openId").val();//openid
var userId = $("#userId").val();
var code = getUrlParam('code');
var local = window.location.href;
var hrefurl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid="+appid+"&redirect_uri="+encodeURIComponent(local)+"&response_type=code&scope=snsapi_base&state=dcabe11a-751f-490f-9dcc-606881c6fcdb#wechat_redirect";
var localopenid = localStorage.getItem("loginStorageKey"+userId);
if((code==null || code == "")&&(openid==null||openid==""||openid=="null")){
window.location.href = hrefurl;
// window.location.replace(hrefurl);
}else{
// var localopenid = localStorage.getItem("loginStorageKey"+userId);
if(openid==undefined || openid=="" || openid==null|| openid=="null"||openid=="undefined"){
console.info(code);
$.ajax({
url: basePath+'loginController/getOpenId',
type:'post',
dataType:'json',
data:{code:code},
async:false,
success:function(result){
console.info(result);
localStorage.setItem("loginStorageKey"+userId,result.openid);
result = true;
},
error:function(msg){
console.info(msg);
},
});
}
}
}
二、通過code獲取openid
@RequestMapping(value = "/getOpenId")
public @ResponseBody String getOpenId(HttpServletRequest request) {
Map<String, Object> maps = new HashMap<String, Object>();
maps.put("succ", true);
maps.put("msg", "success");
String code = request.getParameter("code");
String openId = (String) request.getSession().getAttribute("wx_user_openid");
try {
// 調用查詢接口 如果還是失敗返回失敗頁面
WxOauthLogin wxAuth = new WxOauthLogin();
String url = wxAuth.getAccessTokenUrl(code);
log.info("獲取用戶openid請求參數 result param:{}", url);
URL urlObject = new URL(url);
HttpURLConnection urlConnection = (HttpURLConnection) urlObject.openConnection();
// 將返回的輸入流轉換成字符串
InputStream inputStream = urlConnection.getInputStream();
// 指定編碼格式
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
BufferedReader in = new BufferedReader(inputStreamReader);
String jsonUserStr = in.readLine().toString();
// 釋放資源
inputStream.close();
inputStream = null;
urlConnection.disconnect();
log.info("通過code換取網頁授權access_token result:{}", jsonUserStr);
if (jsonUserStr != null) {
Map<String, String> resultmap = Json.toObject(jsonUserStr, Map.class);
if (StringUtil.empty(resultmap.get("openid"))) {
log.error("獲取openid失敗");
maps.put("succ", false);
maps.put("msg", "獲取openid失敗");
} else {
maps.put("openid", resultmap.get("openid"));
maps.put("unionid", resultmap.get("unionid"));
// 將openId放到緩存
if(ObjectUtils.isEmpty(openId)){
openId = resultmap.get("openid");
request.getSession().setAttribute("wx_user_openid", openId);
maps.put("openid", openId);
}
}
}
} catch (Exception e) {
log.error("獲取openid失敗");
maps.put("succ", false);
maps.put("msg", "獲取openid失敗");
}
log.info("獲取用戶openid執行結果:{}",Json.toJson(maps));
return Json.toJson(maps);
// return openId;
}
三、根據code獲取openid
public String getAccessTokenUrl(String code) {
// ?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
StringBuffer url = new StringBuffer("https://api.weixin.qq.com/sns/oauth2/access_token");
url.append("?appid=" + wxResourceProp.getAppid());
url.append("&secret=" + wxResourceProp.getAppsecret());
url.append("&code=" + code);
url.append("&grant_type=authorization_code");
return url.toString();
}
至此未關注公眾號的微信用,可以用jsapi支付方式支付公眾號里的訂單。
