swift 綁定微信和微信支付

前言

??上一篇寫了下支付寶綁定和支付寶支付的功能,接下來寫一下微信綁定和微信支付的功能。在此做個記錄咽斧,如果有說的不對的地方洛巢,歡迎大佬指出并糾正。

微信授權(quán)

??微信授權(quán)其實就是使用微信第三方登錄禾怠,需要用戶同意授權(quán),使用微信登錄你的 APP,這樣你的 APP 就可以通過微信 SDK 提供的接口去獲取對應(yīng)的微信信息崖堤。例如:你的微信賬戶的唯一標示等。

  • 微信授權(quán)流程圖


    授權(quán)流程
  • 微信授權(quán)流程
  1. APP 通過在微信開放者平臺注冊拿到的AppID去喚起微信SDK恨闪。
  2. 微信開放平臺返回臨時票據(jù)(code)倘感。
  3. 通過臨時票據(jù)(code)去和appId以及appSecret向微信開放平臺換取access_token,這一步可以放在前段處理也可以放在后端處理咙咽,推薦放在后端老玛,理由是因為后端處理相比前段更安全。
  4. 拿到上一步換取到的access_token去調(diào)用微信開發(fā)平臺提供的微信授權(quán)接口完成授權(quán)钧敞。
  • 微信授權(quán)代碼示例
/// 微信登錄
    ///
    /// - Parameter auth: 授權(quán)信息(存在默認值)
    public func sendAuthResp(auth: WechatAuth? = nil) {

        let req = SendAuthReq()
        if auth == nil {
            req.scope = "snsapi_userinfo,snsapi_base"
            req.state = "0774"
        } else {
            req.scope = auth!.scope
            req.state = auth!.state
        }
        WXApi.send(req)
    }

??其中SendAuthReq中的scope是用戶授權(quán)的作用域蜡豹,使用逗號(,)分隔,如獲取用戶個人信息則填寫snsapi_userinfo溉苛。state是第三方程序本身用來標識其請求的唯一性镜廉,用于保持請求和回調(diào)的狀態(tài),授權(quán)請求后原樣帶回給第三方愚战。

    public func onReq(_ req: BaseReq!) {

    }

    public func onResp(_ resp: BaseResp!) {
        if resp.isKind(of: SendAuthResp.self) {
            // 微信登錄娇唯,在這里拿到臨時票據(jù)(code)去換取access_token
         /*
         前段獲取:
         1.請求該鏈接去獲取access_token:
         http請求方式: GET
         https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
         返回成功的格式為:
         {
         "access_token":"ACCESS_TOKEN",
         "expires_in":7200,
         "refresh_token":"REFRESH_TOKEN",
         "openid":"OPENID",
         "scope":"SCOPE",
         "unionid":"o6_bmasdasdsad6_2sgVt7hMZOPfL"
         }
         2.請求該鏈接去獲取用戶的個人信息:
         http請求方式: GET
         https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
         正確的Json返回結(jié)果:
         {
         "openid":"OPENID",
         "nickname":"NICKNAME",
         "sex":1,
         "province":"PROVINCE",
         "city":"CITY",
         "country":"COUNTRY",
         "headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
         "privilege":[
         "PRIVILEGE1",
         "PRIVILEGE2"
         ],
         "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
         }
         */
        /*
         后端獲燃帕帷:將臨時票據(jù)(code)傳給App Service塔插,由App Service向微信平臺去獲取access_token
         然后再通過access_token去獲取用戶信息,最后將用戶信息返回給App
         */
         
        } else if resp.isKind(of: PayResp.self) {
            // 微信支付
           
        } else if resp.isKind(of: SendMessageToWXResp.self) {
            // 微信分享
           
        }
    }
}

微信支付

  • 微信支付流程圖


    微信支付流程圖.png
  • 微信支付流程
  1. APP 用戶通過訂單信息告訴App Service將要進行微信支付拓哟。
  2. App Service通過訂單信息去微信平臺獲取微信支付的訂單信息想许。
  3. App Service把微信支付的訂單信息返回給App。
  4. App拿到App Service返回的微信支付的訂單信息去喚起微信完成支付。
  • 微信支付代碼示例
 public func onReq(_ req: BaseReq!) {

    }

 public func onResp(_ resp: BaseResp!) {
        if resp.isKind(of: SendAuthResp.self) {
            // 微信登錄
            
        } else if resp.isKind(of: PayResp.self) {
            // 微信支付
            payRespHandle(resp: resp as! PayResp)
        } else if resp.isKind(of: SendMessageToWXResp.self) {
            // 微信分享
            
        }
    }
 fileprivate func payRespHandle(resp: PayResp) {

        if resp.errCode == WXSuccess.rawValue {
            print("WechatPay Success")
            paySuccessHandle?(resp.returnKey)
        } else if resp.errCode == WXErrCodeUserCancel.rawValue {
            print("WechatPay UserCancel")
            payCancelHandle?()
        } else {
            let error = WechatError(domain: "微信支付錯誤信息", code: resp.errCode, meesgae: resp.errStr)
            payFailedHandle?(error)
        }
    }

注意

  • access_token是調(diào)用授權(quán)關(guān)系接口的調(diào)用憑證流纹,由于access_token有效期(目前為2個小時)較短糜烹,當access_token超時后,可以使用refresh_token進行刷新漱凝。refresh_token擁有較長的有效期(30天)且無法續(xù)期疮蹦,當refresh_token失效的后,需要用戶重新授權(quán)后才可以繼續(xù)獲取用戶頭像昵稱碉哑。
  • 在用戶修改微信頭像后挚币,舊的微信頭像URL將會失效,所以在獲取用戶信息后扣典,將頭像圖片保存下來妆毕,避免微信頭像URL失效后的異常情況
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市贮尖,隨后出現(xiàn)的幾起案子笛粘,更是在濱河造成了極大的恐慌,老刑警劉巖湿硝,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件薪前,死亡現(xiàn)場離奇詭異,居然都是意外死亡关斜,警方通過查閱死者的電腦和手機示括,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來痢畜,“玉大人垛膝,你說我怎么就攤上這事《∠。” “怎么了吼拥?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長线衫。 經(jīng)常有香客問我凿可,道長,這世上最難降的妖魔是什么授账? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任枯跑,我火速辦了婚禮,結(jié)果婚禮上白热,老公的妹妹穿的比我還像新娘全肮。我一直安慰自己,他們只是感情好棘捣,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般乍恐。 火紅的嫁衣襯著肌膚如雪评疗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天茵烈,我揣著相機與錄音百匆,去河邊找鬼。 笑死呜投,一個胖子當著我的面吹牛加匈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播仑荐,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼雕拼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了粘招?” 一聲冷哼從身側(cè)響起啥寇,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎洒扎,沒想到半個月后辑甜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡袍冷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年磷醋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胡诗。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡邓线,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出乃戈,到底是詐尸還是另有隱情褂痰,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布症虑,位于F島的核電站缩歪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏谍憔。R本人自食惡果不足惜匪蝙,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望习贫。 院中可真熱鬧逛球,春花似錦、人聲如沸苫昌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至奥务,卻和暖如春物独,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背氯葬。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工挡篓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人帚称。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓官研,卻偏偏與公主長得像,于是被迫代替她去往敵國和親闯睹。 傳聞我的和親對象是個殘疾皇子戏羽,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354