【微信小程序】实现微信小程序登录(附源码)后端,微信小程序获取手机号

这篇具有很好参考价值的文章主要介绍了【微信小程序】实现微信小程序登录(附源码)后端,微信小程序获取手机号。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

登录简介

第一步:获取token

第二步:通过token拿用户信息

第三步:调用接口获取手机号

HttpClientUtil:

WeChatUtil:

controller层:

service层:

serviceImpl层:

登录简介

       新版本微信小程序登录是前端获取用户信息,不再是后端获取信息进行保存。所以后端要做的主要流程就是生成token,然后通过token查看数据库用户信息有没有手机号,有的话返回给前端,没有就去调用获取手机号接口。大致分为这三步。

第一步:获取token

      前端通过调取vx.login拿到code,将code传给后端,后端将code进行解析出session_key、openid、unionid,然后生成token,将以上信息进行保存。(我这里是将token作为字段进行存储,利用session_key和openid加密生成)

第二步:通过token拿用户信息

第三步:调用接口获取手机号

      这也是至关重要的一步,如果第二步获取用户信息中没有手机号(这里前端判断),后端就去获取手机号,前端传给后端code,后端解析code拿到手机号,再通过heahers拿到token,根据token去数据库把手机号存到对应的人员信息里。

上代码!!!!!!

HttpClientUtil:
public class HttpClientUtil {
 
    final static int TIMEOUT = 1000;
 
    final static int TIMEOUT_MSEC = 5 * 1000;
 
    public static String doPost(String url, Map<String, String> paramMap) throws IOException {
        // 创建Httpclient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        //创建响应对象
        CloseableHttpResponse response = null;
        String resultString = "";
        try {
            // 创建Http Post请求
            HttpPost httpPost = new HttpPost(url);
            // 创建参数列表
            if (paramMap != null) {
                List<NameValuePair> paramList = new ArrayList<>();
                for (Map.Entry<String, String> param : paramMap.entrySet()) {
                    paramList.add(new BasicNameValuePair(param.getKey(), param.getValue()));
                }
                // 模拟表单
                UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
                httpPost.setEntity(entity);
            }
            httpPost.setConfig(builderRequestConfig());
            // 执行请求
            response = httpClient.execute(httpPost);
 
            resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
        } catch (Exception e) {
            throw new IOException("HttpClientUtil工具类执行请求失败---" + e);
        } finally {
            try {
                response.close();
            } catch (IOException e) {
                throw new IOException("HttpClientUtil工具类关闭响应资源失败---" + e);
            }
        }
        return resultString;
    }
 
    private static RequestConfig builderRequestConfig() {
        return RequestConfig.custom()
                .setConnectTimeout(TIMEOUT_MSEC)
                .setConnectionRequestTimeout(TIMEOUT_MSEC)
                .setSocketTimeout(TIMEOUT_MSEC).build();
    }
}
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.16</version>
</dependency>
WeChatUtil:

这里是获取手机号所用到的公共类,导包用的都是hutool的

