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)
        }
    }
    
}
相关推荐
weixin_382395234 小时前
为小工厂量身打造:本地部署的物料管理系统带缺料计算
前端·制造
__zRainy__4 小时前
解决pnpm v10+不自动构建
前端·pnpm·工程化
猫猫不是喵喵.5 小时前
Vue3 Props 属性
前端·javascript·vue.js
醉城夜风~6 小时前
CSS元素显示模式(display)
前端·css
AI大模型-小华7 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子9 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅9 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni9 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学11 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端