WeChat Open Platform Access ، موقع الويب الرسمي: https://open.weixin.qq.com ، يمكنك الحصول على app_id و app_secret بعد تسجيل وإضافة تطبيقات على الموقع الرسمي.
الخطوة 1: إنشاء واجهة ترث AuthService ، WeChatauthService ، على النحو التالي
الواجهة العامة WeChatauthService يمتد AuthService {public jsonobject getUserInfo (String AccessToken ، String OpenId) ؛}الخطوة 2: التنفيذ المحدد لـ WeChatservice هو كما يلي
ServicePublic Class WeChatauthServiceImpl يمتد defaultauthServiceImpl تنفذ WeChatauthService {private logger logger = loggerfactory.getLogger (WeChatauthServiceImpl.Class) ؛ "https://open.weixin.qq.com/connect/qrconnect؟appid=٪S&Redirect_uri=٪S&Response_type=code&scope=٪S&State=٪S#Wechat_Redirect" ؛ // احصل على عنوان URL الخاص بالمستخدم OpenId و Access-Tek-Tek Static Final String AccessToke_OpenID_URL = "https://api.weixin.qq.com/sns/oauth2/access_token؟appid=٪S&Secret=٪S&code=٪S&Type=authorization_code" ؛ Static Final String refresh_token_url = "https://api.weixin.qq.com/sns/oauth2/refresh_token؟appid=٪S&grant_type=refresh_token&refresh_token=٪S" ؛ Static Static Final String user_info_url = "https://api.weixin.qq.com/sns/userinfo؟access_token=٪S&openid=٪S&Lang=ZH_CN" ؛ Static Final String app_id = "xxxxxx" ؛ السلسلة النهائية الثابتة الخاصة app_secret = "xxxxxx" ؛ scope scope static static static static = "snsapi_login" ؛ سلسلة Private Callbackurl = "https://www.xxx.cn/auth/wechat" ؛ // استدعاء اسم المجال Override public getauthorizationurl () يلقي UnsupportedEncodingException {callbackurl = urlencoder.encode (callbackurl ، "UTF-8") ؛ url url = string.format (elevization_url ، app_id ، callbackurl ، scope ، system.currentTimeMillis ()) ؛ إرجاع عنوان URL ؛ } Override public string getAccessToken (رمز السلسلة) {String url = string.format (AccessToke_Openid_url ، App_id ، App_secret ، Code) ؛ uricomponentsbuilder builder = uricomponentsbuilder.fromhttpurl (url) ؛ uri uri = builder.build (). encode (). touri () ؛ السلسلة resp = getRestTemplate (). getForObject (uri ، string.class) ؛ logger.error ("getAccessToken resp ="+resp) ؛ if (resp.contains ("OpenId")) {jsonobject jsonobject = jsonobject.parseObject (resp) ؛ string access_token = jsonobject.getString ("access_token") ؛ String OpenId = jsonobject.getString ("OpenId") ؛؛ jsonobject res = new jsonobject () ؛ res.put ("Access_Token" ، Access_Token) ؛ res.put ("OpenId" ، OpenId) ؛ res.put ("refresh_token" ، jsonobject.getString ("revish_token")) ؛ return res.tojsonstring () ؛ } آخر {رمي ServiceException ("فشل الرمز المميز ، msg ="+resp) ؛ }} // في واجهة WeChat ، عودة رمزية ومفتوحة معًا ، لذلك لا يلزم تنفيذ هذه الطريقة على everride public getOpenId (string accessToken) {return null ؛ } Override public JSonObject getUserInfo (string accessToken ، String OpenId) {String url = string.format (user_info_url ، AccessToken ، OpenId) ؛ uricomponentsbuilder builder = uricomponentsbuilder.fromhttpurl (url) ؛ uri uri = builder.build (). encode (). touri () ؛ السلسلة resp = getRestTemplate (). getForObject (uri ، string.class) ؛ logger.error ("getUserInfo resp ="+resp) ؛ if (resp.contains ("errcode")) {رمي خدمة جديدة ("خطأ في الحصول على معلومات المستخدم ، msg ="+resp) ؛ } آخر {jsonobject data = jsonobject.parseObject (resp) ؛ JSonObject Result = New JSonObject () ؛ result.put ("id" ، data.getString ("UnionId")) ؛ result.put ("lamname" ، data.getString ("lamname")) ؛ result.put ("Avatar" ، data.getString ("Headimgurl")) ؛ نتيجة العودة }} // الرمز المميز لـ WeChat يحتوي على فترة صلاحية لمدة ساعتين فقط ، ويجب إعادة تشكيلها من وقت لآخر ، وبالتالي فإن المسؤول يوفر طريقة لتحديث الحمل والحصول على الرمز المميز وفقًا لـ refresh_token. لا يحصل هذا المشروع على معلومات // فقط ويخزن المعلومات في المكتبة ، لذا فإن ساعتين تكفيون على Override public string refreshtoken (String refresh_token) {String url = string.format (refresh_token_url ، app_id ، refresh_token) ؛ uricomponentsbuilder builder = uricomponentsbuilder.fromhttpurl (url) ؛ uri uri = builder.build (). encode (). touri () ؛ استجابة <JsonObject> resp = getRestTemplate (). jsonobject jsonobject = resp.getBody () ؛ string access_token = jsonobject.getString ("access_token") ؛ إرجاع Access_Token ؛ }}الخطوة 3:
يسمى في وحدة التحكم ، الرمز كما يلي:
requestmapping (value = "/wxloginPage" ، method = requestMethod.get) public jsonobject wxloginPage () يلقي الاستثناء {string uri = wechatauthservice.getauthorizationurl () ؛ عودة تسجيل الدخول (URI) ؛ } @requestmapping (value = "/weChat") رد اتصال باطل عام (رمز السلسلة ، طلب httpservletrequest ، httpservletresponse) يلقي استثناء {String result = wechatauthService.getAccessToken (رمز) ؛ jsonobject jsonobject = jsonobject.parseObject (النتيجة) ؛ string access_token = jsonobject.getString ("access_token") ؛ string openId = jsonobject.getString ("OpenId") ؛ // String Refresh_token = jSonObject.getString ("revish_token") ؛ // حفظ Access_token إلى ملف تعريف الارتباط ، الذي انتهت صلاحيته لمدة ساعتين Cookie AccessTokencooke = New Cookie ("AccessToken" ، Access_Token) ؛ AccessTokenCookie.setMaxage (60 *2) ؛ Response.addcookie (AccessTokenCookie) ؛ cookie openidcookie = cookie new ("OpenId" ، OpenId) ؛ OpenIdCookie.setMaxage (60 *2) ؛ Response.addcookie (OpenIdcookie) ؛ // احكم على ما إذا كان المستخدم قد سجل الدخول على أساس OpenID. kmsuser user = userservice.getuserByCondition (OpenId) ؛ if (user == null) {response.sendRedirect (request.getContextPath () + "/student/html/index.min.html#/bind؟type="+constants.login_type_wechat) ؛ } آخر {// إذا كان المستخدم موجودًا بالفعل ، فقم بتسجيل الدخول مباشرة إلى reponse.sendRedirect (request.getContextPath () + "/student/html/index.min.html#/app/home؟open_id=" + openID) ؛ }} الخطوة 4:
في مكتب الاستقبال JS ، طلب أولاً Auth/WxloginPage ، والحصول على عنوان التفويض ، واتصل مرة أخرى/Auth/WeChat بعد إذن المستخدم ، ثم إجراء معالجة منطقية في هذه الطريقة.
واجهت المشاكل:
1. عند تكوين اسم مجال رد الاتصال في موقع WeChat الرسمي ، لا تحتاج إلى بعض بروتوكولات HTTP أو HTTPS. تحتاج فقط إلى كتابة المجال. على سبيل المثال ، http://baidu.com ، تحتاج فقط إلى ملء baidu.com. إذا كنت ترغب في القفز إلى وحدة تحكم أسفل المشروع ، مثل baidu.com/auth/wechat ، فأنت بحاجة فقط إلى تكوين baidu.com ، ولا تحتاج إلى تحديد المصادقة/WeChat اللاحقة. يمكن كتابة العنوان اللاحق على عنوان رد الاتصال في الكود. يجب تكوين الرمز على أنه https://baidu.com/auth/wechat.
2. عند القفز إلى واجهة رمز الاستجابة السريعة المعتمدة ، ستواجه الموقف الذي لا يمكن إصدار رمز الاستجابة السريعة. هذا بسبب عنوان رد الاتصال في الكود. لا ينبغي أن تكون هناك مشكلة في تكوين الطريقة في الكود أعلاه.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.