public class WeChatUtil {
    /**
     * 请求微信接口服务,获取小程序全局唯一后台接口调用凭据(access_token)
     * https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html
     *
     * @param appid
     * @param secretKey
     * @return
     */
    public static JSONObject getAccessToken(String appid, String secretKey) {
        String result = null;
        try {
            String baseUrl = "https://api.weixin.qq.com/cgi-bin/token";
            HashMap<String, Object> requestParam = new HashMap<>();
            // 小程序 appId
            requestParam.put("grant_type", "client_credential");
            // 小程序唯一凭证id appid
            requestParam.put("appid", appid);
            // 小程序 appSecret
            requestParam.put("secret", secretKey);
            // 发送GET请求读取调用微信接口获取openid用户唯一标识
            result = HttpUtil.get(baseUrl, requestParam);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return JSONUtil.parseObj(result);
    }
 
    /**
     * 请求微信接口服务,用code换取用户手机号(每个code只能使用一次,code的有效期为5min)
     * https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/phonenumber/phonenumber.getPhoneNumber.html
     *
     * @param code
     * @param accessToken
     * @return
     */
    public static JSONObject getPhoneNumber(String code, String accessToken) {
        String result = null;
        try {
            // 接口调用凭证:accessToken
            String baseUrl = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + accessToken;
            HashMap<String, Object> requestParam = new HashMap<>();
            // 手机号调用凭证
            requestParam.put("code", code);
            // 发送post请求读取调用微信接口获取openid用户唯一标识
            String jsonStr = JSONUtil.toJsonStr(requestParam);
            HttpResponse response = HttpRequest.post(baseUrl)
                    .header(Header.CONTENT_ENCODING, "UTF-8")
                    // 发送json数据需要设置contentType
                    .header(Header.CONTENT_TYPE, "application/x-www-form-urlencoded")
                    .body(jsonStr)
                    .execute();
            if (response.getStatus() == HttpStatus.HTTP_OK) {
                result = response.body();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return JSONUtil.parseObj(result);
    }
}

ApiResponseBody是我封装的统一返回接口,需要替换掉!!!!!

controller层:
@RestController
@RequestMapping("wechat/login")
public class LoginController {
    @Resource
    WechatService wechatService;
    @Resource
    WechatUserService wechatUserService;

    /**
     * 登录
     * @param code
     * @return
     * @throws Exception
     */
    @ApiOperation(value = "登录", notes = "post请求,登录")
    @PostMapping(value = "/getToken")
    public ApiResponseBody login(@RequestParam("code") String code) throws Exception {

        return wechatService.getUserInfoMap(code);
    }

    /**
     * 获取用户信息
     * @param token
     * @return
     */
    @ApiOperation(value = "获取用户信息", httpMethod = "POST")
    @GetMapping(value = "/getUserDetailByToken")
    public ApiResponseBody getUserDetailByToken(@RequestHeader("token") String token) {

        return wechatUserService.getUserDetailByToken(token);
    }

    /**
     *获取用户手机号
     * @param
     * @return
     */
    @ApiOperation(value = "获取用户手机号", httpMethod = "POST")
    @PostMapping("/getPhoneNumber")
    public ApiResponseBody getPhoneNumber(HttpServletRequest request, @RequestParam("code") String code) {

        return wechatService.getPhoneNumber(code,request);
    }
}
service层:
public interface WechatService {
    ApiResponseBody getUserInfoMap(String code) throws Exception;

    ApiResponseBody getPhoneNumber(String code, HttpServletRequest request);
}
public interface WechatUserService {
    List<Map<String, Object>> getByOpenId(String openId);

    ApiResponseBody getUserDetailByToken(String token);
    
    void update(Map<String, Object> user);

    void saveUser(Map<String, Object> userMap);

    void saveDictId(List<Map<String, Object>> dictMapList);

    void savePhoneNumber(Map<String, Object> bodyMap);
}
serviceImpl层:

这里注意第一个接口JSONObject 导的是fastjson的包,获取手机号那里用的是hutool的包

@Service
@Slf4j
public class WechatServiceImpl implements WechatService {

    @Resource
    private RedisTemplate redisTemplate;
    @Resource
    private WechatUserService wechatUserService;

    private static final String REQUEST_URL = "https://api.weixin.qq.com/sns/jscode2session";
    private static final String GRANT_TYPE = "authorization_code";
    private static final String APPID = "";
    private static final String SECRET = "";

  
    @Override
    @Transactional(rollbackFor = Exception.class)
    public ApiResponseBody getUserInfoMap(String code) throws Exception {
        JSONObject sessionKeyOpenId = getSessionKeyOrOpenId(code);
        Assert.isTrue(sessionKeyOpenId != null, "code解析错误");
 
        // 获取openId && sessionKey && UnionID
        String openId = sessionKeyOpenId.getString("openid");
        Assert.isTrue(openId != null, "openId为空");
        String sessionKey = sessionKeyOpenId.getString("session_key");
        String unionID = sessionKeyOpenId.getString("UnionID");

        // 根据openid查询用户
        List<Map<String, Object>> user = wechatUserService.getByOpenId(openId);
        String tokenData = openId + sessionKey;
        String token = getToken(tokenData);
        List<Map<String, Object>> dictMapList = new ArrayList<>();
        Map<String, Object> userMap = new HashMap<>();
        userMap.put("openId", openId );
        userMap.put("token", token);
        userMap.put("unionId", unionID);
       

        //如果不存在用户就去添加,存在就修改token
        if (user.size() == 0) {
            wechatUserService.saveUser(userMap);
        } else {
            wechatUserService.update(userMap);
        }
        return ApiResponseBody.defaultSuccess(token);
    }

    @Override
    public ApiResponseBody getPhoneNumber(String code, HttpServletRequest request) {
        // 1.请求微信接口服务,获取accessToken
        cn.hutool.json.JSONObject accessTokenJson = WeChatUtil.getAccessToken(APPID, SECRET);
        String accessToken = accessTokenJson.get("access_token",String.class);
        // 2.请求微信接口服务,获取用户手机号信息
        cn.hutool.json.JSONObject phoneNumberJson = WeChatUtil.getPhoneNumber(code, accessToken);
        WeChatPhoneInfo phoneInfo = phoneNumberJson.get("phone_info", WeChatPhoneInfo.class);
        Map<String, Object> bodyMap = new HashMap<>();
        String token = request.getHeader("token");
        bodyMap.put("phoneNumber", phoneInfo.getPurePhoneNumber());
        bodyMap.put("token", token);
        wechatUserService.savePhoneNumber(bodyMap);

        return ApiResponseBody.defaultSuccess(phoneInfo.getPurePhoneNumber());
    }

    private JSONObject getSessionKeyOrOpenId(String code) throws Exception {
        Map<String, String> requestUrlParam = new HashMap<>();
        requestUrlParam.put("appid", APPID);
        requestUrlParam.put("secret", SECRET);
        requestUrlParam.put("js_code", code);
        // 默认参数
        requestUrlParam.put("grant_type", GRANT_TYPE);
        // 发送post请求读取调用微信接口获取openid用户唯一标识
        String result = HttpClientUtil.doPost(REQUEST_URL, requestUrlParam);
        return JSON.parseObject(result);
    }

    /**
     * 这里的 token 使用 SHA-256哈希算法生成
     * @param data
     * @return
     * @throws NoSuchAlgorithmException
     */
    private static String getToken(String data) throws NoSuchAlgorithmException {
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        byte[] hash = digest.digest(data.getBytes());
        StringBuilder hexString = new StringBuilder();

        for (byte b : hash) {
            String hex = Integer.toHexString(0xff & b);
            if (hex.length() == 1) {
                hexString.append('0');
            }
            hexString.append(hex);
        }
        return hexString.toString();
    }

}

最后还有一个WechatUserServiceImpl,这个主要做的就是增删改查的操作,所以这里就不展示了,前面说的很详细,只要按照流程一步一步走,然后写SQL就没问题。

完结撒花  欢迎评论区讨论文章来源地址https://www.toymoban.com/news/detail-855955.html

到了这里,关于【微信小程序】实现微信小程序登录(附源码)后端,微信小程序获取手机号的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序&会议OA-登录获取手机号流程&登录-小程序&导入微信小程序SDK(从微信小程序和会议OA登录获取手机号到登录小程序导入微信小程序SDK)

    目录 获取用户昵称头像和昵称 wx.getUserProfile bindgetuserinfo 登录过程 登录-小程序 wx.checkSession wx.login wx.request 后台 准备数据表 反向生成工具生成 准备封装前端传过来的数据 小程序服器配置 导入微信小程序SDK application.yml WxProperties WxConfig WxAuthController 登录-小程序 login.js user.j

    2024年02月04日
    浏览(34)
  • 微信小程序:登录授权,根据手机号获取凭证,获取用户手机号

    1.微信小程序授权 controller 层代码 wxUtils 工具类 2.微信小程序,用户手机号获取 微信小程序,根据code(code为手机号获取凭证)获取用户加密手机号 获取用户手机号方法

    2024年02月14日
    浏览(44)
  • 【微信小程序】如何获取用户手机号授权登录

    目前该接口针对非个人开发者,且完成了认证的小程序开放(不包含海外主体),也就是说只针对企业认证小程序开放。若用户举报较多或被发现在不必要场景下使用,微信有权永久回收该小程序的该接口权限。 在使用该接口时,用户可使用微信绑定手机号进行授权,也添加

    2024年02月16日
    浏览(49)
  • 微信小程序:授权登录获取手机号及获取基本信息等

    微信文档 1)需要将 button 组件 open-type 的值设置为 getPhoneNumber,当用户点击并同意之后,通过 getphonenumber 事件获取回调信息; 2)将 getphonenumber 事件回调中的动态令牌code传到开发者后台,并在开发者后台调用微信后台提供的 phonenumber.getPhoneNumber 接口,消费code来换取用户手机

