
不知覺間已經(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è)坑

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

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é)果

這樣我們就拿到了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é)果。

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

三、總結(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)注明作者及出處。