java⼩程序code获取openid的操作
最近有个⼩程序的项⽬需要前端传code 后端获取openid 这⾥是纯后端
在这⾥记录⼀下吧
主要代码:
这⾥是获取openid的实现类
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
szk.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";
/
/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("api.weixin.qq/sns/jscode2session", params);
System.out.println("sr========"+sr);
//解析相应内容(转换成json对象)
JSONObject json =JSON.parseObject(sr);
System.out.println("json============"+json);
/
/获取会话密钥(session_key)("session_key").toString();
String session_key = ("session_key").toString();
//⽤户的唯⼀标识(openid)
String openid = (String) ("openid");
map.put("session_key",session_key);
map.put("openid",openid);
return map;
}
}
这⾥还需要⼀个⼯具类⽤来发送请求的
import java.io.*;
import java.URL;
import java.URLConnection;有趣的java小程序
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
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)");
// 建⽴实际的连接
// 获取所有响应头字段
Map<String, List<String>> map = HeaderFields();
// 遍历所有的响应头字段
for (String key : map.keySet()) {
System.out.println(key + "--->" + (key));
}
// 定义 BufferedReader输⼊流来读取URL的响应
in = new BufferedReader(new InputStreamReader(
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 OutputStream());
out = new PrintWriter(new OutputStream(), "UTF-8"));
/
/ 发送请求参数
out.print(param);
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输⼊流来读取URL的响应
in = new BufferedReader(
new InputStream(),"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 = Instance("MD5");
md.Bytes("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.HexString(i));
}
// 32位加密
String();//toUpperCase
// 16位的加密
//String().substring(8, 24).toUpperCase();
} catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
e.printStackTrace();
return null;
}
}
}
如果⼀切顺利的话传过来code就会返回open_id和session_key
中间可能会有报错主要原因在appid和appsecret这,前端需要配置appid才⾏,总的来说还是很简单的⽀付才是⼤坑以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。如有错误或未考虑完全的地⽅,望不吝赐教。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。