一个注解,一个拦截器,还有一个中转html页(来源网上,稍微修改),原理看拦截器的类注解。package com.xxx.admin.interceptor;

import com.xxx.core.annotation.GetOpenId;

import com.jfinal.aop.Interceptor;

import com.jfinal.aop.Invocation;

import com.jfinal.weixin.sdk.api.SnsAccessToken;

import com.jfinal.weixin.sdk.api.SnsAccessTokenApi;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import java.net.URLEncoder;

/**

* 模板

* 多域名获取openid 样例DEMO

* B.getOpenid(一般是充值页面路由) -->A.GETWXCODE.html-->weixin--> A.GETWXCODE.html?redirect_uri=B.getOpenid&code=XXX --(redirect_uri)--> B.getOpenid?code=XXX

* http://有页面回调权限的项目域名/GETWXCODE.html?appid=APPID&response_type=code&redirect_uri=Encode(GETWXCODE.html?redirect_uri=当前请求地址)&scope=snsapi_base&state=wx#wechat_redirect

* 当前请求参数不要用?a=1&b=1传参数,用jfinal的/a-b-c形式传参

*

* 获得的openId被存在会话session中,后续接口可以直接获取

* @author WesleyOne

* @create 2018/8/19

*/

public class _GetOpenidInterceptor implements Interceptor {

private static final Logger LOG    = LoggerFactory.getLogger(_GetOpenidInterceptor.class);

@Override

public void intercept(Invocation inv) {

GetOpenId getOpenId = inv.getMethod().getAnnotation(GetOpenId.class);

if (getOpenId == null) {

inv.invoke();

return;

}

//会话中已经存在openId就不获取

if (inv.getController().getSessionAttr("wxopenid")!=null){

inv.invoke();

return;

}

//不在微信浏览器的也不获取

String userAgent = inv.getController().getHeader("user-agent");

boolean isWx = false;

if (userAgent!=null){

userAgent = userAgent.toLowerCase();

if (userAgent.indexOf("micromessenger") > -1){

isWx = true;

}

}

inv.getController().setAttr("isWx",isWx);

if (!isWx){

inv.invoke();

return;

}

// 当前是跳转页面业务逻辑先处理,再获取openId

inv.invoke();

String code = inv.getController().getPara("code");

StringBuffer requestURL = inv.getController().getRequest().getRequestURL();

// TODO 你的配置项

String wxAppId = "你的微信APPID";

String wxAppSecret = "你的微信APPSECRET";

String domain = "有页面回调权限的项目域名";

if (code == null){

LOG.info("获取code url={}",requestURL);

//拼接当前路由作为回调地址,请求回调中转页

String redirectdomain = "http://"+domain+"/GETWXCODE.html";

// 当前路由全名

String url = redirectdomain+"?appid="+wxAppId+"&scope=snsapi_base&state=STATE&redirect_uri="+URLEncoder.encode(redirectdomain+"?redirect_uri="+requestURL.toString());

inv.getController().redirect(url,true);

return;

}else {

//获取到了code,以获取openid

LOG.info("获取到code={} url={}",code,requestURL);

SnsAccessToken snsAccessToken = SnsAccessTokenApi.getSnsAccessToken(wxAppId, wxAppSecret, code);

if (snsAccessToken == null||snsAccessToken.getOpenid()==null){

inv.getController().renderText("非法操作");

return;

}

inv.getController().setSessionAttr("wxopenid",snsAccessToken.getOpenid());

}

}

}package com.xxx.core.annotation;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/**

* 获取openId

*/

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

public @interface GetOpenId {

}html>

微信登陆

function getUrlParams(key) {

var args = {};

var pairs = location.search.substring(1).split('&');

for (var i = 0; i

var pos = pairs[i].indexOf('=');

if (pos === -1) {

continue;

}

args[pairs[i].substring(0, pos)] = decodeURIComponent(pairs[i].substring(pos + 1));

}

return args[key];

}

function appendParams(params, url) {

var baseWithSearch = url.split('#')[0];

var hash = url.split('#')[1];

for (var i = 0; i

if (params[i].value !== undefined) {

var newParam = params[i].key + "=" + params[i].value;

if (baseWithSearch.indexOf('?') > 0) {

var oldParamReg = new RegExp(params[i].key + '=[-\\w]{0,40}', 'g');

if (oldParamReg.test(baseWithSearch)) {

baseWithSearch = baseWithSearch.replace(oldParamReg, newParam);

} else {

baseWithSearch += "&" + newParam;

}

} else {

baseWithSearch += "?" + newParam;

}

}

}

if (hash) {

url = baseWithSearch + '#' + hash;

} else {

url = baseWithSearch;

}

return url;

}

var code = getUrlParams('code');

var appId = getUrlParams('appid');

var scope = getUrlParams('scope') || 'snsapi_base';

var state = getUrlParams('state');

var redirectUrl;

if (!code) {

redirectUrl = appendParams([{

key: 'appid',

value: appId

}, {

key: 'redirect_uri',

value: encodeURIComponent(location.href)

}, {

key: 'response_type',

value: 'code'

}, {

key: 'scope',

value: scope

}, {

key: 'state',

value: state

}], 'https://open.weixin.qq.com/connect/oauth2/authorize#wechat_redirect');

} else {

redirectUrl = appendParams([{key: 'code', value: code},{

key: 'state',

value: state

}], getUrlParams('redirect_uri'));

}

location.href = redirectUrl;

