加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 资源网站 > 资源 > 正文

微信小程序后端开发流程

发布时间:2020-12-14 19:05:18 所属栏目:资源 来源:网络整理
导读:1、前端调用 wx.login 返回了code,然后调用wx.getUserInfo获取到用户的昵称 头像 2、服务端根据code去微信获取openid, 接口地址:?developers.weixin.qq.com/miniprogram… 微信小程序后端接口开发 controller层 public class OauthController { @Autowire

1、前端调用 wx.login 返回了code,然后调用wx.getUserInfo获取到用户的昵称 头像 2、服务端根据code去微信获取openid, 接口地址:?developers.weixin.qq.com/miniprogram…

微信小程序后端接口开发

controller层

public class OauthController {

    @Autowired
    private WeChatService weChatService;

    /**
     * 微信授权用js_code换取openId
     * @param code
     * @return
     */
    @GetMapping("/code2Session")
    public BaseResponse code2Session(String code) {
        log.info("code2Session,code={}",code);
        if (StringUtil.isEmpty(code)) {
            return BaseResponse.buildFail("参数异常");
        }
        Code2SessionResponse res = weChatService.code2Session(code);
        log.info(,res);
        if (!res.isSuccess()) {
            return BaseResponse.buildFail(res.getErrCode(),res.getErrMsg());
        }
        return BaseResponse.buildSuccess(res);
    }


 /**
     * 解密获取手机号
     * @param request
     * @param response
     * @param param
     * @return
     */
    public BaseResponse decryptGetPhone(HttpServletRequest request,HttpServletResponse response,@RequestBody OauthParam param) {
   
            if (!StringUtil.isEmpty(param.getOpenId())) {//微信授权登录
                String sessionKey = weChatService.getSessionKey(param.getOpenId());
                if (StringUtil.isEmpty(sessionKey)) {
                    "会话不存在");
                }
                Sha1Utils sha = new Sha1Utils();
                // 获取用户信息
                log.debug("微信登陆 sessionKey = {}",sessionKey);
                String userInfoStr = sha.decryptWXAppletInfo(sessionKey,param.getEncryptedData(),param.getIv());
                if (StringUtil.isEmpty(userInfoStr)) {
                    "无法获取用户信息");
                }
                JSONObject json = JSONObject.parSEObject(userInfoStr);
                //绑定微信的手机号
                String tel = json.getString("purePhoneNumber");
                Assert.isTrue(!StringUtils.isEmpty(tel),"无法获取用户手机号");
                BaseResponse baseResponse=new BaseResponse();
                baseResponse.setResultInfo(tel);
                baseResponse.setState(0);
                return baseResponse;
            }

    }
}
复制代码

接口

实现类
public WeChatServiceImpl implements WeChatService {

    //获取配置文件数据
    @Value("${wechat.miniprogram.id}")
    private String appId;

    ${wechat.miniprogram.secret}")
    private String appSecret;

    @Reference
    private SysUserService sysUserService;


    @Override
    public Code2SessionResponse code2Session(String code) {
        String rawResponse = HttpClientUtil
                .get(String.format(WechatConstant.URL_CODE2SESSION,appId,appSecret,code));
        log.info("rawResponse====={}",rawResponse);
        Code2SessionResponse response = JSON.parSEObject(rawResponse,Code2SessionResponse.class);
        if (response.isSuccess()) {
            cacheSessionKey(response);
        }
        return response;
    }

    private void cacheSessionKey(Code2SessionResponse response) {
        RedisCache redisCache = RedisCache.getInstance();
        String key = RedisCacheKeys.getWxSessionKeyKey(response.getOpenId());
        redisCache.setCache(key,2147483647,response.getSessionKey());
    }

    @Override
    public String getAccessToken() {
        return getAccessToken(false);
    }

    String getAccessToken(boolean isForce) {
        RedisCache redisCache = RedisCache.getInstance();
        String accessToken = null;
        if (!isForce) {
            accessToken = redisCache.getCache(RedisCacheKeys.getWxAccessTokenKey(appId));
        }
        if (StringUtil.isNotEmpty(accessToken)) {
            return accessToken;
        }
        String.format(WechatConstant.URL_GET_ACCESS_TOKEN,appSecret));
        AccessTokenResponse response = JSON.parSEObject(rawResponse,AccessTokenResponse.class);
        log.info("getAccessToken:response={}",response);
        if (response.isSuccess()) {
            redisCache.setCache(RedisCacheKeys.getWxAccessTokenKey(appId),0);">7000,response.getAcessToken());
            return response.getAcessToken();
        }
        return null;
    }


    String getSessionKey(String openId) {
        RedisCache redisCache = RedisCache.getInstance();
        String key = RedisCacheKeys.getWxSessionKeyKey(openId);
        String sessionKey = redisCache.getCache(key);
        return sessionKey;
    }
}
复制代码

用到的解密工具类

网络请求工具类
常量
使用到的实体类
总结:微信小程序的后端开发主要就是对用户进行授权 , 1、前端调用 wx.login 返回了code,然后调用wx.getUserInfo获取到用户的昵称 头像 2.首先通过微信授权用js_code换取openId,来获取openId,前端传微信的参数 code字段 3.然后解密获取手机号 前端需要传openId encryptedData iv 等字段来获取用户的的授权手机号

这些信息都获取后 接着就是调用后端的登陆接口,登陆接口如果只有授权登录就是我们将接口参数为下图最后三个字段为前端必填字段

主要步骤是根据前端的openId获取sessionKey 然后根据sessionKey 和其他参数进行解密获取用户手机号

通过解密获取授权登录的手机号,然后根据自己的业务逻辑处理即可,这样我们就可以根据授权的手机号进行授权登录

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读