微信開發之微信網頁受權獲取openid

wechatOAuth_logo

不知覺間已經接觸了幾回微信支付開發,而要進行微信支付就須要用戶的惟一標識:openid。還記得第一次獲取用戶openid的時候就踩了不少坑。這兩天又接觸了一下,想着索性就把他記錄下來,也便於之後查閱

1、準備工具

無論開發什麼,官方的文檔應該是第一個想到的這裏把官方文檔貼出來:微信網頁受權文檔
除此以外,咱們還須要一個內網穿透的工具在開發環境下讓微信能訪問到咱們的域名。我使用的是natapp。此類工具網上有不少,你們能夠自行尋找。
這裏咱們使用微信提供的測試帳號來做爲演示java

2、開始開發

內網穿透就不在這裏演示了,下面咱們直入主題:
1.填寫網頁受權域名
在這篇文檔的一開始就埋了一個坑
wechatOAuth_1
這段話就是說,咱們在開發前須要在圖片中框紅的位置填入咱們所要開發的域名。這裏咱們使用的是測試環境,因此須要在測試帳號管理頁面的這個位置填入咱們本身的域名,這裏要注意填入域名的規則。
wechatOAuth_2
2.文檔閱讀
接着閱讀文檔咱們能夠發現網頁受權有兩種scope,
snsapi_base和snsapi_userinfo。兩種scope均可以獲取到opeid,不一樣的是snsapi_userinfo除了openid外還能夠獲取到用戶的基本信息,可是須要用戶手動進行確認。
再往下閱讀咱們能夠看到官方文檔的受權步驟api

  • 第一步:用戶贊成受權,獲取code
  • 第二步:經過code換取網頁受權access_token以及openid
  • 第三步:刷新access_token(若是須要)
  • 第四步:拉取用戶信息(需scope爲 snsapi_userinfo)

咱們只須要openid,因此咱們只開發到第二步就行了。下面咱們就按着官方步驟來開發。微信

3.獲取code
查看文檔後咱們發現咱們須要拼接一個url而且訪問它。url的參數文檔中寫的很清楚了。看他的例子也能看個清楚。這裏比較重要的是redirect_uri。這個參數所填的是一個連接。咱們訪問url後會自動轉發到這個連接而且將咱們須要的code以及拼接url中的state的值做爲參數。這個redirect_uri的值要填入的是咱們代碼中的controller的位置。
因此這裏咱們須要一段代碼:app

/**
 * <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,這裏你們要注意根據本身的狀況進行拼接。拼接成功後須要在微信app中進行訪問工具

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

訪問後的結果
wechatOAuth_3
這樣咱們就拿到了code
4.獲取openid
繼續查看文檔,發現咱們只須要使用獲取到的code再訪問另外一個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);
    }
}

這時咱們再次訪問第三步拼接的url就能夠看到以下結果。
wechatOAuth_4
將結果格式化一下咱們能夠就看到咱們想要的openid
wechatOAuth_5微信支付

3、總結

流程看起來仍是很簡單的。但以上只是一個最簡單、最直接的手工獲取openid的例子。真正在使用過程當中須要結合自身的業務流程來進行開發,這時可能就有些麻煩了。此時咱們也能夠藉助一些網上第三方sdk來開發。例如:weixin-java-tools。url


本文做者: catalinaLi
本文連接: http://catalinali.top/2018/we... 版權聲明: 原創文章,有問題請評論中留言。非商業轉載請註明做者及出處。
相關文章
相關標籤/搜索