域名微信拦截html代码,多域名下获取微信openId,通过拦截器注解实现,减少代码量以及业务混淆...相关推荐

  1. 微信h5静默、非静默授权获取用户openId的方法和步骤

    微信h5静默.非静默授权获取用户openId的方法和步骤: 一.openId是什么? openId是用户在当前公众号下的唯一标识('身份证'),就是说通过这个openId,就能区分在这个公众号下具体是 ...

  2. php获取微信公众号用户信息头像,微信公众号的web页面如何获取微信用户名和头像?...

    首先,你的网站入口必须是微信服务号(开通认证.拥有获取用户openid权限:订阅号是不行的). 方法:网页通过微信的Oauth2认证链接.(必须是微信的内置浏览器,通过微信服务号进入) 操作:通过服务 ...

  3. 微信公众平台开发—利用OAuth2.0获取微信用户基本信息

    1.首先在某微信平台下配置OAuth2.0授权回调页面: 2.通过appid构造url获取微信回传code值(appid可在微信平台下找到) 1).微信不弹出授权页面url: A.code回传到页面w ...

  4. C++在windows下获取本地主机ipv4地址和ipv6地址的代码

    把内容过程中经常用的内容段记录起来,下面内容段是关于C++在windows下获取本地主机ipv4地址和ipv6地址的内容,应该是对码农有所用处. #include <Winsock2.h> ...

  5. Python 微信自动化工具开发系列02_自动获取微信多个好友聊天信息(2023年1月可用)

    前言 一个需求需要利用Python+第三方库wxauto 用于微信上自动获取聊天信息,从而根据自己需求对信息自动进行二次处理, 比如自动回复,再比如自动发送文件或者其他.--- 记录于2022年07月 ...

  6. 微信支付接口升级(开通微信代金券)第一步:获取微信沙盒签名

    吐槽:微信官方文档写得简直是高山流水,望而却步,让人看得头皮发麻. ps:如果是没有后台代码或开发人员的朋友,请联系我qq2294974790,可以帮忙开通(收费80:需要商户号和微信秘钥) 好了,言 ...

  7. 反编译微信小程序,win电脑解析获取微信小程序源码

    好不容易写的小程序然后忘记保存被删了怎么办?不要慌这里就教你怎么搞. 环境准备 1.node 环境准备 Node下载地址 安装后将nodejs设置为环境变量. 打开cmd,测试是否安装成功:在命令行输 ...

  8. 获取微信昵称乱码php,Android 微信登录昵称乱码问题,及获取微信用户信息

    微信第三方登录时昵称,username乱码问题解决方法如下: /** * 获取微信用户信息 * @param access_token 调用凭证 * @param openid 普通用户的标识,对当前 ...

  9. 微信小程序开发之如何哪获取微信小程序的APP ID

    微信小程序的开发工具,在新建项目的时候,默认提示填写APP ID,如果不填写AppID 也是可以本地测试和开发的,但是无法通过手机调试,只能在开发工具里查看 如果需要真机调试微信小程序,需要安装微信6 ...

  10. android 微信乱码问题怎么解决方法,Android 微信登录昵称乱码问题,及获取微信用户信息...

    微信第三方登录时昵称,username乱码问题解决方法如下: /** * 获取微信用户信息 * @param access_token 调用凭证 * @param openid 普通用户的标识,对当前 ...

最新文章

  1. DOS攻击之详解--转载
  2. linux中wps默认安装目录,centos6.5 安装wps linux
  3. QQ空间相册展示特效
  4. 开发中最常使用到那些设计模式?
  5. lsass.exe文件丢失,损坏
  6. P5170 【模板】类欧几里得算法
  7. 快速入门python_一天快速入门 Python
  8. OPPO K9s官宣:5000mAh超大电量 充电功率阉割明显
  9. 毕业生推荐表计算机水平新国二,实用信息 | 2018届毕业指南:毕业生推荐表与三方协议...
  10. Exchange Server 2007迁移Exchange Server 2010 (15)---启用Outlook anywhere
  11. 网络课大学计算机基础考试,《大学计算机基础》课程期末考试笔试说明
  12. Ueditor编辑器如何改变上传图片大小限制
  13. 2015陈奕迅another eason‘s life演唱会歌单
  14. linux固态硬盘检测,linux 检查硬盘是 SSD or HDD
  15. 安装包时遇到 requires a peer of @angular/core、unmet peer dependency...的问题
  16. 用程序员的语言:5000工科男抢200女同学做女朋友,怎么完美解决
  17. 【我的OpenGL学习进阶之旅】介绍一下 绘制图元
  18. 「MySQL 数据库 存储引擎」InnoDB和MyIsAm的区别
  19. 一个接口满足你对天气数据的所有想象,包含小时预报,实况,逐日预报,城市预报,实况,雷达月报,生活指数
  20. SQL_菜鸟教程_unique、primary key、foreign key

热门文章

  1. Skippr – 轻量、快速的 jQuery 幻灯片插件
  2. 教授专栏17 | 许佳龙:银行查找网安漏洞 提高公众风险意识
  3. android 自动点击sdk,Android 自动化记录: OPPO 、VIVO SDK 登录自动化处理
  4. C语言 | 计算某日是该年的第几天
  5. 认识ZBrush? 4R7视图区
  6. Win10下用Anaconda安装TensorFlow
  7. 如何给孩子的作文下评语
  8. 阿里高级测开:软件测试(功能、接口、性能、自动化)详解
  9. php 英文替换中文,php如何中英文符号替换?
  10. php实现文本替换,php如何实现汉字替换