微信小程序 - Code 授權登錄


前言

微信小程序AppID和AppSecret一起使用可調用微信公眾接口能力,這里介紹通過 wx.login() 拿到code,將code傳到后台服務器, 后台服務器結合小程序的 appid 和 appsecret 去請求微信服務器拿到用戶的 openid 進行自己的業務邏輯處理。


環境

SpringBoot + 小程序


具體實現

小程序

  • index.wxml
<button type='primary' open-type='getUserInfo' bindgetuserinfo='doCodeLogin'>微信登錄</button>
  • index.js
Page({
  doCodeLogin() {
    // code
    wx.login({
      success: (res) => {
        if (res.code) {
          wx.request({
            url: 'http://localhost:8081/v1/login/codeLogin?code=' + res.code,
            method: 'POST',
            success: (res) => {
            
           	  // Login Success TO DO
           	  
              console.log(res.data)
              wx.setStorageSync('userData', res.data)
              wx.redirectTo({
                url: '../index/index'
              })
            }
          })
        }
      }
    })
  }
}

SpringBoot

  • application.yml
wechat:
  appid: 小程序APPID
  appsecret: 小程序Secret
  code2session: https://api.weixin.qq.com/sns/jscode2session?appid={0}&secret={1}&js_code={2}&grant_type=authorization_code
  • LoginController.java
@RestController
@RequestMapping("/login")
public class LoginController {

    @Value("${wechat.code2session}")
    private String code2SessionUrl;

    @Value("${wechat.appid}")
    private String appid;

    @Value("${wechat.appsecret}")
    private String appsecret;

    @Autowired
    private ObjectMapper mapper;

    @Autowired
    private UserRepository userRepository;

    /**
     * code登陸
     * @param code
     * @return
     */
    @PostMapping("codeLogin")
    public UnifyMessage codeLogin(@RequestParam String code) {
        /**
         * code2Session 接口Url 拼接
         * code2Session開發者服務器使用臨時登錄憑證code獲取 session_key、
         * 用戶userid以及用戶所在企業的corpid等信息。
         * https://work.weixin.qq.com/api/doc/90000/90136/91507
         */
        String url = MessageFormat.format(this.code2SessionUrl, this.appid, this.appsecret, code);
        
        RestTemplate rest = new RestTemplate();
        String sessionText = rest.getForObject(url, String.class);

        /**
         * code2Session 接口 返回值
         */
        Map<String, Object> codeLoginResp = new HashMap<>();

        try {
            /**
             * codeLoginResp 格式如下
             * {
             * 	"session_key": "oImL2VXoGLMvae/5bsgJkA==",
             * 	"openid": "oBfjq4p7h0kuQEV4_mYRtNj1FX8s"
             * }
             */
            codeLoginResp = mapper.readValue(sessionText, Map.class);

        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }

        /**
         * 獲取用戶openId
         */
        String openid = codeLoginResp.getOrDefault("openid", "").toString();

        if (StringUtils.isEmpty(openid)) {
            throw new UnPermissionException("Code登陸失敗");
        }

        /**
         * 業務邏輯處理。。。
         */
        Optional<User> userOptional = userRepository.findByOpenid(openid);

        if (userOptional.isPresent()) {
            // TODO: Login success
            return new UnifyMessage(0, "登陸成功", "");
        } else {
            // TODO: Login failed
        }

        return null;
    }

}
  • 登錄調用

在這里插入圖片描述


- End -
夢想是咸魚
關注一下吧


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM