最近做一个项目用到小程序,为了简化用户啊登录,通过获取小程序用户的openid来唯一标示用户。

1、官方教程

2、具体步骤

3、具体实现

4、可能出现的错误

5、代码下载

1、官方教程

先来看看官方怎么说的:官方链接

官方的意思是用户打开小程序会产生一个临时的code(code有实效性),通过这个code加上一些参数作 可以获取openID和sessionKey。

具体需要什么参数呢?官方介绍

2,具体步骤

A,拿到appid和appsecret

B,通过小程序wx.login({...}); 函数获取code

C,把code、appid、secret、type作为参数 发送给服务器换取 openID

3,具体实现

由于code是用户登录是产生的,grat_type是默认的,所以只要再拿到appID和appSecret

小程序的 appId 和小程序的 appSecret获取方法:

A:登录微信公众平台https://mp.weixin.qq.com

B:找到开发

小程序客户端获取code

在小程序app.js 中加入 下面的代码:当编译工程时会自动发送请求并且把code发送给服务器。

// 登录
wx.login({
success: res => {
// 发送 res.code 到后台换取 openId, sessionKey, unionId
if (res.code) {
wx.request({
url: 'http://localhost:8080/cis',
data: {
code: res.code
},
header: {
'content-type': 'application/x-www-form-urlencoded'
},
success(res) {
console.log("openid:" + res.data.openid);
if (res.data.openid != "" || res.data.openid != null) {
// 登录成功
wx.setStorageSync("openid", res.data.openid);//将用户id保存到缓存中
wx.setStorageSync("session_key", res.data.session_key);//将session_key保存到缓存中
} else {
// 登录失败
// TODO 跳转到错误页面,要求用户重试 return false;
}
}
})
} else {
console.log('获取用户登录态失败!' + res.errMsg)
}
}
})

服务端用idea建立springboot工程 导入web依赖

A:

B:

C:

D:

在pom.xml中引入依赖:

     <!--Http Requset封装-->
<!--http requset-->
<dependency>
<groupId>com.github.kevinsawicki</groupId>
<artifactId>http-request</artifactId>
<version>6.0</version>
</dependency> <!--json 解析-->
<!--https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.49</version>
</dependency>

E:

建立controller包和server包,在server包下创建impl包:

WeChatController类用来处理请求,接收参数(code),代码如下:

import com.cnetopro.httpdemo.service.WeChatService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; @RestController
public class WeChatController {
@Autowired
WeChatService wc; @RequestMapping("/cis")
public void getcode(@RequestParam(value = "code")String code){
System.out.println(code); wc.codetoopenid(code); }
}

WeChatService接口用来 发送get请求获取openID和sessionkey,代码如下

import org.springframework.stereotype.Service;

public interface WeChatService {
public String codetoopenid(String code);
}

WeChartServiceimpl类用来实现WeChartService里面的方法,代码如下

注意把xxxx...替换成自己的 appid

把eeeeee...替换成自己的secret

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.cnetopro.httpdemo.service.WeChatService;
import com.github.kevinsawicki.http.HttpRequest;
import org.springframework.stereotype.Service; import java.util.HashMap;
import java.util.Map; @Service
public class WeChatServiceimpl implements WeChatService { @Override
public String codetoopenid(String code) {
Map<String, String> data = new HashMap<String, String>();
data.put("appid", "xxxxxxxxxxxxxxxxx");
data.put("secret", "eeeeeeeeeeeeeeeeeeeeeeeeee");
data.put("js_code", code);
data.put("grant_type", "authorization_code"); String response = HttpRequest.get("https://api.weixin.qq.com/sns/jscode2session").form(data).body();
System.out.println("Response was: " + response);
JSONObject obj= JSON.parseObject(response);//将json字符串转换为json对
System.out.println(obj); return null;
}
}

运行结果:

成功获取openID和sessionkey

WeChatServiceimpl代码说明:

用这个jar包来封装https请求

  <!--http requset-->
<dependency>
<groupId>com.github.kevinsawicki</groupId>
<artifactId>http-request</artifactId>
<version>6.0</version>
</dependency>

用这个jar包来处理接收的数据

       <dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.49</version>
</dependency>

4、可能出现的错误说明:

1.小程序

错误:http://localhost:8080 不在以下 request 合法域名列表中,请参考文档

解决办法:点击小程序开发工具右上角详情>本地设置>不校验合法域名

2.idea开发工具控制台报错

(这个错误困扰了3个小时)

{"errcode":40013,"errmsg":"invalid appid, hints: [ req_id: dHMAcEyFe-9lrrvA ]"}

错误原因1: appId填错了

错误原因2:secret填错了

错误原因3(非常重要):微信开发着工具创建小程序时的appId与 服务器端代码的appId不一致,(因为有时喜欢用接口测试号appid)

