Swift -- 第三方登录之微信登录 源码分享

@[toc]

Swift -- 第三方登录之微信登录 源码分享

第一步: 微信开放平台注册,获取APPID和秘钥

不管微信登录,微信支付,微信分享都需要到微信开放平台注册账号后并注册应用,拿到应用唯一标识AppID和应用密钥 AppSecret 然后集成SDK,具体如何集成查看官方文档,文档有详细介绍微信开放平台--iOS接入指南

第二步:程序内设置

微信SDK初始化,注意universal_link必须添加

didFinishLaunchingWithOptions 中对微信SDK进行初始化,方法如下:

csharp 复制代码
 let universal_link = "https://wx.universal_link.url" //此处填写微信后台写的universal_link 地址
 WXApi.registerApp(WX_APPID, universalLink: universal_link)

⚠️ 不要忘了在Signing & Capabilities 中添加Associated Domains中添加applinks, 格式如下图所示:

第三步 添加代码

微信配置代理,接收微信请求后的返回信息(用户登录/微信支付订单信息)

swift 复制代码
 // 9.0之后  打开第三方应用之后返回程序内  设置系统回调  --------待完善---------
    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        if url.absoluteString.hasPrefix(WX_APPID){
            //微-信
            WXApi.handleOpen(url, delegate: NK_WXUtils.sharedManager)
            return true
        }
     }
    func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
        
        if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
            if let url = userActivity.webpageURL{
                    return WXApi.handleOpenUniversalLink(userActivity, delegate: NK_WXUtils.sharedManager)
            }
            
        }
        return true
    }

第四部:微信调用方法

下面就是完整的微信登录及获取用户信息的调用方法

swift 复制代码
class NK_WXUtils: NSObject , WXApiDelegate{

	//微信登录
    static func wxLogin(){
        
        if WXApi.isWXAppInstalled() {
            let req = SendAuthReq()
            req.state = "wx_oauth_authorization_state";//用于保持请求和回调的状态,授权请求或原样带回
            req.scope = "snsapi_userinfo";//授权作用域:获取用户个人信息
            // req.scope = "snsapi_userinfo,snsapi_base";//授权作用域:获取用户个人信息
            
            DispatchQueue.main.async {
                WXApi.send(req)
            }
        }else{
            MBProgressHUD.showJustText(msg: "您尚未安装微信客户端,请安装后重试!")
        }
        
    }

	//微信发送请求,这里不用处理
    func onReq(_ req: BaseReq) {
        
        MYLog( "\n\n----openID:"+req.openID)
    }
	//微信请求返回结果,这里处理返回的结果
    func onResp(_ resp: BaseResp) {
        if resp.isKind(of: SendAuthResp.self) {
            let res = resp as? SendAuthResp
            if res?.state == "wx_oauth_authorization_state" {
                NK_WXUtils.getWechatAccessToken(code: res!.code!)
            }
        }
    }

    static func getWechatAccessToken(code:String)  {
        
        let url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=\(WX_APPID)&secret=\(WX_SECRET)&code=\(code)&grant_type=authorization_code"
        MBProgressHUD.showLoadingHUD(msg: nil, view: nil)
        NK_HttpManager().requestData(with: url, cache: false, method: .get, params: nil).success { (code, res) in
            MYLog(res)
            guard let dic = res as? [String: Any] else{
                return
            }
            
            guard let access_token = dic["access_token"] as? String,  let openid = dic["openid"] as? String else{
                MBProgressHUD.hideToastHUD(view: nil)
                return
            }
            getWechatUserInfo(with: access_token, openId: openid )
           
            }.fail { (error, msg) in
//                MYLog(msg)
                MBProgressHUD.showJustText(msg: msg)
        }
        
    }
    
    
    static func getWechatUserInfo(with access_token:String, openId:String)  {

        let url = "https://api.weixin.qq.com/sns/userinfo?access_token=\(access_token)&openid=\(openId)"
        NK_HttpManager().requestData(with: url, cache: false, method: .get, params: nil).success { (code, res) in
            MBProgressHUD.hideToastHUD(view: nil)
		//            MYLog(res)
            if let dic = res as? [String: Any]{
                // 获取到的用户信息json格式,可以拿来给服务端绑定用户信息
                `在这里绑定获取到的用户信息`
            }
            
            }.fail { (error, msg) in
                MBProgressHUD.showJustText(msg: msg)
        }
    }
    
}
相关推荐
竹林818几秒前
从ethers.js迁移到Viem:我在一个DeFi项目前端重构中踩过的坑
前端·javascript
像我这样帅的人丶你还21 分钟前
从交稿到甩锅预防:AI 前端流水线
前端·ai编程
想想弹幕会怎么做22 分钟前
如何构建一颗可交互的ui树?
前端
程序员陆业聪27 分钟前
我见过的最反直觉的 Android 架构问题:UseCase 越多,项目越烂
前端
Arya_aa33 分钟前
网络:前端向后端发送网络请求渲染在页面上,将EasyMock中的信息用前端vue框架编写代码,最终展示在浏览器
前端·vue.js
LlNingyu34 分钟前
文艺复兴,什么是CSRF,常见形式(一)
前端·安全·web安全·csrf
晓131337 分钟前
React篇——第三章 状态管理之 Redux 篇
前端·javascript·react.js
子兮曰42 分钟前
🚀24k Star 的 Pretext 为何突然爆火:它不是排版库,而是在重写 Web 文本测量
前端·javascript·github
@大迁世界1 小时前
11.在 React.js 中,state 与 props 的差异体现在哪里?
前端·javascript·react.js·前端框架·ecmascript
Giant1001 小时前
🔥前端跨域封神解法:Vite Proxy + Express CORS,一篇搞定所有跨域坑!
前端·javascript·面试