国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

微信公眾平臺開發(fā)(四)——微信網(wǎng)頁授權(quán):獲取用戶openid&用戶基本信息

這篇具有很好參考價值的文章主要介紹了微信公眾平臺開發(fā)(四)——微信網(wǎng)頁授權(quán):獲取用戶openid&用戶基本信息。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

微信網(wǎng)頁授權(quán)

在開發(fā)中,如果web產(chǎn)品需要使用到微信的功能,比如微信授權(quán)登錄、微信支付、微信投票等,我是開發(fā)的東東是一個web項目,然而如果需要接入微信的話,就需要使用道微信的微信網(wǎng)頁開發(fā)相關(guān)的功能。
其中我們需要的東西就是拿到微信服務(wù)器的回調(diào),比如用戶掃碼登錄我們的web項目時,用戶正確授權(quán)之后,微信服務(wù)器能回調(diào)到我們期望的url并且返回相應(yīng)的參數(shù)信息。

網(wǎng)頁授權(quán)流程分為四步:

  1. 引導(dǎo)用戶進(jìn)入授權(quán)頁面同意授權(quán),獲取code
  2. 通過code換取網(wǎng)頁授權(quán)access_token(與基礎(chǔ)支持中的access_token不同)
  3. 如果需要,開發(fā)者可以刷新網(wǎng)頁授權(quán)access_token,避免過期
  4. 通過網(wǎng)頁授權(quán)access_token和openid獲取用戶基本信息(支持UnionID機(jī)制)
    具體的接口和參數(shù)說明參考官方文檔:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html

其中需要注意的時: 第一步獲取code時,scope參數(shù)的設(shè)置,當(dāng)scope參數(shù)值為snsapi_base時 (不彈出授權(quán)頁面,直接跳轉(zhuǎn),只能獲取用戶openid),當(dāng)scope參數(shù)值為snsapi_userinfo時 (彈出授權(quán)頁面,可通過openid拿到昵稱、性別、所在地。并且, 即使在未關(guān)注的情況下,只要用戶授權(quán),也能獲取其信息 )

微信網(wǎng)頁授權(quán)開發(fā)步驟

這里我直接貼開發(fā)及代碼步驟:
0. 在微信公眾號后臺配置域名
需要注意的是只有微信認(rèn)證的服務(wù)號才有微信網(wǎng)頁授權(quán)的權(quán)限。
在開發(fā)的時候我們可以使用申請的測試號進(jìn)行調(diào)試開發(fā),測試號擁有大部分服務(wù)號有的接口權(quán)限。
然后需要在這兩個地方設(shè)置JS接口的安全域名(開發(fā)階段可以使用內(nèi)網(wǎng)穿透域名):
第一處:
前端如何獲取微信openid,java,服務(wù)器,微信,微信公眾平臺,spring boot

第二處(向下拉):
前端如何獲取微信openid,java,服務(wù)器,微信,微信公眾平臺,spring boot

分別設(shè)置好就可以使用安全域名開始開發(fā)了

在后端寫代碼時,一般會使用官方的SDK:weixin-java-mp(如果向官網(wǎng)那樣每一個步驟發(fā)送請求拼接參數(shù)真的太不友好了)

  1. 引入下面坐標(biāo)
        <!--微信開發(fā)sdk-->
        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-mp</artifactId>
            <version>2.7.0</version>
        </dependency>
  1. 在配置文件application.yml中加入
wechat:
  mpAppId: wx90a9158b6acc5584
  mpAppSecret: ec23a5d78f12afa569c64794570d753c
  // 后端項目回調(diào)地址
  projecturl: http://uhi4iv.natappfree.cc/
  1. 編寫兩個配置文件注入spring
    WechatAccountConfig.java
package cn.kt.mywxdemo.wechatmp.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * Created by tao.
 * Date: 2023/3/21 15:02
 * 描述:
 */

@Data
@Component
//從配置文件里獲取
@ConfigurationProperties(prefix = "wechat")
public class WechatAccountConfig {

    /**
     * 公眾平臺id
     */
    private String mpAppId;

    /**
     * 公眾平臺密鑰
     */
    private String mpAppSecret;

    /**
     * 微信模版id
     */
    private Map<String, String> templateId;
}

WechatMpConfig.java

package cn.kt.mywxdemo.wechatmp.config;


import me.chanjar.weixin.mp.api.WxMpConfigStorage;
import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
/**
 * Created by tao.
 * Date: 2023/3/21 15:00
 * 描述:
 */

@Component
public class WechatMpConfig {

    @Autowired
    private WechatAccountConfig accountConfig;