5、代码下载

github:下载地址

gitee:下载地址

SpringBoot 获取微信小程序openid的更多相关文章

  1. java后台获取微信小程序openid

    一.jar包准备 1.在网盘下载 链接:https://pan.baidu.com/s/15HAAWOg_yn768g4s9IrcPg 提取码:hgj0 二.在pom文件中添加依赖 1.将外部的引入的 ...

  2. JAVA获取微信小程序openid和获取公众号openid,以及通过openid获取用户信息

    一,首先说明下这个微信的openid 为了识别用户,每个用户针对每个公众号会产生一个安全的OpenID,如果需要在多公众号.移动应用之间做用户共通,则需前往微信开放平台,将这些公众号和应用绑定到一个开 ...

  3. 调试阶段 获取微信小程序openid

    wx.login({ success: function(res) { //首先获取用户code //res.code wx.request({ url: 'https://api.weixin.qq ...

  4. 微信小程序开发之如何哪获取微信小程序的APP ID

    微信小程序的开发工具,在新建项目的时候,默认提示填写APP ID,如果不填写AppID 也是可以本地测试和开发的,但是无法通过手机调试,只能在开发工具里查看 如果需要真机调试微信小程序,需要安装微信6 ...

  5. SpringBoot实现微信小程序登录的完整例子

    目录 一.登录流程 二.后端实现 1.SpringBoot项目结构树 2.实现auth.code2Session 接口的封装 3.建立用户信息表及用户增删改查的管理 4.实现登录认证及令牌生成 三.前 ...

  6. C# 获取微信小程序access_token

    /// <summary> /// 获取access_token /// </summary> /// <returns></returns> publ ...

  7. Java 获取微信小程序二维码(可以指定小程序页面 与 动态参数)

    一.准备工作 微信公众平台接口调试工具 小程序的唯一标识(appid) 小程序的密钥(secret) 二.获取access_token 打开微信公众平台接口调试工具,在参数列表中输入小程序的appid ...

  8. 如何获取微信小程序for循环的index

    在微信小程序开发中,对于wx:for,可以使用wx:for-index="index"来获取数组中的元素的索引值(下标). <view class="item&qu ...

  9. 小程序 获取微信小程序的源码

    1.微信小程序是以wxapkg可执行文件的形式存在本地的 2.网上有工具可以把wxapkg文件还原成源代码: https://github.com/qwerty472123/wxappUnpacker ...

随机推荐

  1. 冲刺随笔——Day_Six

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 团队进行Alpha冲刺 作业正文 正文 其他参考文献 无 ...

  2. 在django中使用原生sql语句

    raw # row方法:(掺杂着原生sql和orm来执行的操作) res = CookBook.objects.raw('select id as nid from epos_cookbook whe ...

  3. Python Flask后端异步处理(三)

    前一篇博文我们已经将基础知识和环境配置进行了介绍:https://www.cnblogs.com/Cl0ud/p/13192925.html,本篇博文在实际应用场景中使用Celery,对Flask后端 ...

  4. Hangfire&Autofac与ASP.NET CORE注入失败

    Hangfire.Autofac与ASP.NET CORE注入失败 项目里面使用了Hangfire,因为之前没用过吧,遇到了个问题,就是使用了ico容器后,再用Hangfire总是注入不上对象,总是后 ...

  5. WPF中Logical Tree和Visual Tree的区别

    The Logical TreeThe logical tree describes the relations between elements of the user interface. The ...

  6. 初中的一些OI琐屑 & APIO2020 & NOI2020

    这篇文章会发布在我的博客上 https://www.cnblogs.com/dmoransky/(一个小习惯,把信息学竞赛的学习历程记录在个人博客中). 借这篇随笔回顾并简短总结一下我的初中OI(信息 ...

  7. 购物车 python作业

    功能要求:要求用户输入总资产,例如:2000显示商品列表,让用户根据序号选择商品,加入购物车购买,如果商品总额大于总资产,提示账户余额不足,否则,购买成功.附加:可充值.某商品移除购物车goods = ...

  8. C 与 C++ 中 指向二维数组的指针进行指针运算

    二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有"缝隙".以下面的二维数组 nums 为例: 从概念上理解,nums 的分布像一个矩阵,但在 ...

  9. Day1 字符编码及编码函数

    ord() 函数 获取字符的整数表示chr() 函数 把整数编码转换为对应字符'\十六进制编码\十六进制编码' 可以将字符的整数编码使用十六进制的方式这样写Python字符串类型为str,在内存中以u ...

  10. SpringBoot异步调用--@Async详解

    1. 概述   在日常开发中,为了提高主线程的效率,往往需要采用异步调用处理,例如系统日志等.在实际业务场景中,可以使用消息中间件如RabbitMQ.RocketMQ.Kafka等来解决.假如对高可用 ...