最近有个小程序的项目 需要前端传code 后端获取openid 这里是纯后端
在这里记录一下吧
主要代码:
这里是获取openid的实现类
?
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
|
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.moszk.frame.basic.utils.HttpRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
public class WeiXinSubmitController {
@ResponseBody
@RequestMapping (value = "/wx/decodeUserInfo" , method = RequestMethod.GET)
public Map decodeUserInfo(String code) {
System.out.println(code);
Map map = new HashMap();
//登录凭证不能为空
if (code == null || code.length() == 0 ) {
map.put( "status" , 0 );
map.put( "msg" , "code 不能为空" );
return map;
}
//小程序唯一标识 (在微信小程序管理后台获取)
String wxspAppid = "***********" ;
//小程序的 app secret (在微信小程序管理后台获取)
String wxspSecret = "*********************" ;
//授权(必填)
String grant_type = "authorization_code" ;
//https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
//1、向微信服务器 使用登录凭证 code 获取 session_key 和 openid
//请求参数
String params = "appid=" + wxspAppid + "&secret=" + wxspSecret + "&js_code=" + code + "&grant_type=" + grant_type;
//发送请求
String sr = HttpRequest.sendGet( "https://api.weixin.qq.com/sns/jscode2session" , params);
System.out.println( "sr========" +sr);
//解析相应内容(转换成json对象)
JSONObject json =JSON.parseObject(sr);
System.out.println( "json============" +json);
//获取会话密钥(session_key)json.get("session_key").toString();
String session_key = json.get( "session_key" ).toString();
//用户的唯一标识(openid)
String openid = (String) json.get( "openid" );
map.put( "session_key" ,session_key);
map.put( "openid" ,openid);
return map;
}
}
|
这里还需要一个工具类 用来发送请求的
?
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.*;
public class HttpRequest {
/**
* 向指定URL发送GET方法的请求
*
* @param url
* 发送请求的URL
* @param param
* 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return URL 所代表远程资源的响应结果
*/
public static String sendGet(String url, String param) {
String result = "" ;
BufferedReader in = null ;
try {
String urlNameString = url + "?" + param;
URL realUrl = new URL(urlNameString);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty( "accept" , "*/*" );
connection.setRequestProperty( "connection" , "Keep-Alive" );
connection.setRequestProperty( "user-agent" ,
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)" );
// 建立实际的连接
connection.connect();
// 获取所有响应头字段
Map<String, List<String>> map = connection.getHeaderFields();
// 遍历所有的响应头字段
for (String key : map.keySet()) {
System.out.println(key + "--->" + map.get(key));
}
// 定义 BufferedReader输入流来读取URL的响应
in = new BufferedReader( new InputStreamReader(
connection.getInputStream()));
String line;
while ((line = in.readLine()) != null ) {
result += line;
}
} catch (Exception e) {
System.out.println( "发送GET请求出现异常!" + e);
e.printStackTrace();
}
// 使用finally块来关闭输入流
finally {
try {
if (in != null ) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return result;
}
/**
* 向指定 URL 发送POST方法的请求
*
* @param url
* 发送请求的 URL
* @param param
* 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return 所代表远程资源的响应结果
*/
public static String sendPost(String url, String param, String keyValue) {
PrintWriter out = null ;
BufferedReader in = null ;
String result = "" ;
try {
URL realUrl = new URL(url);
// 打开和URL之间的连接
URLConnection conn = realUrl.openConnection();
// 设置通用的请求属性
conn.setRequestProperty( "accept" , "*/*" );
conn.setRequestProperty( "connection" , "Keep-Alive" );
conn.setRequestProperty( "api-key" , keyValue);
conn.setRequestProperty( "user-agent" ,
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)" );
conn.setRequestProperty( "Accept-Charset" , "UTF-8" );
// 发送POST请求必须设置如下两行
conn.setDoOutput( true );
conn.setDoInput( true );
// 获取URLConnection对象对应的输出流
//out = new PrintWriter(conn.getOutputStream());
out = new PrintWriter( new OutputStreamWriter(conn.getOutputStream(), "UTF-8" ));
// 发送请求参数
out.print(param);
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(
new InputStreamReader(conn.getInputStream(), "UTF-8" ));
String line;
while ((line = in.readLine()) != null ) {
System.out.println(line);
result += line;
}
} catch (Exception e) {
System.out.println( "发送 POST 请求出现异常!" +e);
e.printStackTrace();
}
//使用finally块来关闭输出流、输入流
finally {
try {
if (out!= null ){
out.close();
}
if (in!= null ){
in.close();
}
}
catch (IOException ex){
ex.printStackTrace();
}
}
return result;
}
public static String generateOrderId(){
String keyup_prefix= new SimpleDateFormat( "yyyyMMddHHmmss" ).format( new Date());
String keyup_append= String.valueOf( new Random().nextInt( 899999 )+ 100000 );
String pay_orderid=keyup_prefix+keyup_append; //订单号
return pay_orderid;
}
public static String generateTime(){
return new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ).format( new Date());
}
public static String md5(String str) throws NoSuchElementException {
try {
MessageDigest md = MessageDigest.getInstance( "MD5" );
md.update(str.getBytes( "UTF-8" ));
byte [] byteDigest = md.digest();
int i;
//字符数组转换成字符串
StringBuffer buf = new StringBuffer( "" );
for ( int offset = 0 ; offset < byteDigest.length; offset++) {
i = byteDigest[offset];
if (i < 0 )
i += 256 ;
if (i < 16 )
buf.append( "0" );
buf.append(Integer.toHexString(i));
}
// 32位加密
return buf.toString(); //toUpperCase
// 16位的加密
//return buf.toString().substring(8, 24).toUpperCase();
} catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
e.printStackTrace();
return null ;
}
}
}
|
如果一切顺利的话 传过来code就会返回open_id和session_key
中间可能会有报错 主要原因在appid和appsecret这,前端需要配置appid才行,总的来说还是很简单的 微信支付才是大坑
以上为个人经验,希望能给大家一个参考,也希望大家多多支持快网idc。如有错误或未考虑完全的地方,望不吝赐教。
原文链接:https://blog.csdn.net/qq_45136253/article/details/115568295
相关文章
猜你喜欢
- 个人网站服务器域名解析设置指南:从购买到绑定全流程 2025-06-10
- 个人网站搭建:如何挑选具有弹性扩展能力的服务器? 2025-06-10
- 个人服务器网站搭建:如何选择适合自己的建站程序或框架? 2025-06-10
- 64M VPS建站:能否支持高流量网站运行? 2025-06-10
- 64M VPS建站:怎样选择合适的域名和SSL证书? 2025-06-10
TA的动态
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
您的支持,是我们最大的动力!
热门文章
-
2025-05-25 17
-
Linux系统如何安装和使用shell编写的工具supportconfig
2025-05-27 41 -
2025-05-29 90
-
2025-05-25 27
-
2025-05-29 87
热门评论