微信开发 Java SDK微信公众支付(获取openid)
微信开发 Java SDK 微信公众支付(获取openid)
第一步:用户同意授权,获取code
在微信公众平台中,需要先让用户同意授权,然后才能获取到 openid。这个过程涉及两个步骤:
1. 用户点击授权按钮:在你的微信公众号中,需要提供一个授权按钮,让用户可以点击它来同意授权。
2. 获取code:当用户点击授权按钮后,微信会跳转到一个授权页面。这个页面上会显示一个code,这个code是临时的,并且只在短时间内有效。
第二步:通过code换取网页授权access_token
使用得到的 code,可以向微信服务器请求一个网页授权 access_token。这一步骤涉及以下几个方面:
1. 请求地址:需要向微信服务器发送一个 GET 请求,请求地址是 ` 参数:需要传递以下几个参数:
* `appid`:你的微信公众号的 AppID。
* `secret`:你的微信公众号的 Secret。
* `code`:得到的 code。
* `grant_type`:固定值为 `authorization_code`。
3. 返回结果:如果请求成功,微信服务器会返回一个 JSON 对象,其中包含以下几个字段:
* `access_token`:网页授权 access_token。
* `expires_in`:access_token 的有效时间(单位:秒)。
* `refresh_token`:可以用来刷新 access_token 的 refresh_token。
第三步:刷新access_token
当 access_token 过期时,可以使用 refresh_token 来刷新 access_token。这个过程涉及以下几个方面:
1. 请求地址:需要向微信服务器发送一个 GET 请求,请求地址是 ` 参数:需要传递以下几个参数:
* `appid`:你的微信公众号的 AppID。
* `grant_type`:固定值为 `refresh_token`。
3. 返回结果:如果请求成功,微信服务器会返回一个 JSON 对象,其中包含以下几个字段:
* `access_token`:刷新后的 access_token。
* `expires_in`:access_token 的有效时间(单位:秒)。
第四步:使用openid
当你得到 access_token 后,可以使用它来获取 openid。这个过程涉及以下几个方面:
1. 请求地址:需要向微信服务器发送一个 GET 请求,请求地址是 ` 参数:需要传递以下几个参数:
* `access_token`:得到的 access_token。
* `lang`:固定值为 `zh_CN`,表示返回结果使用简体中文。
3. 返回结果:如果请求成功,微信服务器会返回一个 JSON 对象,其中包含以下几个字段:
* `openid`:用户的 openid。
* `nickname`:用户的昵称。
* `sex`:用户的性别(0:未知、1:男、2:女)。
* `province`:用户所在省份。
* `city`:用户所在城市。
示例代码
以下是使用 Java SDK 的示例代码:
```javaimport java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class WeChatSDK {
public static void main(String[] args) throws Exception {
// 第一步:用户同意授权,获取code String code = getAuthorizationCode();
// 第二步:通过code换取网页授权access_token String accessToken = getAccessToken(code);
// 第三步:刷新access_token String refreshToken = refreshAccessToken(accessToken);
// 第四步:使用openid String openid = getUserInfo(accessToken);
}
private static String getAuthorizationCode() throws Exception {
URL url = new URL(" HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
int responseCode = connection.getResponseCode();
if (responseCode ==200) {
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
StringBuilder builder = new StringBuilder();
while ((line = reader.readLine()) != null) {
builder.append(line);
}
return builder.toString().split("=")[1];
} else {
throw new Exception("Failed to get authorization code");
}
}
private static String getAccessToken(String code) throws Exception {
URL url = new URL(" + code + "&grant_type=authorization_code");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
int responseCode = connection.getResponseCode();
if (responseCode ==200) {
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
StringBuilder builder = new StringBuilder();
while ((line = reader.readLine()) != null) {
builder.append(line);
}
return builder.toString().split(""")[3];
} else {
throw new Exception("Failed to get access token");
}
}
private static String refreshAccessToken(String accessToken) throws Exception {
URL url = new URL(" HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
int responseCode = connection.getResponseCode();
if (responseCode ==200) {
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
StringBuilder builder = new StringBuilder();
while ((line = reader.readLine()) != null) {
builder.append(line);
}
return builder.toString().split(""")[3];
} else {
throw new Exception("Failed to refresh access token");
}
}
private static String getUserInfo(String accessToken) throws Exception {
URL url = new URL(" + accessToken + "&lang=zh_CN");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
int responseCode = connection.getResponseCode();
if (responseCode ==200) {
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
StringBuilder builder = new StringBuilder();
while ((line = reader.readLine()) != null) {
builder.append(line);
}
return builder.toString().split(""")[3];
} else {
throw new Exception("Failed to get user info");
}
}
}
```
以上是使用 Java SDK 的示例代码。需要注意的是,需要替换 `APPID` 和 `SECRET` 为你的微信公众号的 AppID 和 Secret。