原生(非云开发)微信小程序如何获取openId和session_key

本人也是一名小白。打算用java来开发小程序的后端。于是乎去了小程序的官方文档看了一下。原生开发好像挺麻烦,想要的得到一些数据还需要经过解密。流程大概就是如下这样。[此图来自小程序的官方文档]此图地址
在这里插入图片描述

大概就是:前端调用wx.getUserProfile得到encryptedData、iv传给后端,然后前端调用wx.login得到一个code作为登录凭证,将这个code传给后端,后端再利用这个code、自己的appId和secret和一个地址发送请求微信的校验就能够得到session_key和openId,接着后端通过encryptedData、iv、session_key三者就可以进行解密,拿到解密的数据。

首先我一开始没搞懂这个流程,一直以为openId是通过解密获得的,然后我就查了两天资料,都不知道如何通过解密得到openId。没办法只能硬着头破试一下。最后发现原来openId并不需要解密。。。。所以到最后其实我并没有用到解密这一个操作。因为我的小程序只是需要一些简单的数据而已。

下面附上我的测试代码[仅仅用来测试]

html代码

<button class="info_left_text_name" open-type="getUserInfo" lang="zh_CN" bindtap="getUserProfile">登录</button>

js代码

    // 获取code、userInfo等信息
    getUserProfile() {
    
    
      var that = this;
      wx.getUserProfile({
    
    
        desc: '用于获取用户个人信息',
        success: function (detail) {
    
    
          that.setData({
    
    
            userInfo: detail.userInfo, // 设置用户信息
            hasUserInfo: true,
          }),
          // 输出getUserProfile得到的数据
          console.log(detail)
          wx.login({
    
    
            success: ress => {
    
    
              var code = ress.code; //登录凭证
              wx.request({
    
    
                url: "", //自己的服务接口地址
                method: 'post',
                header: {
    
    
                  'content-type': 'application/x-www-form-urlencoded'
                },
                // 传递给后端
                data: {
    
    
                  nickName: detail.userInfo.nickName, // 用户昵称
                  avatarUrl: detail.userInfo.avatarUrl, // 用户头像地址
                  code: code, // 登录凭证
                },
                success: (res) => {
    
    
                  console.log("res:", res.data)
                },
                fail: function () {
    
    
                  console.log('系统错误')
                }
              })
            }
          });
        }
      })
    },

springboot依赖包

		<!--Json转换-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.78</version>
        </dependency>
		<!--发送请求工具类-->
		<dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.16</version>
        </dependency>

后端java代码

@RestController
@RequestMapping("/user")
public class UserController {
    
    

    @Autowired
    private UserService userService;
    
    // 这部分数据自己写即可
    @Autowired
    private StaticDataUtil staticDataUtil;

    @PostMapping("/login")
    public Result login(@RequestParam(value = "code") String code,
                        @RequestParam("nickName") String nickName,
                        @RequestParam("avatarUrl") String avatarUrl) throws Exception {
    
    

        String appId = staticDataUtil.getAppId();
        String secret = staticDataUtil.getSecret();
        String codeUrl = staticDataUtil.getCodeUrl();
        String url = codeUrl.replace("{1}", appId).replace("{2}", secret).replace("{3}", code);
        String str = HttpUtil.get(url); // 发送请求得到结果为字符串
        JSONObject res = JSONObject.parseObject(str); // 转为json格式方便取数据
        System.out.println(res); // 输出查看一下结果
        String openId = res.getString("openid");
        String session_key = res.getString("session_key");
        HashMap<String, String> hashMap = new HashMap<>();
        hashMap.put("openid", openId);
        hashMap.put("session_key", session_key);
        return Result.success(hashMap); // 返回给前端
    }
}

补充一下CodeUrl

https://api.weixin.qq.com/sns/jscode2session?appid={
    
    1}&secret={
    
    2}&js_code={
    
    3}&grant_type=authorization_code

猜你喜欢

转载自blog.csdn.net/weixin_51993595/article/details/121691185