iOS進(jìn)階之微信登陸、微信分享、微信支付

1. 在微信開發(fā)者網(wǎng)站,注冊(cè)應(yīng)用id

2. 在資源下載頁(yè)下載SDK文件

3. 集成SDK到Xcode

  • 導(dǎo)入SDK到工程中
  • 添加如下依賴庫(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://m.itdecent.cn/p/1c1018580a58
來(lái)源:簡(jiǎn)書
著作權(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)寫
URLSessionTask.request(request) { response in
    
}

如果請(qǐng)求成功,api回返回json數(shù)據(jù),解析出openId, access_tokenexpires_in等參數(shù),以備后用。拿到access_token等參數(shù)之后,通常做法是把這些參數(shù)傳給server端,向server端發(fā)起用戶登陸的請(qǐng)求,根據(jù)server端返回的結(jié)果來(lái)判定用戶是否登陸成功。

http://m.itdecent.cn/p/1c1018580a58

最后編輯于
?著作權(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)容

  • 注意:代碼自己動(dòng)手寫,不要復(fù)制! GitHub 一、接入微信第三方登錄準(zhǔn)備工作。 移動(dòng)應(yīng)用微信登錄是基于OAuth...
    大沖哥閱讀 15,412評(píng)論 0 7
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,355評(píng)論 25 708
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,711評(píng)論 19 139
  • iOS支付 iOS支付分為兩類,第三方支付和應(yīng)用內(nèi)支付(內(nèi)購(gòu))。 第三方支付包括:支付寶支付、微信支付、銀聯(lián)支付、...
    帥不過(guò)oneS閱讀 3,012評(píng)論 2 8
  • 轉(zhuǎn)載需要著名出處: 之前寫過(guò)微信登錄分享支付第一版: 前言 大部分的app都有接入第三方sdk的需求。例如第三方登...
    Android開發(fā)666閱讀 6,560評(píng)論 3 38

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