module WechatOauth::Service module_function def request(method, url, params) WechatOauth.logger.info("[WechatOauth] [#{method.to_s.upcase}] #{url} || #{params}") client = Faraday.new(url: WechatOauth.base_url) response = client.public_send(method, url, params) result = JSON.parse(response.body) WechatOauth.logger.info("[WechatOauth] [#{response.status}] #{result}") if result['errcode'].present? && result['errcode'].to_s != '0' raise WechatOauth::Error.new(result['errcode'], result['errmsg']) end result end # https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html # response: # { # "access_token":"ACCESS_TOKEN", # "expires_in":7200, # "refresh_token":"REFRESH_TOKEN", # "openid":"OPENID", # "scope":"SCOPE", # "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL" # } def access_token(code) params = { appid: WechatOauth.appid, secret: WechatOauth.secret, code: code, grant_type: 'authorization_code' } request(:get, '/sns/oauth2/access_token', params) end # https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Authorized_Interface_Calling_UnionID.html # response: # { # "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" # # } def user_info(access_token, openid) request(:get, '/sns/userinfo', access_token: access_token, openid: openid) end end