域名微信拦截html代码,多域名下获取微信openId,通过拦截器注解实现,减少代码量以及业务混淆...
一个注解,一个拦截器,还有一个中转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,通过拦截器注解实现,减少代码量以及业务混淆...相关推荐
- 微信h5静默、非静默授权获取用户openId的方法和步骤
微信h5静默.非静默授权获取用户openId的方法和步骤: 一.openId是什么? openId是用户在当前公众号下的唯一标识('身份证'),就是说通过这个openId,就能区分在这个公众号下具体是 ...
- php获取微信公众号用户信息头像,微信公众号的web页面如何获取微信用户名和头像?...
首先,你的网站入口必须是微信服务号(开通认证.拥有获取用户openid权限:订阅号是不行的). 方法:网页通过微信的Oauth2认证链接.(必须是微信的内置浏览器,通过微信服务号进入) 操作:通过服务 ...
- 微信公众平台开发—利用OAuth2.0获取微信用户基本信息
1.首先在某微信平台下配置OAuth2.0授权回调页面: 2.通过appid构造url获取微信回传code值(appid可在微信平台下找到) 1).微信不弹出授权页面url: A.code回传到页面w ...
- C++在windows下获取本地主机ipv4地址和ipv6地址的代码
把内容过程中经常用的内容段记录起来,下面内容段是关于C++在windows下获取本地主机ipv4地址和ipv6地址的内容,应该是对码农有所用处. #include <Winsock2.h> ...
- Python 微信自动化工具开发系列02_自动获取微信多个好友聊天信息(2023年1月可用)
前言 一个需求需要利用Python+第三方库wxauto 用于微信上自动获取聊天信息,从而根据自己需求对信息自动进行二次处理, 比如自动回复,再比如自动发送文件或者其他.--- 记录于2022年07月 ...
- 微信支付接口升级(开通微信代金券)第一步:获取微信沙盒签名
吐槽:微信官方文档写得简直是高山流水,望而却步,让人看得头皮发麻. ps:如果是没有后台代码或开发人员的朋友,请联系我qq2294974790,可以帮忙开通(收费80:需要商户号和微信秘钥) 好了,言 ...
- 反编译微信小程序,win电脑解析获取微信小程序源码
好不容易写的小程序然后忘记保存被删了怎么办?不要慌这里就教你怎么搞. 环境准备 1.node 环境准备 Node下载地址 安装后将nodejs设置为环境变量. 打开cmd,测试是否安装成功:在命令行输 ...
- 获取微信昵称乱码php,Android 微信登录昵称乱码问题,及获取微信用户信息
微信第三方登录时昵称,username乱码问题解决方法如下: /** * 获取微信用户信息 * @param access_token 调用凭证 * @param openid 普通用户的标识,对当前 ...
- 微信小程序开发之如何哪获取微信小程序的APP ID
微信小程序的开发工具,在新建项目的时候,默认提示填写APP ID,如果不填写AppID 也是可以本地测试和开发的,但是无法通过手机调试,只能在开发工具里查看 如果需要真机调试微信小程序,需要安装微信6 ...
- android 微信乱码问题怎么解决方法,Android 微信登录昵称乱码问题,及获取微信用户信息...
微信第三方登录时昵称,username乱码问题解决方法如下: /** * 获取微信用户信息 * @param access_token 调用凭证 * @param openid 普通用户的标识,对当前 ...
最新文章
- DOS攻击之详解--转载
- linux中wps默认安装目录,centos6.5 安装wps linux
- QQ空间相册展示特效
- 开发中最常使用到那些设计模式?
- lsass.exe文件丢失,损坏
- P5170 【模板】类欧几里得算法
- 快速入门python_一天快速入门 Python
- OPPO K9s官宣:5000mAh超大电量 充电功率阉割明显
- 毕业生推荐表计算机水平新国二,实用信息 | 2018届毕业指南:毕业生推荐表与三方协议...
- Exchange Server 2007迁移Exchange Server 2010 (15)---启用Outlook anywhere
- 网络课大学计算机基础考试,《大学计算机基础》课程期末考试笔试说明
- Ueditor编辑器如何改变上传图片大小限制
- 2015陈奕迅another eason‘s life演唱会歌单
- linux固态硬盘检测,linux 检查硬盘是 SSD or HDD
- 安装包时遇到 requires a peer of @angular/core、unmet peer dependency...的问题
- 用程序员的语言:5000工科男抢200女同学做女朋友,怎么完美解决
- 【我的OpenGL学习进阶之旅】介绍一下 绘制图元
- 「MySQL 数据库 存储引擎」InnoDB和MyIsAm的区别
- 一个接口满足你对天气数据的所有想象,包含小时预报,实况,逐日预报,城市预报,实况,雷达月报,生活指数
- SQL_菜鸟教程_unique、primary key、foreign key
热门文章
- Skippr – 轻量、快速的 jQuery 幻灯片插件
- 教授专栏17 | 许佳龙:银行查找网安漏洞 提高公众风险意识
- android 自动点击sdk,Android 自动化记录: OPPO 、VIVO SDK 登录自动化处理
- C语言 | 计算某日是该年的第几天
- 认识ZBrush? 4R7视图区
- Win10下用Anaconda安装TensorFlow
- 如何给孩子的作文下评语
- 阿里高级测开:软件测试(功能、接口、性能、自动化)详解
- php 英文替换中文,php如何中英文符号替换?
- php实现文本替换,php如何实现汉字替换