    /**
     * @author :tao
     * @date :Created in 2021/3/12 10:15
     * @param: :
     * @return: WxMpService 對象
     * 配置wxMpConfigStorage,返回 WxMpService 對象
     */
    @Bean
    public WxMpService wxMpService() {
        WxMpService wxMpService = new WxMpServiceImpl();
        wxMpService.setWxMpConfigStorage(wxMpConfigStorage());
        return wxMpService;
    }

    /**
     * @author :tao
     * @date :Created in 2021/3/12 10:20
     * @param: :
     * @return: WxMpConfigStorage 對象
     * 配置AppId、和AppSecret,獲取WxMpConfigStorage 對象
     */
    @Bean
    public WxMpConfigStorage wxMpConfigStorage() {
        WxMpInMemoryConfigStorage wxMpConfigStorage = new WxMpInMemoryConfigStorage();
        wxMpConfigStorage.setAppId(accountConfig.getMpAppId());
        wxMpConfigStorage.setSecret(accountConfig.getMpAppSecret());
        return wxMpConfigStorage;
    }
}
  1. 編寫和微信服務(wù)器交互的controller
    WxJsController.java
package cn.kt.mywxdemo.wechatmp.controller;

import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
import me.chanjar.weixin.mp.bean.result.WxMpUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

/**
 * Created by tao.
 * Date: 2023/3/21 15:04
 * 描述:
 */

@Controller
@RequestMapping("/wechat")
@Slf4j
public class WxJsController {

    @Autowired
    private WxMpService wxMpService;

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

    @GetMapping("/auth")
    @ResponseBody
    public String auth(@RequestParam(value = "echostr", defaultValue = "沒有獲取到") String echostr) {
        return echostr;
    }


    /**
     * @author :tao
     * @param: :
     * @return: 重定向到獲取用戶信息的類
     * 微信授權(quán)登錄
     */
    @GetMapping("/authorize")
    public String authorize(@RequestParam(value = "returnUrl", defaultValue = "https://qkongtao.cn/") String returnUrl) throws UnsupportedEncodingException {
        log.info("【微信網(wǎng)頁授權(quán)】進(jìn)來了,參數(shù)={}", returnUrl);
        System.out.println("進(jìn)來了:" + returnUrl);
        //1. 配置
        //2. 調(diào)用方法
        String url = projectUrl + "wechat/userInfo";
        /*
         * 相當(dāng)于這種形式
         * URLEncoder.decode(returnUrl,"UTF-8"
         * https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
         */
        String redirectUrl = wxMpService.oauth2buildAuthorizationUrl(url, WxConsts.OAUTH2_SCOPE_USER_INFO, URLEncoder.encode(returnUrl, "utf-8"));
        log.info("【微信網(wǎng)頁授權(quán)】獲取code,result={}", redirectUrl);
        return "redirect:" + redirectUrl;
    }

    /**
     * @author :tao
     * @param: :
     * @return: 重定向
     * 獲取用戶信息類,最后重定向到指定url
     */
    @GetMapping("/userInfo")
    public String userInfo(@RequestParam("code") String code,
                           @RequestParam("state") String returnUrl) throws WxErrorException {
        /*當(dāng)用戶同意授權(quán)后,會回調(diào)所設(shè)置的url并把authorization code傳過來,
        然后用這個code獲得access token,其中也包含用戶的openid等信息*/
        WxMpOAuth2AccessToken wxMpOAuth2AccessToken = new WxMpOAuth2AccessToken();
        try {
            //獲取access token
            wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(code);
            log.info("【AccessToken:】{}", wxMpOAuth2AccessToken.getAccessToken());
        } catch (WxErrorException e) {
            log.error("【微信網(wǎng)頁授權(quán)】{}", e);
        }

        // 拿到openid
        String openId = wxMpOAuth2AccessToken.getOpenId();
        log.info("【openid:】{}", openId);
        log.info("【我是前端要回調(diào)的地址:】{}", returnUrl + "&openid=" + openId);
        // 順便獲取一下用戶信息
        WxMpUser wxMpUser = wxMpService.oauth2getUserInfo(wxMpOAuth2AccessToken, "zh_CN");
        log.info("【用戶信息:】{}", wxMpUser.toString());

        //注意拼接參數(shù),第一個參數(shù)需要加問號,之后參數(shù)使用&拼接的問題
        //return "redirect:" + returnUrl + "/#/?openid=" + openId;
        return "redirect:" + returnUrl + "&openid=" + openId;
    }
}

運行結(jié)果

上述代碼已經(jīng)處理好了微信授權(quán)的流程,我們調(diào)用只需要使用/authorize接口,并且傳入回調(diào)url(授權(quán)之后需要重定向的路徑)即可進(jìn)行授權(quán)
示例如下
uhi4iv.natappfree.cc為后臺綁定域名
http://uhi4iv.natappfree.cc/wechat/authorize?returnUrl=https://qkongtao.cn?1=1

