版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】使用微信測(cè)試賬號(hào)對(duì)網(wǎng)頁(yè)進(jìn)行授權(quán)
如果用戶在微信客戶端中訪問(wèn)第三方網(wǎng)頁(yè),公眾號(hào)可以通過(guò)微信網(wǎng)頁(yè)授權(quán)機(jī)制,來(lái)獲取用戶基本信息,進(jìn)而實(shí)現(xiàn)業(yè)務(wù)邏輯。我們?cè)谶M(jìn)行公眾號(hào)網(wǎng)頁(yè)開(kāi)發(fā)的時(shí)候,想要獲取用戶的基本信息,首先得獲取到access_token,從access_token里我們要拿出用戶的openid來(lái)作為用戶在我們系統(tǒng)中的唯一標(biāo)識(shí),以及通過(guò)openid可以保證該用戶的只能訪問(wèn)到與其openid相對(duì)應(yīng)的數(shù)據(jù),防止越權(quán)漏洞。因此,我們需要對(duì)網(wǎng)頁(yè)進(jìn)行授權(quán),否則是無(wú)法在獲取到用戶的openid的。先上官方的文檔,微信官方文檔地址如下:為了能夠與微信進(jìn)行聯(lián)調(diào),所以我們需要使用到內(nèi)網(wǎng)穿透工具,讓外網(wǎng)能夠訪問(wèn)到我們內(nèi)網(wǎng)的接口地址。我之前寫了一篇關(guān)于如何使用natapp進(jìn)行內(nèi)網(wǎng)穿透的文章,這里就不再過(guò)多贅述這些基本的工具使用了:在本文中會(huì)介紹兩種獲取openid的方式:自己根據(jù)文檔接口手寫代碼獲取、使用第三方已經(jīng)封裝好的SDK來(lái)獲取。第三方SDK的GitHub地址:說(shuō)明與注意:(1)網(wǎng)頁(yè)授權(quán)分為兩種:(2)你的公眾號(hào)必須為認(rèn)證的訂閱號(hào)或者認(rèn)證的服務(wù)號(hào)或申請(qǐng)官方提供的測(cè)試號(hào),否則沒(méi)有此接口權(quán)限。(3)你要配置好回調(diào)域名:即用戶點(diǎn)擊網(wǎng)址獲取用戶信息后打開(kāi)哪個(gè)域名。測(cè)試號(hào)申請(qǐng)及設(shè)置外網(wǎng)域名我們先來(lái)申請(qǐng)一個(gè)官方的測(cè)試號(hào),微信測(cè)試賬號(hào)申請(qǐng)地址如下:登錄成功后,即可獲取測(cè)試號(hào)信息:下拉頁(yè)面找到測(cè)試號(hào)二維碼那一欄,然后使用微信掃描二維碼關(guān)這個(gè)注測(cè)試公眾號(hào)。關(guān)注成功后,稍等一會(huì)就會(huì)顯示出用戶列表。如下:配置完測(cè)試號(hào)后,繼續(xù)下拉頁(yè)面找到網(wǎng)頁(yè)帳號(hào)的設(shè)置,點(diǎn)擊修改:然后將我們的在natapp里注冊(cè)外網(wǎng)域名配置進(jìn)去:注:由于是測(cè)試號(hào),這一塊不會(huì)嚴(yán)格去檢測(cè)這個(gè)域名,如果是使用真實(shí)的公眾賬號(hào)進(jìn)行配置時(shí),會(huì)對(duì)配置的域名進(jìn)行檢測(cè)。但是即便是測(cè)試,也要保證這個(gè)域名是可用的,不然就無(wú)法進(jìn)行聯(lián)調(diào)了。手動(dòng)獲取openid(1)第一步,用戶同意授權(quán),獲取code參數(shù):完成以上測(cè)試賬號(hào)的配置及微信網(wǎng)頁(yè)授權(quán)后,創(chuàng)建一個(gè)SpringBoot的Web工程,并打開(kāi)natapp的客戶端。關(guān)于獲取code這一步要仔細(xì)查看這部分文檔,我就不過(guò)多解釋了:從文檔中可以看到,需要讓用戶在訪問(wèn)頁(yè)面的過(guò)程中打開(kāi)一個(gè)特定的鏈接,然后用戶授權(quán)成功后會(huì)跳轉(zhuǎn)回調(diào)redirect_uri參數(shù)里指定的鏈接,這樣我們就能獲取code參數(shù)了。so,在工程中創(chuàng)建controller包,在該包里新建一個(gè)WeixinController控制器,我們來(lái)寫一個(gè)這樣的跳轉(zhuǎn)回調(diào)接口給微信進(jìn)行回調(diào),看看能否獲取到回調(diào)時(shí)傳遞的code參數(shù):packageorg.sell.controller;
importlombok.extern.slf4j.Slf4j;
importorg.springframework.web.bind.annotation.GetMapping;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RequestParam;
importorg.springframework.web.bind.annotation.RestController;
/**
*@program:sell
*@description:微信網(wǎng)頁(yè)授權(quán),獲取用戶openid
*@author:01
*@create:2018-05-1513:35
**/
@RestController
@RequestMapping("/weixin")
@Slf4j
publicclassWeixinController{
@GetMapping("/auth")
publicvoidauth(@RequestParam("code")Stringcode){
("進(jìn)入auth方法...");
("code={}",code);
}
}編寫完接口代碼之后,我們來(lái)基于文檔中給出的鏈接進(jìn)行修改,我這里填寫了appid、redirect_uri以及scope三個(gè)參數(shù),其余的參數(shù)我保持了默認(rèn)。所以填寫完成后的連接如下:/connect/oauth3/authorize?appid=wx37617xxxxxxc6c76&redirect_uri=https://zero.mynatapp.cc/sell/weixin/auth&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect如果需要獲取用戶信息的話,則需要把scope參數(shù)改為snsapi_userinfo,用戶訪問(wèn)這個(gè)連接時(shí)就會(huì)提示用戶登錄。但是如果是使用的測(cè)試賬號(hào)的appid,則不會(huì)彈出登錄界面。使用真實(shí)的公眾號(hào)賬號(hào)的appid才會(huì)彈出登錄界面,我們使用的是測(cè)試賬戶所以是不會(huì)彈出登錄界面的:/connect/oauth3/authorize?appid=wx376172f171ac6c76&redirect_uri=https://zero.mynatapp.cc/sell/weixin/auth&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect然后復(fù)制該鏈接到微信中打開(kāi),一定要在微信中打開(kāi),使用pc端的瀏覽器或手機(jī)端的瀏覽器是無(wú)法打開(kāi)該連接的,打開(kāi)后也會(huì)提示你在微信中打開(kāi)。在微信訪問(wèn)該地址成功后,控制臺(tái)會(huì)輸出如下內(nèi)容,其中code參數(shù)獲取成功就代表這一步測(cè)試是成功的:2018-05-1513:47:02,365-進(jìn)入auth方法...
2018-05-1513:47:02,365-code=0219vS7617imVS1dqe861eXP7619vS7j但是code是一次性的,不能直接使用,所以接下來(lái)的第二步我們需要拿這個(gè)code去換取access_token。使用code來(lái)?yè)Q取access_token關(guān)于使用code換取access_token這一步要仔細(xì)查看這部分文檔:官方文檔中說(shuō),獲取code后,請(qǐng)求以下鏈接來(lái)獲取access_token:/sns/oauth3/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code同樣的,我們也是需求根據(jù)文檔去填寫鏈接中的參數(shù),例如我這里就填寫了appid、secret以及code。由于code參數(shù)我們需要在auth接口被微信調(diào)用時(shí)獲取,所以修改auth接口的代碼如下:@GetMapping("/auth")
publicvoidauth(@RequestParam("code")Stringcode){
("進(jìn)入auth方法...");
("code={}",code);
Stringurl="/sns/oauth3/access_token?appid=wx3761xxxxx1ac6c76&secret=f12caef4d31axxxxx819c4c405541f4&code="+code+"&grant_type=authorization_code";
RestTemplaterestTemplate=newRestTemplate();
Stringresponse=restTemplate.getForObject(url,String.class);
("response={}",response);
}重新啟動(dòng)SpringBoot,然后再次到微信里訪問(wèn)之前那個(gè)獲取code參數(shù)的鏈接,訪問(wèn)成功后,微信會(huì)進(jìn)行會(huì)回調(diào),我們的接口就會(huì)接收到一個(gè)json格式的返回信息,其中就有我們需要的openid。我這里是訪問(wèn)成功的,所以獲取到了這個(gè)返回信息,將其格式化后如下:{
"access_token":"9_lZjiw19HhAga4cZ9C4rmtN50AkLzCwLVnlp8msI9xvCCWMIR88CmZAtB-IN1SGOwR_nh76V100vaTF8qihmBnfDx7XYynqHurb4UiqSZTDo",
"expires_in":7200,
"refresh_token":"9_oMBSt0Bu-UUbVajpfo4OdyPwIfYbN1lut8KHjT4JEMTTbITtPnBFcQopP-SIzYvWHQuEdeQRcVHt1pRJHwvDhecDrd5pGz5HPckOCeHvmxg",
"openid":"ok_HP0txxYBxxxxxxd1kZGz6A",
"scope":"snsapi_base"
}從回調(diào)的數(shù)據(jù)中可以看到,openid包含在了這個(gè)數(shù)據(jù)里,這樣我們就獲取到了用戶的openid,到此為止,我們手工獲取OpenID的方式就演示完成了。接下來(lái)我們當(dāng)然就是上工具了,有一個(gè)很優(yōu)秀的第三方SDK,在文章的開(kāi)頭也給出了GitHub的鏈接,秉承一貫不重復(fù)造輪子能用現(xiàn)成的就用現(xiàn)成的良(hou)好(yan)習(xí)(wu)慣(chi),下一小節(jié)中我們將介紹如何使用該SDK來(lái)對(duì)接微信網(wǎng)頁(yè)授權(quán)。使用第三方SDK獲取openid首先需要將SDK集成到我們的項(xiàng)目中,在pom.xml文件中加入如下依賴配置:<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>3.0.0</version>
</dependency>注:工程中還使用了lombok,如果沒(méi)有了解過(guò)lombok的話,可能需要了解一下才能看懂一些注解的作用,關(guān)于lombok的使用及配置可以參考我之前寫的一篇文章:Lombok快速入門關(guān)于該SDK的一些文檔地址:由于可能會(huì)出現(xiàn)異常,在我們的工程里新建一個(gè)enums包,用于存放枚舉類,在該包中新建一個(gè)ResultEnum枚舉類,代碼如下:packageorg.sell.enums;
importlombok.AllArgsConstructor;
importlombok.Getter;
@AllArgsConstructor
@Getter
publicenumResultEnum{
WECHAT_MP_ERROR(20,"微信公眾賬號(hào)出現(xiàn)異常"),
;
privateIntegercode;
privateStringmsg;
}新建一個(gè)exception包,自定義一個(gè)異常類。代碼如下:packageorg.sell.exception;
importorg.sell.enums.ResultEnum;
/**
*@program:sell
*@description:自定義異常
*@author:01
*@create:2018-05-0915:45
**/
publicclassSellExceptionextendsRuntimeException{
privateIntegercode;
publicSellException(Integercode,Stringmsg){
super(msg);
this.code=code;
}
publicSellException(ResultEnumresultEnum){
super(resultEnum.getMsg());
this.code=resultEnum.getCode();
}
}將默認(rèn)的applicationCperties文件改為applicationContext.yml文件,然后在該文件中配置我們的AppId以及AppSecret。如下:wechat:
mpAppId:wx37617xxxxxac6c76
mpAppSecret:f12caef4d31adxxxxxxc4c405541f4在工程中新建config包,用于存放一些配置類,在該包下新建WechatAccountConfig類,用于加載我們的配置在.yml文件里的AppId以及AppSecret屬性。代碼如下:packageorg.sell.config;
importlombok.Data;
importperties.ConfigurationProperties;
importorg.springframework.stereotype.Component;
/**
*@program:sell
*@description:測(cè)試號(hào)相關(guān)信息的配置類
*@author:01
*@create:2018-05-1515:50
**/
@Data
@Component
@ConfigurationProperties(prefix="wechat")//載入配置文件里前綴為wechat的配置信息
publicclassWechatAccountConfig{
privateStringmpAppId;
privateStringmpAppSecret;
}接著再創(chuàng)建一個(gè)WechatMpConfig類,配置微信網(wǎng)頁(yè)授權(quán)時(shí)所需的信息。代碼如下:packageorg.sell.config;
importme.chanjar.weixin.mp.api.WxMpConfigStorage;
importme.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
importme.chanjar.weixin.mp.api.WxMpService;
importme.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.context.annotation.Bean;
importorg.springframework.stereotype.Component;
/**
*@program:sell
*@description:微信網(wǎng)頁(yè)授權(quán)信息配置類
*@author:01
*@create:2018-05-1515:40
**/
@Component
publicclassWechatMpConfig{
@Autowired
privateWechatAccountConfigwechatAccountConfig;
/**
*配置WxMpService所需信息
*@return
*/
@Bean//此注解指定在Spring容器啟動(dòng)時(shí),就執(zhí)行該方法并將該方法返回的對(duì)象交由Spring容器管理
publicWxMpServicewxMpService(){
WxMpServicewxMpService=newWxMpServiceImpl();
//設(shè)置配置信息的存儲(chǔ)位置
wxMpService.setWxMpConfigStorage(wxMpConfigStorage());
returnwxMpService;
}
/**
*配置appID和appsecret
*@return
*/
@Bean
publicWxMpConfigStoragewxMpConfigStorage(){
//使用這個(gè)實(shí)現(xiàn)類則表示將配置信息存儲(chǔ)在內(nèi)存中
WxMpInMemoryConfigStoragewxMpInMemoryConfigStorage=newWxMpInMemoryConfigStorage();
wxMpInMemoryConfigStorage.setAppId(wechatAccountConfig.getMpAppId());
wxMpInMemoryConfigStorage.setSecret(wechatAccountConfig.getMpAppSecret());
returnwxMpInMemoryConfigStorage;
}
}在controller包下,新建一個(gè)WechatController控制器類,該類的接口用于對(duì)接微信網(wǎng)頁(yè)授權(quán),授權(quán)完成后,需跳轉(zhuǎn)到我們指定的網(wǎng)頁(yè)中。代碼如下:packageorg.sell.controller;
importlombok.extern.slf4j.Slf4j;
importmon.api.WxConsts;
importmon.exception.WxErrorException;
importme.chanjar.weixin.mp.api.WxMpService;
importme.chanjar.weixin.mp.bean.result.WxMpOAuth3AccessToken;
importorg.sell.enums.ResultEnum;
importorg.sell.exception.SellException;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Controller;
importorg.springframework.web.bind.annotation.GetMapping;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RequestParam;
import.URLEncoder;
/**
*@program:sell
*@description:對(duì)接微信網(wǎng)頁(yè)授權(quán)
*@author:01
*@create:2018-05-1515:35
**/
@Controller
@RequestMapping("/wechat")
@Slf4j
publicclassWechatController{
@Autowired
privateWxMpServicewxMpService;
/**
*獲取code參數(shù)
*
*@paramreturnUrl需要跳轉(zhuǎn)的url
*@return
*/
@GetMapping("/authorize")
publicStringauthorize(@RequestParam("returnUrl")StringreturnUrl){
//暫時(shí)將我們的回調(diào)地址硬編碼在這里,方便一會(huì)調(diào)試
Stringurl="https://zero.mynatapp.cc/sell/wechat/userInfo";
//獲取微信返回的重定向url
StringredirectUrl=wxMpService.oauth3buildAuthorizationUrl(url,WxConsts.OAuth3Scope.SNSAPI_BASE,URLEncoder.encode(returnUrl));
("【微信網(wǎng)頁(yè)授權(quán)】獲取code,redirectUrl={}",redirectUrl);
return"redirect:"+redirectUrl;
}
/**
*使用code參數(shù)換取access_token信息,并獲取到openid
*
*@paramcode
*@paramreturnUrl
*@return
*/
@GetMapping("/userInfo")
publicStringuserInfo(@RequestParam("code")Stringcode,@RequestParam("state")StringreturnUrl){
WxMpOAuth3AccessTokenwxMpOAuth3AccessToken;
try{
//使用code換取access_token信息
wxMpOAuth3AccessToken=wxMpService.oauth3getAccessToken(code);
}catch(WxErrorExceptione){
log.error("【微信網(wǎng)頁(yè)授權(quán)】異常,{}",e);
thrownewSellException(ResultEnum.WECHAT_MP_ERROR.getCode(),e.getError().getErrorMsg());
}
//從access_token信息中獲取到用戶的openid
StringopenId=wxMpOAuth3AccessToken.getOpenId();
("【微信網(wǎng)頁(yè)授權(quán)】獲取openId,openId={}",openId);
//重定
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度石油化工設(shè)備采購(gòu)合同補(bǔ)充協(xié)議范本3篇
- 二零二五年度vi設(shè)計(jì)創(chuàng)意制作合同范本2篇
- 二零二五版環(huán)境安全風(fēng)險(xiǎn)評(píng)估與治理合同3篇
- 合同管理在2025年度招投標(biāo)中的合規(guī)性分析3篇
- 二零二五版企業(yè)內(nèi)部技術(shù)人員掛靠合作合同范本3篇
- 二零二五年度高壓電氣設(shè)備采購(gòu)及安裝合同2篇
- 二零二五版寶鋼集團(tuán)勞動(dòng)合同員工加班費(fèi)及休息日工作安排3篇
- 二零二五年度車輛質(zhì)押擔(dān)保合同樣本2篇
- 二零二五版公路貨運(yùn)合同道路運(yùn)輸許可證管理與審查規(guī)范3篇
- 二零二五年度綠色環(huán)保房地產(chǎn)商品房買賣合同書(shū)3篇
- 10日益重要的國(guó)際組織第三課時(shí)中國(guó)與國(guó)際組織(教學(xué)設(shè)計(jì))2023-2024學(xué)年統(tǒng)編版道德與法治六年級(jí)下冊(cè)
- Unit 1 同步練習(xí)人教版2024七年級(jí)英語(yǔ)上冊(cè)
- 工程管理重大風(fēng)險(xiǎn)應(yīng)對(duì)方案
- 直播帶貨助農(nóng)現(xiàn)狀及發(fā)展對(duì)策研究-以抖音直播為例(開(kāi)題)
- 腰椎間盤突出疑難病例討論
- 《光伏發(fā)電工程工程量清單計(jì)價(jià)規(guī)范》
- 2023-2024學(xué)年度人教版四年級(jí)語(yǔ)文上冊(cè)寒假作業(yè)
- (完整版)保證藥品信息來(lái)源合法、真實(shí)、安全的管理措施、情況說(shuō)明及相關(guān)證明
- 營(yíng)銷專員績(jī)效考核指標(biāo)
- 陜西麟游風(fēng)電吊裝方案專家論證版
- 供應(yīng)商審核培訓(xùn)教程
評(píng)論
0/150
提交評(píng)論