一、获取apikey,appsecret与商户号
注册公众号、商户号
二、获取用户的OpenId
1.设置【授权回调页面域名】
官方解释:用户在网页授权页同意授权给公众号后,微信会将授权数据传给一个回调页面,回调页面需在此域名下,以确保安全可靠。回调页面域名不支持IP地址。
2.用户同意授权
我是把这个url写在微信菜单下的,当进入这个页面的时候就让用户同意。注意:好像是静默授权的,用户不知道
1.url:
https://open.weixin.qq.com/connect/oauth/authorize?appid=appid&redirect_uri=url&response_type=code&scope=snsapi_userinfo&state=park#wechat_redirect
参数:appid:公众号的唯一标识
redirect_uri:重定向的url,就是授权后要跳转的页面
scope:应用授权作用域
snsapi_base:不弹出授权页面,直接跳转,只能获取用户openid
snsapi_userinfo:弹出授权页面,可通过openid拿到昵称、性别、所在地
state:重定向后带的参数
2.用户同意后会产生一个code,只有分钟时间的有效期。
1
|
String code = request.getParameter( "code" )
|
3.code换openId
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
/**
* 常量类
* @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" ;
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
/**
* 通用工具类
* @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( "连接超时:" +ce.getMessage());
} catch (Exception e) {
log.error( "https请求异常:" +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();
}
// 从输入流读取返回内容
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无效时:
{
"errcode" :
, "errmsg" : "invalid code"
}
|
以上内容就是服务器之家的小编给大家分享的微信公众号支付(一)如何获取用户openId,希望大家喜欢。