使用微信打開結(jié)果:
前端如何獲取微信openid,java,服務(wù)器,微信,微信公眾平臺,spring boot

由于我已經(jīng)剛剛授權(quán)過了,就進(jìn)行了靜默授權(quán)。否則將彈出授權(quán)選項需要用戶確認(rèn)。
前端如何獲取微信openid,java,服務(wù)器,微信,微信公眾平臺,spring boot

獲取用戶openid和用戶基本信息

需要提前說明:

  1. 在網(wǎng)頁授權(quán)中的openid和基礎(chǔ)公眾號關(guān)注后得到的openid的是不一樣的
  2. 網(wǎng)頁授權(quán)access_token和普通access_token的區(qū)別
  • 微信網(wǎng)頁授權(quán)是通過OAuth2.0機(jī)制實現(xiàn)的,在用戶授權(quán)給公眾號后,公眾號可以獲取到一個網(wǎng)頁授權(quán)特有的接口調(diào)用憑證(網(wǎng)頁授權(quán)access_token),通過網(wǎng)頁授權(quán)access_token可以進(jìn)行授權(quán)后接口調(diào)用,如獲取用戶基本信息;
  • 其他微信接口,需要通過基礎(chǔ)支持中的“獲取access_token”接口來獲取到的普通access_token調(diào)用。
  1. 在關(guān)注者與公眾號產(chǎn)生消息交互后,公眾號可獲得關(guān)注者的openid(加密后的微信號,每個用戶對每個公眾號的openid是唯一的。對于不同公眾號,同一用戶的openid不同)。公眾號可通過本接口來根據(jù)openid獲取用戶基本信息,包括語言和關(guān)注時間。
  2. UnionID機(jī)制說明:開發(fā)者可通過openid來獲取用戶基本信息。特別需要注意的是,如果開發(fā)者擁有多個移動應(yīng)用、網(wǎng)站應(yīng)用和公眾帳號,可通過獲取用戶基本信息中的unionid來區(qū)分用戶的唯一性,因為只要是同一個微信開放平臺帳號下的移動應(yīng)用、網(wǎng)站應(yīng)用和公眾帳號,用戶的unionid是唯一的。換句話說,同一用戶,對同一個微信開放平臺下的不同應(yīng)用,unionid是相同的。
  3. 目前基礎(chǔ)公眾號關(guān)注后獲取到openid,后臺是無法根據(jù)openid和access_token獲取到用戶頭像、昵稱信息、地址等信息;必須通過OAuth2.0機(jī)制的微信網(wǎng)頁授權(quán),在用戶確認(rèn)授權(quán)之后才可以獲取到用戶頭像、昵稱信息、地址等信息。

網(wǎng)頁授權(quán)獲取用戶信息

參考官方文檔:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html#3

如果網(wǎng)頁授權(quán)作用域為snsapi_userinfo,則此時開發(fā)者可以通過access_token和openid拉取用戶信息了。

請求方法:

http:GET(請使用https協(xié)議):
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

參數(shù)說明:
前端如何獲取微信openid,java,服務(wù)器,微信,微信公眾平臺,spring boot

請求結(jié)果:
前端如何獲取微信openid,java,服務(wù)器,微信,微信公眾平臺,spring boot

昵稱亂碼需要使用utf8重新編碼:String result = new String(nickname, “utf-8”);

在上面的controller中也順便把用戶信息也進(jìn)行獲取了一下:
前端如何獲取微信openid,java,服務(wù)器,微信,微信公眾平臺,spring boot

后臺輸出結(jié)果如下:
前端如何獲取微信openid,java,服務(wù)器,微信,微信公眾平臺,spring boot

基礎(chǔ)公眾號關(guān)注獲取用戶信息

官方文檔:https://developers.weixin.qq.com/doc/offiaccount/User_Management/Get_users_basic_information_UnionID.html#UinonId

其實和上面差不多,也是通過openid和access_token換取用戶信息
接口如下:
接口調(diào)用請求說明 http請求方式: GET https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
參數(shù)說明:
前端如何獲取微信openid,java,服務(wù)器,微信,微信公眾平臺,spring boot

結(jié)果如下:
前端如何獲取微信openid,java,服務(wù)器,微信,微信公眾平臺,spring boot

可以看出相比較微信網(wǎng)頁授權(quán),基礎(chǔ)公眾號關(guān)注可獲取用戶信息相對少了很多。

源碼下載

源碼鏈接:https://gitee.com/qkongtao/my-wx-demo文章來源地址http://www.zghlxwxcb.cn/news/detail-591722.html

到了這里,關(guān)于微信公眾平臺開發(fā)(四)——微信網(wǎng)頁授權(quán):獲取用戶openid&用戶基本信息的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包