    2024年02月06日
    浏览(37)
  • 微信小程序中如何获取用户手机号授权登录

    随着微信小程序的普及,许多应用程序需要用户登录才能提供更好的服务。而获取用户手机号码是验证用户身份和确保账户安全的重要步骤之一。因此,在本文中,我们将介绍如何在微信小程序中实现手机号授权登录。 首先,在小程序后台开发设置中勾选“获取手机号”选项

    2024年02月11日
    浏览(76)
  • uniapp微信小程序授权登录并获取手机号

    新版:前端要授权两次,一次获取用户信息授权码code,另外一次获取用户手机授权码code,全部传给后端。后端通过用户信息授权码获取openid,通过手机授权码获取手机号码。老版:前端传给后端授权码code和用户手机授权回调 里的iv和encryptedData给后端,后端通过code获取ope

    2024年02月11日
    浏览(68)
  • SpringBoot整合微信小程序登录获取手机号并解密

    SpringBoot+微信小程序  文章目录: 一、小程序登录获取手机号的流程 二、pom导入所需的依赖包 三、接收微信小程序的参数 四、后端发请求的util工具方法 五、获取手机号的接口 六、请求接口获取的phone_info信息 1.前端请求getPhoneNumber方法获取code传给后端接口; 2.后端接口通过

    2024年02月09日
    浏览(39)
  • 微信小程序授权登录(含获取基本信息及绑定的手机号)

    1、授权获取微信个人信息 2、调用 wx.login() 获取临时登录凭证code 3、用code调用接口换取用户唯一标识openId、用户在微信开放平台账号下的唯一标识unionId和会话密钥session_key (1)前端获取 注意点 :正常开发中不会通过这种方法获取,会通过后台获取调用微信公众平台接口获

    2024年02月09日
    浏览(35)
  • .NET6使用微信小程序授权登录,获取手机号

    1.在appsettings配置你的小程序配置信息 2.请求接口时先获取Access_token 3.授权时获取手机号 4.微信接口要求必须使用Post请求方法 //小程序官方文档 https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-info/phone-number/getPhoneNumber.html

    2024年02月13日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包