小程序端代码:
wx.login({
success: res => {
if (res.code) {
//let URL = 'https://api.weixin.qq.com/sns/jscode2session?appid=aaaaaaaa&secret=aaaaaaaaaaaaaaaa&js_code='+res.code+'&grant_type=authorization_code' // 这个url在服务器端代码调用
//http://10.221.129.198:8080/request?type=100
let URL = 'http://10.221.129.198:8080/request?login_code='+res.code
console.log(URL)
wx.request({
url: URL ,
timeout: 100000,
success:function(res){
//res.data中有openid
console.log(res)
console.log('login request success')
fail: function (res) {
console.log(res)
console.log('login request failed')
fail: function (res) {
console.log('login failed')
console.log(res)
服务器端代码:
@Controller
public class ServerController {
@RequestMapping(value = "/request")
public @ResponseBody
String request(@RequestParam(value="login_code") String code) {
String res = null;
if ( !code.equals(' ') ) {
// 向微信申请获取用户id信息
// https://api.weixin.qq.com/sns/jscode2session?
// appid=aaaaaaaaaaaaaaaa&secret=aaaaaaaaaaaaaaaa
// js_code=code
// &grant_type=authorization_code
String str_url = "https://api.weixin.qq.com/sns/jscode2session?appid=aaaaaaaaaaaaa&secret=bbbbbbbbbbbbbb&js_code='+code+'&grant_type=authorization_code";
InputStream in = null;
OutputStream out = null;
try {
URL url = new URL(str_url);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
in = new BufferedInputStream(connection.getInputStream());
out = new BufferedOutputStream(new FileOutputStream("/home/lys/package-app-NewHomeService/login.txt", true));
byte[] bytes = new byte[1024];
int len = 0;
if((len = in.read(bytes)) != -1) {
res = bytes.toString();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
// HttpServletRequest request = null;
// HttpServletResponse response = null;
} else {
res = "request value error!";
return res;
小程序端返回的res最后打印出来的数据:和服务器端断点看到的url返回值一样
{data: "null[B@c35210c", header: {…}, statusCode: 200, cookies: Array(0), errMsg: "request:ok"}cookies: []
data: "null[B@c35210c"
errMsg: "request:ok"
header: Connection: "keep-alive"Content-Length: "14"Content-Type: "text/plain;charset=UTF-8"Date: "Thu, 23 Feb 2023 09:39:00 GMT"Keep-Alive: "timeout=60"
__proto__: ObjectstatusCode: 200__proto__: Object
login request success
login调用期间,小程序没用弹出确认登陆的弹窗,data: "null[B@c35210c"是乱码。
----------------------------------------
以上代码需要修改,修改如下:
(看到有人说:服务端curl证书验证关闭就好了 true=>false,没试,感觉配置ssl还挺麻烦的,目测应该是不需要)
上文的url错误,="+code+"会被直接拼接到字符串,要改成
String string = "https://api.weixin.qq.com/sns/jscode2session?appid=xxx&secret=xxx&js_code="+code+"&grant_type=authorization_code";
URL url = new URL(string);
用户通过login()方法获取code,然后把code传给开发后台,后台通过code 以及appid以及密钥获取openid和sessionkey 进行登陆,然后返回一个token给前端,
目前直接在浏览器访问网页,肉眼可见返回值是json,{"session_key":"R+DEI9Q9xxxxxaMS\/gdnQ==","openid":"o4LDU5Rbyxxxxxmp6JVbuZg"}这样子,或者{"errcode":40163,"errmsg":"code been used, rid: 63f7638f-5cfd2279-5802ec1a"}
小程序端console输出res是data: "null[B@c35210c",应该是正确的返回值,但是数据格式转换有问题。
但是我用idea搭建的服务器没用jsonobject,只有jsonpobject,没办法直接转成json数据,就很迷现在,等解决了再来改评论
63f7638f-5cfd2279-5802ec1a和c35210c每次重新刷新网页或重新申请都会变,应该也是临时数据吧
----
byte[] request(@RequestParam(value="login_code") String code) {
byte[] res = null;
.....
byte[] bytes = new byte[1024];
if ((len = in.read(bytes)) != -1) {
断点调试打印byte[] bytes,发现为ascii码数组,对照ascii转换后发现是session_key和openid
// bytes = 123 34 115s 101e 115s 115s 105i 111o 110n 95_ 107k 101e 121y... == {"sessi.....
// ascii: {"session_key":"lV+hmiQWeFYzOl\/WspCamw==","openid":"o4LDU5Rbyoz6HvMpIyNmp6JVbuZg"}
res = bytes;
return res;
前端不能正确获取数据,是因为服务器不能直接将字符数组转换成字符串,bytes.toString()是有问题的,所以将服务端请求返回值类型改成字符数组,直接返回给前端处理,由前端将字符数组类型转换为json类型
至此,前端可以成功拿到session_key和openid
我想说的是微信官方说 unionid 也会返回,我TMD 快钻到地缝去找了也没找见,汗了