WeChat開発では、多くの場合、そのようなニーズがあります。ユーザーアバターを取得し、WeChatアカウントをバインドしてユーザーにメッセージを送信します...そして、これらを達成するための前提条件は許可です!
1。セキュアコールバックドメイン名を構成します:
WeChat PublicアカウントによるユーザーWebページの承認を要求する前に、開発者は「開発 - インターフェイス許可 - Webサービス - Webアカウント - ユーザー基本情報を取得するためのWeb認証」の構成オプションに移動する必要があります。これは、www.liliangel.cnなどの完全なドメイン名を直接記述することであることに注意してください。ただし、H5の開発では、一般に、h.liliangel.cnなどのセカンダリドメイン名も使用します。これは、安全なコールバックドメイン名にもあります。
2。ユーザーレベルの承認とサイレント認証
1. SNSAPI_BASEによって開始されたWebページ認証は、ページに入るユーザーのOpenIDを取得するために使用され、静かに許可され、コールバックページに自動的にジャンプします。ユーザーが認識しているのは、コールバックページに直接入ることです。
2。snsapi_userinfoによってスコープとして開始されたWebページ認証は、基本的なユーザー情報を取得するために使用されます。ただし、この承認にはユーザーのマニュアルの同意が必要であり、ユーザーが同意しているため、それに注意を払う必要はなく、ユーザーの基本情報を許可後に取得できます。
3。Web認証Access_Tokenと普通のアクセス_Tokenの違い
1。WECHATWebページ認証は、OAUTH2.0メカニズムを通じて実装されます。ユーザーが公式アカウントを承認した後、公式アカウントは、Webページ認証に固有のインターフェイスコール資格情報(Web認証Access_Token)を取得できます。承認インターフェイスコールは、ユーザーの基本情報の取得など、Webページ承認Access_Tokenを介して実行できます。
2。他のWeChatインターフェイスの場合、基本的なサポートの「access_token」インターフェイスを介して通常のアクセス_tokenコールが必要です。
4.認可に同意してコードを取得するために、ユーザーを承認ページに導きます
WeChatが更新された後、承認ページも変更されました。実際、私は古典的な緑のページに慣れています...
JS:
var center = {init:function(){.......}、enterwxauthor:function(){var wxuserinfo = localstorage.getitem( "wxuserinfo"); if(!wxuserinfo){var code = common.geturlparameter( 'code'); if(code){common.getWxuserInfo(); center.init(); } else {// wechatユーザー情報なし、承認なし - >>承認は必要ありません。承認ページwindow.location.href = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='+ wx_appid+'&redirect_uri = '+ウィンドウ。 +'&response_type = code&scope = snsapi_userinfo#wechat_redirect'; }} else {center.init(); }}} $(document).ready(function(){center.enterwxauthor();}例としてscope = snsapi_userinfoを取得します。ページが読み込まれたら、承認方法を入力します。まず、キャッシュからwxuserinfoオブジェクトを取得します。説明がある場合は、初期化方法を直接入力します。そうでない場合は、URLにコードが含まれているかどうかを判断します。コードがある場合、承認ページのコールバックを入力した後のページであることを意味します。次に、コードを介してユーザー情報を交換します。コードはありません。つまり、ユーザーは初めてページを入力し、承認ページにガイドします。 Redirect_uriは現在のページアドレスです。
getWXUSERINFOメソッド:
/ ***承認後にユーザーの基本情報を取得*/ getWxuserInfo:function(par){var code = common.geturlparameter( "code"); if(par)code = par; $ .ajax({async:false、data:{code:code}、type: "get"、url:wx_root + "wechat/authorization"、success:function(json){if(json){try {// wxuserinfoが書かれていることを確認してください。 localStorage.setItem( 'wxuserinfo'、json); // write cache-wechatユーザー情報}} catch(e){// todo:handle例外}}}}}}); }、5。バックエンドRESTFUL- /WECHAT /認証、コードに基づいてユーザー情報を交換する
/*** wechat authorization* @paramコードの使用後に期限切れ** @returnユーザー基本情報* @throws ioexception*/@requestmapping(value = "/authorization"、method = requestmethod.get)public authorizationweixin(@requestparam string code、httpservletrequestリクエスト、httpservletresparesprequest request) request.setcharacterencoding( "utf-8"); Response.setcharacterencoding( "utf-8"); printwriter out = response.getWriter(); logger.info( "restful of authorization parameters code:{}"、code); try {string rs = wechatservice.getoauthaccestoken(code); out.write(rs); logger.info( "restful of authorizationが成功しました。"、rs); } catch(Exception E){logger.error( "restful of authorization is error。"、e); }最後に{out.close(); }}ここには承認されたAccess_Tokenがあります。覚えておいてください:承認されたAccess_TokenはGlobal Access_Tokenではなく、キャッシュの使用が必要です。ここでRedisを使用しています。特定の構成についてはあまり言いません。関連する構成のブログ投稿を後で書きます。もちろん、ehcacheを使用することもできます。私の最初のブログには、EHCAHE構成の詳細な紹介があります。
/ ** *承認されたコードに基づいて認可されたトークンを取得することは、グローバルAccess_tokens * @param code * @return * @throws ioexception * @throws clientProtocolexcescestoken */ throws getoauthaccestoken(string code)throws throws throws clientprotocolexception、ioexception {redisservice.get;文字列rs_access_token = null;文字列rs_openid = null; string url = wx_oauth_access_token_url+"?appid ="+wx_appid+"&secret ="+wx_appsecret+"&code ="+code+"&grant_type = authorization_code"; if(stringutils.isempty(data)){synchronized(this){// exped、string hs = apiservice.doget(url); jsonobject json = jsonobject.parseobject(hs); string refresh_token = json.getString( "refresh_token"); string reffely_url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid="+wx_appid+"&grant_type = refresh_token&refresh_token="+ refresh_token;文字列r_hs = apiservice.doget(refresh_url); jsonobject r_json = jsonobject.parseobject(r_hs); string r_access_token = r_json.getString( "Access_Token"); string r_expires_in = r_json.getString( "expires_in"); rs_openid = r_json.getString( "OpenID"); rs_access_token = r_access_token; redisservice.set( "weixin_sq_access_token"、r_access_token、integer.parseint(r_expires_in)-3600); logger.info( "set sq access_token to redisは成功します。パラメーター時間:{}、realtime"、integer.parseint(r_expires_in)、integer.parseint(r_expires_in)-3600); }} else {//有効期限が切れない文字列hs = apiservice.doget(url); jsonobject json = jsonobject.parseobject(hs); rs_access_token = json.getString( "Access_Token"); rs_openid = json.getString( "openid"); logger.info( "redisからsqアクセス_tokenを取得します。rs_access_token:{}、rs_openid:{}"、rs_access_token、rs_openid); } return getoauthuserinfo(rs_access_token、rs_openid); }/** *承認されたtokenに基づいてユーザー情報を取得 * @param access_token * @param openid * @return */public string getoauthuserinfo(string access_token、string openid){string url = "https://api.weixin.qc.com/sns/userinfo? +"&lang = zh_cn"; try {string hs = apiservice.doget(url); //ユーザー情報SaveWeixinUser(HS); HSを返します。 } catch(ioException e){logger.error( "restful of authorization is error。"、e); } nullを返します。 }私は急いでいて、コードの命名は乱雑でした。ご覧のとおり、同期方法を使用して、Weixin_sq_access_tokenとしてキャッシュからキーを取得しました。命令が取得された場合、httpclientを介してWeChatが提供するインターフェイスを直接呼び出し、ユーザー情報の文字列をフロントエンドに返します。それが取得されない場合、それはそれが失効していない、または期限切れになっていることを意味します。次に、refresh_tokenに従ってアクセス_tokenを更新し、キャッシュを書き込みます。 Access_Tokenの有効期間は短いため、ここでキャッシュの有効期限を設定して、WeChatで与えられた時間をさらに1時間短縮します。コードを振り返ってみると、上記のロジックが少し問題であることがわかりました。このように書くことで、最初の取得またはキャッシュの失敗が最初の取得のためにAccess_Tokenを更新できなくなります。これは当面の使用に影響しません。最適化を行い、後でTODOを変更します。
6:ユーザー情報を保存します
通常、承認後、ユーザー情報をデータベーステーブルに保存し、OpenIDは唯一のプライマリキーとして、そして外部キーは独自のユーザーテーブルを関連付けます。このように、将来どのビジネスを実行したいか、または運用データ統計を実行したいとしても、WeChatパブリックアカウントとの関連があります。取得したHeadimgurlがWeChatが提供するURLアドレスであることは注目に値します。ユーザーがアバターを変更すると、元のアドレスが無効になる可能性があるため、画像をローカルサーバーに保存して、ローカルアドレスURLを保存することをお勧めします。
WeChatによって返される値:
参照リンク:
WeChat Public Platformの公式文書:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842&token=&lang=zh_cn
オンラインインターフェイスデバッグツール:http://mp.weixin.qq.com/debug
公式アカウントの利点なし:テストアカウントアプリケーションhttp://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
上記はこの記事のすべての内容です。この記事の内容が、すべての人の勉強や仕事に役立つことを願っています。また、wulin.comをもっとサポートしたいと思っています!