1. 在微信開(kāi)發(fā)者網(wǎng)站萤捆,注冊(cè)應(yīng)用id
2. 在資源下載頁(yè)下載SDK文件
3. 集成SDK到Xcode
- 導(dǎo)入SDK到工程中
- 添加如下依賴(lài)庫(kù)
- SystemConfiguration.framework
- CoreTelephony.framework
- libz.tbd
- libsqlite3.0.tbd
- libc++.tbd
- 在Targets -> info的URL type添加
key
為wexin,URLScheme Value為所注冊(cè)應(yīng)用的id - 在plist文件中添加URL Schemes白名單
- 導(dǎo)入WXApi.h俗批,并實(shí)現(xiàn)WXApiDelegate
<key>LSApplicationQueriesSchemes</key>
<array>
<string>wechat</string>
<string>weixin</string>
<string>sinaweibohd</string>
<string>sinaweibo</string>
</array>
作者:風(fēng)_雨
鏈接:http://www.reibang.com/p/1c1018580a58
來(lái)源:簡(jiǎn)書(shū)
著作權(quán)歸作者所有俗或。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處岁忘。
4. 注冊(cè)應(yīng)用程序的id
想微信注冊(cè)應(yīng)用程序的id辛慰,只有已經(jīng)注冊(cè)過(guò)id的程序,微信終端才能響應(yīng)干像,如下代碼所示帅腌,
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
// ...
WXApi.registerApp("wxd810oa5f5d48ae")
return true
}
5. 處理AppDelegate的handleOpenURL和openURL
func application(_ application: UIApplication, handleOpen url: URL) -> Bool {
return WXApi.handleOpen(url, delegate: self)
}
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
return WXApi.handleOpen(url, delegate: self)
}
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
return WXApi.handleOpen(url, delegate: self)
}
6. WXApi輔助方法
- WXApi.isWXAppInstalled() 判斷是否安裝微信
- WXApi.isWXAppSupportApi() 判斷微信版本是否支持
7. 向微信發(fā)送請(qǐng)求
通過(guò)SendAuthReq
發(fā)送請(qǐng)求,構(gòu)建SendAuthReq傳如兩個(gè)參數(shù)麻汰,
- scope 向微信請(qǐng)求哪些權(quán)限
- state 第三方程序用以標(biāo)記請(qǐng)求的唯一性速客,從微信跳轉(zhuǎn)回第三方應(yīng)用程序時(shí),由微信回傳
如下代碼所示五鲫,
let req = SendAuthReq()
req.scope = "snsapi_userinfo" // 請(qǐng)求全部權(quán)限
req.state = "binding"
WXApi.send(req)
8. 實(shí)現(xiàn)微信協(xié)議WXApiDelegate
extension AppDelegate: WXApiDelegate {
func onReq(req: BaseReq) {
}
func onResp(resp: BaseResp) {
}
}
其中func onReq(req: BaseReq)
是微信終端向第三方程序發(fā)起請(qǐng)求溺职,要求第三方程序響應(yīng)。第三方程序響應(yīng)完成后必須調(diào)用sendRsp返回位喂。在調(diào)用sendRsp返回時(shí)浪耘,會(huì)切回到微信程序界面。如果僅僅用到微信的分享和登陸授權(quán)通乘苎拢可以不實(shí)現(xiàn)或?qū)崿F(xiàn)為空点待。
而func onResp(resp: BaseResp)
作用時(shí),如果第三方程序向微信發(fā)送了sendReq的請(qǐng)求弃舒,那么onResp會(huì)被回調(diào)癞埠。sendReq請(qǐng)求調(diào)用后,會(huì)切到微信頁(yè)面聋呢。這個(gè)方法是向微信發(fā)起授權(quán)登陸的請(qǐng)求后苗踪,微信回調(diào)結(jié)果的方法。
Resp有如下幾個(gè)值削锰,如下所示通铲,
- SendAuthResp
- PayResp 這是微信返回給第三方關(guān)于支付結(jié)果的結(jié)構(gòu)體,根據(jù)錯(cuò)誤嗎來(lái)判定支付是否成功
- SendMessageToResp 這是微信向第三方返回的關(guān)于分享圖片器贩、視頻颅夺、鏈接和文本信息結(jié)果的結(jié)構(gòu)體
9. 微信授權(quán)登陸成功
需要判定其state == "binding" && resp.errorCode == WXSuccess朋截,若判定為true,說(shuō)明微信用戶允許授權(quán)第三方應(yīng)用吧黄,此時(shí)微信回拉起應(yīng)用或重定向到第三方網(wǎng)站部服,并且?guī)鲜跈?quán)臨時(shí)票據(jù)code等參數(shù)。在被用戶授權(quán)之后拗慨,通過(guò)code參數(shù)廓八,再加上appId和appSecret,調(diào)用api向微信發(fā)起請(qǐng)求用戶的接口調(diào)用憑證access_token赵抢,參數(shù)說(shuō)明如下剧蹂,
- appId 所申請(qǐng)應(yīng)用程序的appId
- secret 通過(guò)審核后獲得的密碼
- code SendAuthResp.code
- type "authorization_code"
請(qǐng)求是通過(guò)http get方式發(fā)起的,如下鏈接烦却,
let str = "https://api.weixin.qq.com/sns.oauth2/access_token?appid=\(appId)&secret=\(secret)&code=\(code)&grand_type=\(type)"
let url = URL(string: str)
let request = URLRequest(url: url)
// 簡(jiǎn)寫(xiě)
URLSessionTask.request(request) { response in
}
如果請(qǐng)求成功宠叼,api回返回json數(shù)據(jù),解析出openId
, access_token
和expires_in
等參數(shù)其爵,以備后用车吹。拿到access_token等參數(shù)之后,通常做法是把這些參數(shù)傳給server端醋闭,向server端發(fā)起用戶登陸的請(qǐng)求,根據(jù)server端返回的結(jié)果來(lái)判定用戶是否登陸成功朝卒。