好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

java 微信小程序code获取openid的操作

最近有个小程序的项目 需要前端传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测试数据/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测试数据/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

查看更多关于java 微信小程序code获取openid的操作的详细内容...

  阅读:47次