في تطوير WeChat ، غالبًا ما تكون هناك احتياجات مثل: الحصول على صور شخصية ، وربط حسابات WeChat لإرسال رسائل إلى المستخدمين ... ثم المتطلب السابق لتحقيق هذه التصريح!
1. تكوين اسم مجال رد الاتصال الآمن:
قبل طلب تفويض صفحة الويب للمستخدم بواسطة حساب WeChat العام ، يحتاج المطورون إلى الانتقال إلى خيار التكوين "للتطوير - أذونات الواجهة - خدمات الويب - حسابات الويب - ترخيص الويب للحصول على معلومات أساسية للمستخدم" في الموقع الرسمي للمنصة العامة لتعديل اسم مجال رد الاتصال. تجدر الإشارة إلى أن هذا هو كتابة اسم المجال الكامل مباشرة ، مثل: www.liliangel.cn. ومع ذلك ، في تطورنا لـ H5 ، نستخدم عمومًا أسماء المجال الثانوية ، مثل: H5.liliangel.cn ، والتي تقع أيضًا في أسماء مجال رد الاتصال الآمنة.
2. ترخيص مستوى المستخدم والترخيص الصامت
1. يتم استخدام ترخيص صفحة الويب التي تم تشغيلها بواسطة SNSAPI_Base للحصول على OpenID للمستخدم الذي يدخل الصفحة ، ويتم تصريحه بصمت وقفز تلقائيًا إلى صفحة رد الاتصال. ما يدركه المستخدم هو أنه يدخل مباشرة إلى صفحة رد الاتصال.
2. ترخيص صفحة الويب التي بدأها SNSAPI_USERINFO حيث يتم استخدام نطاق للحصول على معلومات المستخدم الأساسية. ومع ذلك ، يتطلب هذا التفويض الموافقة اليدوية للمستخدم ، وبما أن المستخدم قد وافق ، فليس من الضروري الانتباه إليها ويمكن الحصول على المعلومات الأساسية للمستخدم بعد التفويض.
3. الفرق بين ترخيص الويب Access_Token و Access_Token
1. يتم تنفيذ ترخيص صفحة WeChat على الويب من خلال آلية OAUTH2.0. بعد أن يصرح المستخدم بالحساب الرسمي ، يمكن للحساب الرسمي الحصول على بيانات اعتماد مكالمة واجهة (Accountization Account_token) الفريدة من نوعها على إذن صفحة الويب. يمكن تنفيذ استدعاء واجهة التفويض من خلال Authorization Authorization Account_token ، مثل الحصول على معلومات أساسية للمستخدم ؛
2. بالنسبة للواجهات الأخرى لـ WeChat ، هناك حاجة إلى مكالمات Access_Token العادية من خلال واجهة "Get Access_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 () ؛ } آخر {// لا معلومات مستخدم WeChat ، لا يوجد إذن ->> مطلوب ، القفز إلى Window.location.location.location.location. +'& response_type = code & scope = snsapi_userinfo#wechat_redirect' ؛ }} آخر {center.init () ؛ } سترخذ النطاق = SNSAPI_USERINFO كمثال. عند تحميل الصفحة ، أدخل طريقة التفويض. أولاً ، احصل على كائن WxuserInfo من ذاكرة التخزين المؤقت. إذا كان هناك أي تفسير ، أدخل طريقة التهيئة مباشرة. إذا لم يكن كذلك ، حدد ما إذا كان عنوان URL يحتوي على رمز. إذا كان هناك رمز ، فهذا يعني أن الصفحة هي بعد إدخال رد الاتصال على صفحة التفويض. ثم تبادل معلومات المستخدم من خلال الرمز. لا يوجد رمز ، أي أن المستخدم يدخل الصفحة لأول مرة ويرشيد صفحة التفويض. Redirect_uri هو عنوان الصفحة الحالي.
طريقة getWxuserInfo:
/ *** احصل على المعلومات الأساسية للمستخدم بعد التخويل*/ getWxuserInfo: function (par) {var code = common.geturlparameter ("code") ؛ إذا (par) رمز = par ؛ $ .ajax ({async: false ، البيانات: {code: code} ، اكتب: "get" ، url: wx_root + "weChat/Authorization" ، النجاح: الدالة (json) {if (json) localstorage.setitem ('wxuserinfo' ، json) ؛ // اكتب ذاكرة التخزين المؤقت-معلومات مستخدم cache-wechat}} catch (e) {// todo: handle exception}}}}}}) ؛ } ،5. الواجهة الخلفية راحة- /WeChat /إذن ، تبادل معلومات المستخدم بناءً على الكود
/*** WeChat Authorization* param code انتهاء صلاحية بعد استخدام** return المعلومات الأساسية للمستخدم* throws ioException*/ @requestmapping (value = "/upitarization" ، method = requestMethod.get) public void upervizationwixin ( @requestparam code ، httpservletrequest request. request.setcharacterencoding ("UTF-8") ؛ استجابة. setcharacterencoding ("UTF-8") ؛ printWriter out = response.getWriter () ؛ logger.info ("RESTful of Euallization Parameters Code: {}" ، code) ؛ Try {String rs = WeChatservice.getoAuthAccessToken (Code) ؛ Out.write (Rs) ؛ logger.info ("Restful of Ouplistization ناجحة." ، Rs) ؛ } catch (استثناء e) {logger.error ("RESTFLE OF OUTARINGER IS ERROR." ، e) ؛ } أخيرًا {out.close () ؛ }}هناك Access_token هنا. تذكر: Acturance Access_Token ليس Global Access_Token ، ويتطلب استخدام ذاكرة التخزين المؤقت. أنا استخدم redis هنا. لن أقول الكثير عن التكوين المحدد وكتابة منشور مدونة التكوين ذات الصلة لاحقًا. بالطبع ، يمكنك أيضًا استخدام Ehcache. هناك مقدمة مفصلة لتكوين Ehcahe في مدونتي الأولى.
/ ** * احصل على الرموز المصرح بها بناءً على الكود فقط عند التصريح ، تختلف عن Global Access_Tokens * param code * @therws IoException * throws clientprotocolexception */ public string getOauthAccessToken (رمز السلسلة) clientprotocolexception ، ioexception {string data = rediService. String rs_access_token = null ؛ String rs_openid = null ؛ String url = wx_oauth_access_token_url+"؟ appid ="+wx_appid+"& secret ="+wx_appsecret+"& code ="+code+"& grant_type = electization_code" ؛ if (stringUtils.isempty (data)) {synchronized (this) {// منتهية الصلاحية ، السلسلة hs = apiservice.doget (url) ؛ jsonobject json = jsonobject.parseObject (HS) ؛ String refresh_token = json.getString ("refresh_token") ؛ String refresh_url = "https://api.weixin.qq.com/sns/oauth2/refresh_token؟appid="+wx_appid+"&grant_type=refresh_token&refresh_token="+refresh_token ؛ String 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) ؛ }} آخر {// غير منتهية الصلاحية HS = APIService.doget (url) ؛ jsonobject json = jsonobject.parseObject (HS) ؛ rs_access_token = json.getString ("access_token") ؛ rs_openid = json.getString ("OpenId") ؛ logger.info ("Get SQ Access_token من Redis ناجح. rs_access_token: {} ، rs_openid: {}" ، rs_access_token ، rs_openid) ؛ } return getoauthuserInfo (rs_access_token ، rs_openid) ؛ }/** * احصل على معلومات المستخدم بناءً على الرمز المميز المعتمد * param access_token * param openId * @regurn */public string getOauthuserInfo (string access_token ، string openId) {String url = "https://api.weixin.qq.com/sns/userinfo؟ +"& lang = zh_cn" ؛ حاول {String HS = Apiservice.doget (url) ؛ // حفظ معلومات المستخدم SaveWeixinuser (HS) ؛ إرجاع HS ؛ } catch (ioException e) {logger.error ("Restful of Oudformation خطأ." ، e) ؛ } إرجاع فارغ ؛ }كنت في عجلة من أمري وكان رمز تسمية الفوضى. كما ترون ، استخدمت طريقة التزامن للحصول على المفتاح من ذاكرة التخزين المؤقت مثل weixin_sq_access_token. إذا تم استرداد التعليمات ، فسوف أتصل مباشرة بالواجهة التي توفرها WeChat من خلال httpclient وإرجاع سلسلة معلومات المستخدم إلى الواجهة الأمامية. إذا لم يتم استرداده ، فهذا يعني أنه ليس أو انتهى به الأمر. ثم قم بتحديث Access_Token وفقًا لـ Refresh_token واكتب ذاكرة التخزين المؤقت. نظرًا لأن Access_token لديه فترة صلاحية قصيرة ، قمت بتعيين وقت انتهاء صلاحية ذاكرة التخزين المؤقت هنا لتقليل الوقت الذي قدمته WeChat لمدة ساعة أخرى. إذا نظرنا إلى الوراء في الكود ، وجدت أن المنطق أعلاه يمثل مشكلة صغيرة. ستؤدي الكتابة مثل هذه إلى أول عملية استحواذ أو فشل ذاكرة التخزين المؤقت في تحديث Access_Token للاستحواذ الأول ، والتي لن تؤثر على الاستخدام في الوقت الحالي. سأجعل التحسين وتعديل TODO لاحقًا.
6: حفظ معلومات المستخدم
عادة ، بعد التفويض ، سنوفر معلومات المستخدم إلى جدول قاعدة البيانات ، مع OpenID كمفتاح أساسي الوحيد ، والمفاتيح الأجنبية المرتبطة بجدول المستخدم الخاص بنا. وبهذه الطريقة ، بغض النظر عن العمل الذي نريد تنفيذه في المستقبل أو القيام بإحصائيات البيانات التشغيلية ، لدينا ارتباط بحساب WeChat العام. تجدر الإشارة إلى أن Headimgurl التي حصلنا عليها هي عنوان URL الذي توفره WeChat. عندما يقوم المستخدم بتعديل الصورة الرمزية ، قد يكون العنوان الأصلي غير صالح ، لذلك من الأفضل حفظ الصورة على الخادم المحلي ثم حفظ عنوان URL للعنوان المحلي!
القيمة التي تم إرجاعها بواسطة WeChat:
الرابط المرجعي:
وثيقة رسمية لمنصة WeChat العامة: 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 أكثر!