微信公眾號(hào)支付(一)如何獲取用戶openId
一、獲取apikey,appsecret與商戶號(hào)
注冊(cè)公眾號(hào)、商戶號(hào)
二、獲取用戶的OpenId
1.設(shè)置【授權(quán)回調(diào)頁(yè)面域名】
官方解釋:用戶在網(wǎng)頁(yè)授權(quán)頁(yè)同意授權(quán)給公眾號(hào)后,微信會(huì)將授權(quán)數(shù)據(jù)傳給一個(gè)回調(diào)頁(yè)面,回調(diào)頁(yè)面需在此域名下,以確保安全可靠?;卣{(diào)頁(yè)面域名不支持IP地址。

2.用戶同意授權(quán)
我是把這個(gè)url寫在微信菜單下的,當(dāng)進(jìn)入這個(gè)頁(yè)面的時(shí)候就讓用戶同意。注意:好像是靜默授權(quán)的,用戶不知道
參數(shù):appid:公眾號(hào)的唯一標(biāo)識(shí)
redirect_uri:重定向的url,就是授權(quán)后要跳轉(zhuǎn)的頁(yè)面
scope:應(yīng)用授權(quán)作用域
snsapi_base:不彈出授權(quán)頁(yè)面,直接跳轉(zhuǎn),只能獲取用戶openid
snsapi_userinfo:彈出授權(quán)頁(yè)面,可通過openid拿到昵稱、性別、所在地
state:重定向后帶的參數(shù)
2.用戶同意后會(huì)產(chǎn)生一個(gè)code,只有分鐘時(shí)間的有效期。
String code = request.getParameter("code")
3.code換openId
/**
* 常量類
* @author rory.wu
*
*/
public class Constants {
// 第三方用戶唯一憑證
public static String appid = "";
// 第三方用戶唯一憑證密鑰
public static String appsecret = "";
//商戶ID
public static String mch_id="";
//獲取openId
public static String oauth_url = "https://api.weixin.qq.com/sns/oauth/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
}
/**
* 通用工具類
* @author rory.wu
* @version .
* @since 年月日
*/
public class CommonUtil {
private static Logger log = Logger.getLogger(CommonUtil.class);
public static JSONObject httpsRequestToJsonObject(String requestUrl, String requestMethod, String outputStr) {
JSONObject jsonObject = null;
try {
StringBuffer buffer = httpsRequest(requestUrl, requestMethod, outputStr);
jsonObject = JSONObject.fromObject(buffer.toString());
} catch (ConnectException ce) {
log.error("連接超時(shí):"+ce.getMessage());
} catch (Exception e) {
log.error("https請(qǐng)求異常:"+e.getMessage());
}
return jsonObject;
}
private static StringBuffer httpsRequest(String requestUrl, String requestMethod, String output)
throws NoSuchAlgorithmException, NoSuchProviderException, KeyManagementException, MalformedURLException,
IOException, ProtocolException, UnsupportedEncodingException {
URL url = new URL(requestUrl);
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setUseCaches(false);
connection.setRequestMethod(requestMethod);
if (null != output) {
OutputStream outputStream = connection.getOutputStream();
outputStream.write(output.getBytes("UTF-"));
outputStream.close();
}
// 從輸入流讀取返回內(nèi)容
InputStream inputStream = connection.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
StringBuffer buffer = new StringBuffer();
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
inputStream = null;
connection.disconnect();
return buffer;
} }
/**
* 獲取用戶的openId,并放入session
* @param code 微信返回的code
*/
private void setOpenId(String code) {
session.put("code", code);
String oauth_url = Constants.oauth_url.replace("APPID", Constants.appid).replace("SECRET", Constants.appsecret).replace("CODE", String.valueOf(session.get("code")));
log.info("oauth_url:"+oauth_url);
JSONObject jsonObject = CommonUtil.httpsRequestToJsonObject(oauth_url, "POST", null);
log.info("jsonObject:"+jsonObject);
Object errorCode = jsonObject.get("errcode");
if(errorCode != null) {
log.info("code不合法");
}else{
String openId = jsonObject.getString("openid");
log.info("openId:"+openId);
session.put("openId", openId);
}
}
oauth_url返回的格式是:
{
"access_token":"ACCESS_TOKEN",
"expires_in":,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID", "scope":"SCOPE",
"unionid": "o_bmasdasdsad_sgVthMZOPfL"
}
Code無效時(shí):
{
"errcode":
,"errmsg":"invalid code"
}
以上內(nèi)容就是腳本之家的小編給大家分享的微信公眾號(hào)支付(一)如何獲取用戶openId,希望大家喜歡。
相關(guān)文章
JAVA正則表達(dá)式校驗(yàn)qq號(hào)碼的方法
Java作為一種開發(fā)語(yǔ)言,有許多值得推薦的地方,但是它一直以來沒有自帶對(duì)正則表達(dá)式的支持。下面小編給大家?guī)砹薐AVA正則表達(dá)式校驗(yàn)qq號(hào)碼的方法,需要的朋友參考下吧2018-04-04
重試框架Guava-Retry和spring-Retry的使用示例
spring-retry 和 guava-retry 工具都是線程安全的重試,能夠支持并發(fā)業(yè)務(wù)場(chǎng)景的重試邏輯正確性,本文主要介紹了重試框架Guava-Retry和spring-Retry的使用示例,感興趣的可以一下2023-09-09
詳解JDK自帶javap命令反編譯class文件和Jad反編譯class文件(推薦使用jad)
這篇文章主要介紹了JDK自帶javap命令反編譯class文件和Jad反編譯class文件(推薦使用jad),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09
Java使用Arrays.sort()方法實(shí)現(xiàn)給對(duì)象排序
這篇文章主要介紹了Java使用Arrays.sort()方法實(shí)現(xiàn)給對(duì)象排序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
巧用FutureTask 線程池輕松解決接口超時(shí)問題
這篇文章主要為大家介紹了使用FutureTask結(jié)合線程池輕松解決接口超時(shí)問題的巧妙用法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11

