【问题标题】:How do I do authorization and login with WeChat using the iOS SDK?如何使用 iOS SDK 使用微信进行授权和登录?
【发布时间】:2016-06-28 06:52:15
【问题描述】:

如何使用 iOS SDK 进行微信授权和登录?堆栈溢出或google上似乎没有太多关于此的信息,并且大多数文档都是中文的。

【问题讨论】:

    标签: ios swift wechat


    【解决方案1】:

    选择在这里回答我自己的问题,因为似乎缺乏关于堆栈溢出和谷歌的信息。我希望其他人也觉得它有用。

    1.) 关注 Suragch 的关于如何设置 iOS SDK 的出色回答:How to add the WeChat API to a Swift project?。确保AppDelegate 的设置与func onReq(req: BaseReq!)func onResp(resp: BaseResp!) 方法的实现一致。

    2.) 要使登录和授权正常工作,您必须下载并使用中文版 SDK。奇怪的是,英文版中删除了一些登录所需的功能。中文SDK在这里:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319164&lang=zh_CN

    3.) 首先我们要授权我们想用微信使用的应用程序。可以这样做:

    let req = SendAuthReq()
    req.scope = "snsapi_userinfo" //Important that this is the same
    req.state = "co.company.yourapp_wx_login" //This can be any random value
    WXApi.sendReq(req)
    

    这应该返回一个代码到func onResp(resp: BaseResp!) 我实现了这样的方法 - 触发通知:

    func onResp(resp: BaseResp!) {
            if let authResp = resp as? SendAuthResp {
                if authResp.code != nil {
                    let dict = ["response": authResp.code]
                    NSNotificationCenter.defaultCenter().postNotificationName("WeChatAuthCodeResp", object: nil, userInfo: dict)             
                } else {                    
                    let dict = ["response": "Fail"]
                    NSNotificationCenter.defaultCenter().postNotificationName("WeChatAuthCodeResp", object: nil, userInfo: dict)                    
                }                
            } else {                
                let dict = ["response": "Fail"]
                NSNotificationCenter.defaultCenter().postNotificationName("WeChatAuthCodeResp", object: nil, userInfo: dict)
            }
        }
    

    4.) 使用代码,我们现在可以尝试获取 openID 和 accessToken。为此,我们需要使用appIDappSecret 建立一个链接并执行一个HTTP GET 请求。 appIDappSecret 是您在微信注册应用程序时获得的详细信息。像这样的例子:

    private let appID = "somecode2132113"
    private let appSecret = "someappsecret213123"
    
    private let accessTokenPrefix = "https://api.weixin.qq.com/sns/oauth2/access_token?"
    
    private func buildAccessTokenLink(withCode code: String) -> String {
            return accessTokenPrefix + "appid=" + appID + "&secret=" + appSecret + "&code=" + code + "&grant_type=authorization_code"
        }
    

    通过此链接,我们可以执行 HTTP GET 请求并获取 JSON 中的 openIDaccessToken。 (在 Postman 中尝试)。我不会为此发布代码,但我正在使用 Alamofire。

    5.) 最后我们可以更进一步,尝试获取微信用户的昵称和头像。与之前我们使用在上一步中获得的openIDaccessToken 创建新链接之前非常相似。像这样:

    private let userInfoPrefix = "https://api.weixin.qq.com/sns/userinfo?"
    
    private func buildUserInfoLink(withOpenID openID: String, accessToken: String) -> String {
            return userInfoPrefix + "access_token=" + accessToken + "&openid=" + openID
        }
    

    再次,执行 HTTP GET 请求,JSON 将返回昵称和头像链接!

    加:这里有详细指南:http://www.kekearif.com/how-to-implement-ios-wechat-login/

    【讨论】:

    • 我已经尝试按照您的步骤操作,但是当我导航到微信应用程序进行授权时,我一直收到消息:糟糕!出了点问题 :( 我检查了 Xcode 中的日志,除了响应对象中的错误代码 -2 之外,我没有得到任何其他信息。有什么提示吗?
    • @KushalAshok 你查看微信门户页面了吗?确保您拥有正确的凭据、应用 ID 等,因为您看到的是它们的最终错误。
    • 我查看了微信账号,得知我需要支付 300 元的审核费用,发布后将为我的应用启用登录 API。
    • @Kex 第一个 HTTP 获取请求是否代表打开微信应用供用户登录的深层链接?那么响应函数是我们在调用应用程序中聊天调用的回调吗?很抱歉试图从用户的体验中想象这将如何呈现
    • 你可能想在第一次调用之前添加一些代码来检查微信是否也安装了。
    【解决方案2】:

    我已经按照接受的答案做了所有事情,但它没有奏效,直到我改变了我的Info.plist

        <key>LSApplicationQueriesSchemes</key>
        <array>
            <string>weixin</string>
        </array>
    

        <key>LSApplicationQueriesSchemes</key>
        <array>
            <string>weixin</string>
            <string>weixinULAPI</string>
        </array>
    

    从官方指南here得到它

    【讨论】: