关于小程序微信登录后端设计的一点分享

我们知道微信小程序对于微信登录的设计其实是给到了一个微信login的功能接口,其中响应成功会返回一个临时凭证码(时间大概是5分钟)code,这个临时的凭证码是从https://api.weixin.qq.com/sns/jscode2session获取openId的必带参数。下图示微信登录过程的时序图:

 这里我们只介绍到第三方服务器得到openId与session_key之前的处理,至于后面的做登录态校验的业务和大家自己的需求有关,一般情况下自己测试着玩,不需要加上图片上说的加密算法进行登录态的小程序缓存存储。

1、获取code,直接在小程序某一个按钮触发事件添加JS函数,函数内部加上类似代码:

wx.login(){

        success(res){

                wx.request(){

                        url: ‘第三方服务器的url(本地跑后端项目的话就是本地ip与端口)’

                        ......省略header与method

                        data:{

                                code: res.data.code

                                }       

                        ......省略登录获取响应的判断方法

                }

        }

}

2、wx.request()请求已经发出,第三方服务器进行响应,处理逻辑:

requestUtils.getWeChatOPenId(appinfo.getAppId(), appinfo.getAppSecrtet(), code);

直接将需要的参数获取给到处理方法,方法返回的是openId的值。

我们来看这个处理的方法:

/**
 * 请求工具类封装请求方法
 */
@Component
public class RequestUtils {
    /**
     * 获取微信小程序openid
     *
     * @param AppId     小程序Id
     * @param AppSecret 小程序密钥
     * @param code      小程序wx.login接口返回的临时的临时状态码
     * @return openid
     */
    public  String getWeChatOPenId(String AppId, String AppSecret, String code) {
        try {
            /*1.拼接微信登录获取openId所需要访问的URL*/
            StringBuilder URL = new StringBuilder(WeChatConfig.loginUrl).append("?appId=").append(AppId).
                    append("&secret=").append(AppSecret).append("&js_code=").append(code).
                    append("&grant_type=authorization_code");
            /*2.创建http连接的客户端对象*/
            BasicHttpClientConnectionManager connectionManager;
            connectionManager = new BasicHttpClientConnectionManager(
                    RegistryBuilder.<ConnectionSocketFactory>create().
                            register("http", PlainConnectionSocketFactory.getSocketFactory())
                            .register("https", SSLConnectionSocketFactory.getSocketFactory())
                            .build(), null, null, null
            );
            CloseableHttpClient httpClient = HttpClientBuilder.create().
                    setConnectionManager(connectionManager)
                    .build();
            HttpGet httpGet = new HttpGet(URL.toString());
            /*3.执行访问一次请求获取响应体内容*/
            HttpResponse httpResponse = httpClient.execute(httpGet);
            HttpEntity entity = httpResponse.getEntity();
            String s = EntityUtils.toString(entity, "UTF-8");
            JSONObject jsonObject = new JSONObject(s);
            /*4.从响应体中拿到openId并返回*/
            return jsonObject.get("openid").toString();
        } catch (Exception e) {
            System.out.println("---------小程序获取微信登录openId异常--------");
            e.printStackTrace();
        }
        /*出现异常即返回null*/
        return null;
    }

}

其中的四步处理法,但是这样做出来的微信登录处理逻辑,我觉得耗时上是一个问题。目前还没有很好的优化方案。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ForestSpringH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值