微信開發(fā)之微信網(wǎng)頁(yè)授權(quán)獲取openid

wechatOAuth_logo

不知覺間已經(jīng)接觸了幾次微信支付開發(fā),而要進(jìn)行微信支付就需要用戶的唯一標(biāo)識(shí):openid。還記得第一次獲取用戶openid的時(shí)候就踩了很多坑。這兩天又接觸了一下,想著索性就把他記錄下來(lái),也便于以后查閱

一、準(zhǔn)備工具

不管開發(fā)什么,官方的文檔應(yīng)該是第一個(gè)想到的這里把官方文檔貼出來(lái):微信網(wǎng)頁(yè)授權(quán)文檔
除此之外,我們還需要一個(gè)內(nèi)網(wǎng)穿透的工具在開發(fā)環(huán)境下讓微信能訪問到我們的域名。我使用的是natapp。此類工具網(wǎng)上有很多,大家可以自行尋找。
這里我們使用微信提供的測(cè)試賬號(hào)來(lái)作為演示

二、開始開發(fā)

內(nèi)網(wǎng)穿透就不在這里演示了,下面我們直入主題:
1.填寫網(wǎng)頁(yè)授權(quán)域名
在這篇文檔的一開始就埋了一個(gè)坑

wechatOAuth_1

這段話就是說(shuō),我們?cè)陂_發(fā)前需要在圖片中框紅的位置填入我們所要開發(fā)的域名。這里我們使用的是測(cè)試環(huán)境,所以需要在測(cè)試賬號(hào)管理頁(yè)面的這個(gè)位置填入我們自己的域名,這里要注意填入域名的規(guī)則。
wechatOAuth_2

2.文檔閱讀
接著閱讀文檔我們可以發(fā)現(xiàn)網(wǎng)頁(yè)授權(quán)有兩種scope,
snsapi_base和snsapi_userinfo。兩種scope都可以獲取到opeid,不同的是snsapi_userinfo除了openid外還可以獲取到用戶的基本信息,但是需要用戶手動(dòng)進(jìn)行確認(rèn)。
再往下閱讀我們可以看到官方文檔的授權(quán)步驟

  • 第一步:用戶同意授權(quán),獲取code
  • 第二步:通過(guò)code換取網(wǎng)頁(yè)授權(quán)access_token以及openid
  • 第三步:刷新access_token(如果需要)
  • 第四步:拉取用戶信息(需scope為 snsapi_userinfo)

我們只需要openid,所以我們只開發(fā)到第二步就好了。下面我們就按著官方步驟來(lái)開發(fā)。

3.獲取code
查看文檔后我們發(fā)現(xiàn)我們需要拼接一個(gè)url并且訪問它。url的參數(shù)文檔中寫的很清楚了。看他的例子也能看個(gè)清楚。這里比較重要的是redirect_uri。這個(gè)參數(shù)所填的是一個(gè)鏈接。我們?cè)L問url后會(huì)自動(dòng)轉(zhuǎn)發(fā)到這個(gè)鏈接并且將我們需要的code以及拼接url中的state的值作為參數(shù)。這個(gè)redirect_uri的值要填入的是我們代碼中的controller的位置。
所以這里我們需要一段代碼:

/**
 * <pre>
 * Description: wechat OAuth2.0
 * Author:      lllx
 * Version:     1.0
 * Created at:  2018/2/1
 * </pre>
 */
@RestController
@RequestMapping("/weixin")
@Slf4j
public class WeixinController {

    @GetMapping("/auth")
    public void auth(@RequestParam("code") String code,@RequestParam("state") String state){
        log.info("auth開始了。。。。");
        log.info("code={}",code);
        log.info("state={}",state);
    }
}

我拼接的url,這里大家要注意根據(jù)自己的情況進(jìn)行拼接。拼接成功后需要在微信app中進(jìn)行訪問

https://open.weixin.qq.com/connect/oauth2/authorize?appid=xxx&redirect_uri=http://xxx/sell/weixin/auth&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect

訪問后的結(jié)果

wechatOAuth_3

這樣我們就拿到了code
4.獲取openid
繼續(xù)查看文檔,發(fā)現(xiàn)我們只需要使用獲取到的code再訪問另一個(gè)url就可以獲取到我們想要的了。接著上面的代碼

/**
 * <pre>
 * Description: wechat OAuth2.0
 * Author:      lllx
 * Version:     1.0
 * Created at:  2018/2/1
 * </pre>
 */
@RestController
@RequestMapping("/weixin")
@Slf4j
public class WeixinController {

    @GetMapping("/auth")
    public void auth(@RequestParam("code") String code,@RequestParam("state") String state){
        log.info("auth開始了。。。。");
        log.info("code={}",code);
        log.info("state={}",state);
        String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=xxxx&secret=xxxx&code="+code+"&grant_type=authorization_code";
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject(url, String.class);
        log.info("result={}",result);
    }
}

這時(shí)我們?cè)俅卧L問第三步拼接的url就可以看到如下結(jié)果。


wechatOAuth_4

將結(jié)果格式化一下我們可以就看到我們想要的openid


wechatOAuth_5

三、總結(jié)

流程看起來(lái)還是很簡(jiǎn)單的。但以上只是一個(gè)最簡(jiǎn)單、最直接的手工獲取openid的例子。真正在使用過(guò)程中需要結(jié)合自身的業(yè)務(wù)流程來(lái)進(jìn)行開發(fā),這時(shí)可能就有些麻煩了。此時(shí)我們也可以借助一些網(wǎng)上第三方sdk來(lái)開發(fā)。例如:weixin-java-tools。


本文作者: catalinaLi
本文鏈接: http://catalinali.top/2018/wechatOAuth/
版權(quán)聲明: 原創(chuàng)文章,有問題請(qǐng)?jiān)u論中留言。非商業(yè)轉(zhuǎn)載請(qǐng)注明作者及出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容