|
//
// WXUserInfoRemoteAPI.swift
// PaiaiDataKit
//
// Created by FFIB on 2018/12/26.
// Copyright © 2018 FFIB. All rights reserved.
//
import Foundation
import RxSwift
private let WXAppid = "wx4e22a0c8ae6d766d"
private let WXSecret = "636ac848016c593575d11143c55c8333"
struct WXUserInfoRemoteAPI: UserInfoRemoteAPI {
let disposeBag = DisposeBag()
init() {}
func login() -> Single<UserInfo> {
#if (arch(i386) || arch(x86_64))
let photoPath = "https://wx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTJibSYLgvXpMakvD9FaCqfiaWqcMiaiaz905YxWPuO4hy8F2lGheV7kVr9vKKXFgmL1S5s4QJgxwuwtVw/132" //swiftlint:disable:this line_length
return Single.create(subscribe: { (observer) in
observer(.success(UserInfo(json: ["user_id": "fiDz2Ms" as AnyObject,
"nickname": "郑剑飞" as AnyObject,
"photoPath": photoPath as AnyObject])))
return Disposables.create()
})
#else
loginWithWeChat()
return addWXLoginDidFinish().flatMap({
return self.getWXToken(param: $0)
}).flatMap({
return self.getWXUserInfo(param: $0)
}).flatMap({
return self.wxLogin(param: $0)
}).do(onSuccess: { res in
print(res)
})
#endif
}
fileprivate func loginWithWeChat() {
let request = SendAuthReq()
request.scope = "snsapi_userinfo,snsapi_base"
request.state = "skilogin"
WXApi.send(request)
}
fileprivate func addWXLoginDidFinish() -> Single<[String: String]> {
return Single.create(subscribe: { observer -> Disposable in
NotificationCenter.default.rx.notification(.wxLogin).subscribe(onNext: { notification in
guard let userInfo = notification.userInfo,
let errcode = userInfo["errCode"] as? Int,
let code = userInfo["code"] as? String else {
Toast.show(message: "获取code失败")
return observer(.error(ParseError()))
}
switch errcode {
case 0:
observer(.success(["appid": WXAppid, "secret": WXSecret,
"code": code, "grant_type": "authorization_code"]))
case -4:
Toast.show(message: "您拒绝授权,登录失败")
case -2:
Toast.show(message: "您取消了登录,登录失败")
default:
Toast.show(message: "发生未知错误,登录失败")
}
return observer(.error(BusinessError(id: errcode)))
}).disposed(by: self.disposeBag)
return Disposables.create()
})
}
fileprivate func parseWxToken(json: JSON) -> [String: String]? {
guard let token = json["access_token"] as? String,
let openId = json["openid"] as? String else { return nil }
return ["access_token": token, "openid": openId]
}
fileprivate func getWXToken(param: [String: String]) -> Single<[String: String]> {
let resource = ContentResource<[String: String]>(host: "https://api.weixin.qq.com",
path: .wxAccessToken,
parameter: param,
parseJSON: parseWxToken)
return NetworkApi.share.get(resource: resource)
}
fileprivate func getWXUserInfo(param: [String: String]) -> Single<[String: Any]> {
let resource = ContentResource<[String: Any]>(host: "https://api.weixin.qq.com",
path: .wxUserInfo,
parameter: param,
parseJSON: { $0 })
return NetworkApi.share.get(resource: resource)
}
fileprivate func parseAuthorize(json: JSON) -> UserInfo? {
guard let data = json["data"] as? [String: AnyObject] else { return nil }
return UserInfo(json: data)
}
fileprivate func wxLogin(param: [String: Any]) -> Single<UserInfo> {
let resource = ContentResource<UserInfo>(path: .authorize, parameter: param, parseJSON: parseAuthorize)
return resource.loadContent()
}
}
|