最近有个小程序的项目 需要前端传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才行,总的来说还是很简单的 微信支付才是大坑
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。如有错误或未考虑完全的地方,望不吝赐教。
原文链接:https://blog.csdn.net/qq_45136253/article/details/115568295