不嫌代码写的烂 可以参考下

https://github.com/ren2881971/WeChat

着急实现功能 没重构 ######

/**

* 微信授权

*

*

*/

public class CUserOauthWeixinRedirect extends ABaseCommand {

private static final String URL_OAUTH_ACCESS_TOKEN =

"https://api.weixin.qq.com/sns/oauth2/access_token";

private static final String URL_OAUTH_USER_INFO = "https://api.weixin.qq.com/sns/userinfo";

/** 状态:module0xxx010010 模块0xxx0识别ID*/

private String state;

/** 换取access_token票据 */

private String code;

String module;

String id;

String ip;

@Override

public void init() throws Exception {

state = getPara("state");

if (StrKit.isBlank(state)) {

throw new ArgException("状态不正确");

}

String[] moduleInfoArray = state.split(Define.WEIXIN_MODULE_OAUTH_SPLITER);

if (moduleInfoArray.length != 2) {

throw new ArgException("状态不正确");

}

module = moduleInfoArray[0];

if (!Define.validateWeixinModule(module)) {

throw new ArgException("模块不存在");

}

id = moduleInfoArray[1];

code = getPara("code");

Util.assertNotBlank(code, "code不能为空");

ip = "%";

}

@Override

public void doCommand(AResult result) throws Exception {

RedirectResult redirectResult = (RedirectResult) result;

Map queryParas = new HashMap();

queryParas.put("grant_type", "authorization_code");

queryParas.put("appid", Define.WEIXIN_APP_ID);

queryParas.put("secret", Define.WEIXIN_APP_SECRET);

queryParas.put("code", code);

String responseStr = null;

try {

responseStr = HttpKit.get(URL_OAUTH_ACCESS_TOKEN, queryParas);

} catch (Exception e) {

e.printStackTrace();

throw new BizException("微信授权失败");

}

System.out.println(responseStr);

JSONObject accessObj = JSONObject.parseObject(responseStr);

JSONObject userObj = fetchUserInfo(accessObj.getString("access_token"), accessObj.getString("openid"));

userObj.put("ip", ip);

userObj.put("token", accessObj.getString("access_token"));

userObj.put("refreshToken", accessObj.getString("refresh_token"));

userObj.put("expireSeconds", accessObj.getInteger("expires_in"));

UserBind userBind = UserService.service.findUserBindBySource(Define.USER_BIND_TYPE_WEIXIN, userObj.getString("fromId"));

CurrentUser currentUser;

User user = null;

if (userBind == null) {

user = new User();

AuthService.service.registerFromThird(Define.USER_BIND_TYPE_WEIXIN, userObj, user);

System.out.println("用户[openid=" + userObj.getString("fromId") + ", nickname=" + userObj.getString("nickname") + "]注册成功,用户ID为[" + user.getId() + "]");

} else {

user = User.dao.findById(userBind.getToId());

}

currentUser = AuthService.service.login(user, ip);

System.out.println("正在跳转....");

redirectResult.setUrl("http://" + Define.APP_DOMAIN + getRedirectUrl() + "?u=" + currentUser.getId() + "&t=" + currentUser.getToken());

}

private JSONObject fetchUserInfo(String accessToken, String openId) {

Map queryParas = new HashMap();

queryParas.put("access_token", accessToken);

queryParas.put("openid", openId);

String response = HttpKit.get(URL_OAUTH_USER_INFO, queryParas);

System.out.println("user info: " + response);

JSONObject rawUserObj = JSONObject.parseObject(response);

JSONObject userObj = new JSONObject();

userObj.put("fromId", rawUserObj.getString("openid"));

userObj.put("nickname", rawUserObj.getString("nickname"));

int sex = rawUserObj.getInteger("sex");

userObj.put("gender", (sex == 0 || sex == 1) ? Define.GENDER_MALE : Define.GENDER_FEMALE);

userObj.put("province", rawUserObj.getString("province"));

userObj.put("city", rawUserObj.getString("city"));

userObj.put("country", rawUserObj.getString("country"));

userObj.put("avatar", rawUserObj.getString("headimgurl"));

return userObj;

}

// TODO 策略模式重写

private String getRedirectUrl() {

String redirectUrl = "/statics/shop_locals.html";

// 菜单

if (Define.WEIXIN_MODULE_MENU.equals(module)) {

int menuId = Integer.parseInt(id);

if (!Define.validateWeixinModuleMenuId(menuId)) {

throw new ArgException("模块不存在");

}

switch (menuId) {

// --------我要签到

case Define.WEIXIN_MODULE_MENU_ID_CHECKIN_SIGN: {

redirectUrl = "/statics/checkin_sign.html";

break;

}

// --------签到记录

case Define.WEIXIN_MODULE_MENU_ID_CHECKIN_HISTORY: {

redirectUrl = "/statics/checkin_history.html";

break;

}

case Define.WEIXIN_MODULE_MENU_ID_SHOP_LOCALS: {

redirectUrl = "/statics/shop_locals.html";

break;

}

case Define.WEIXIN_MODULE_MENU_ID_SHOP_ACTIVITIES: {

redirectUrl = "/statics/shop_activities.html";

break;

}

// --------我的红包

case Define.WEIXIN_MODULE_MENU_ID_GIFTS: {

redirectUrl = "/statics/gifts.html";

break;

}

// --------我的消息

case Define.WEIXIN_MODULE_MENU_ID_MESSAGES: {

redirectUrl = "/statics/messages.html";

break;

}

// --------我的资料

case Define.WEIXIN_MODULE_MENU_ID_PROFILE: {

redirectUrl = "/statics/profile.html";

break;

}

default:

break;

}

}

// TODO 活动

if (Define.WEIXIN_MODULE_ACTIVITY.equals(module)) {

}

return redirectUrl;

}

@Override

public AResult initResult() {

return new RedirectResult();

}

用的是jfinal,可能不好理解,不过核心代码都在。

思路是:获取到用户信息后,让用户处于登录状态。并且根据state,跳转到相关的页面。

菜单中配置的url形如:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxe0a2ed1be585xxxx&redirect_uri=http://mywebsite.com/user/oauthWeixin&response_type=code&scope=snsapi_userinfo&state=menu0xxx020010#wechat_redirect

######

引用来自“渔樵耕读”的评论

不嫌代码写的烂 可以参考下

https://github.com/ren2881971/WeChat

着急实现功能 没重构

appID=wx29bedaf2e1bd9d2d

appSecret=**********************

开源代码不要把这些放出来啊。 ######哎呀呀 失误失误######可以试试这个https://github.com/chanjarster/weixin-java-tools######这个库 真的很不错。 我一直在学习他~######记得一定要交300给腾讯,不然 。

java设计按月每天签到_签到功能java实现相关推荐

  1. java设计按月每天签到_java微信签到功能实现:java做的一个简易的微信签到系统的案例...

    java微信签到功能实现,现在微信签到功能很流行,这个签到功能帮助微信用户更好的管理自己的微信公众号,那你想知道java微信签到功能如何实现呢,今天小编就特意为大家分享一个关于java微信签到功能实现 ...

  2. java设计是什么软件下载_用Java设计下载软件

    用Java设计下载软件 HTTP 协议的简介 HTTP协议是一种超文本传输协议(Hypertext Transfer Protocol),工作于网络应用层,自1990年起广泛应用于WWW 的全球信息服 ...

  3. mysql 签到_签到功能,用mysql还是redis?

    之前发过一篇:点赞功能用mysql还是redis​mp.weixin.qq.com ?受到大家喜欢,今天看下签到功能怎么选择? 现在的网站和app开发中,签到是一个很常见的功能 如微博签到送积分,签到 ...

  4. java中常量final的用法_详解Java中final的用法

    本文主要介绍了Java中final的使用方法,final是java的关键字,本文就详细说明一下它的使用方法,需要的朋友可以参考下 概念 final 具有"不可改变的"的含义,可以修 ...

  5. java中的标识符和关键字_浅谈java中的标识符、修饰符和关键字

    合法标识符 Java语言中,对于变量,常量,函数,语句块均有名字,我们统统称之为Java标识符.标识符是用来给类.对象.方法.变量.接口和自定义数据类型命名的. 组成:Java标识符由数字,字母和下划 ...

  6. java 反射父类私有属性值_如何在Java中通过反射访问父类的父类的私有字段? - java...

    在一个API中,我使用的是一个抽象类(A类),该类具有一个私有字段(A.privateField). B类在API中扩展了A类. 我需要扩展B类的实现,即C类,但是我需要A类的privateField ...

  7. 孙鑫java高清完整版(课件+视频)_孙鑫Java高清完整版(课件+视频) - 程序语言 - 小木虫 - 学术 科研 互动社区...

    本套光盘由孙鑫老师亲自授课录制.内容涵盖面广,从入门到精通,授课通俗易懂,分析问题独到精辟,学员通过本套光盘的学习,能够快速掌握Java编程语言,成为Java高手. 1.循序渐进 从自学者很难弄明白的 ...

  8. java实训西游记人物实现_学习练习 java编写西游记人物类

    package com.hanqi; public class XiYouJiRenWu { double height; String weapon; String name; void prine ...

  9. java 电池类类代码举例_教案:Java第7章 类的方法

    授课教师:牟勇 课时:100分钟 l 本章技能目标 n 会定义和使用类的方法 n 理解变量作用域 n 会创建包组织Java工程 n 会添加类方法的JavaDoc注释 n 会阅读JavaSE6文档 l ...

  10. java多线程贪吃蛇实验报告_贪吃蛇java实验报告.docx

    贪吃蛇java实验报告 贪吃蛇java实验报告 篇一:JAVA贪吃蛇课程设计报告 <Java应用开发> 课程设计报告 题 目:指导老师:姓 名:专 业:班 级:日 期: JAVA小游戏 - ...

最新文章

  1. java 多维数组转化为字符串
  2. oracle时间相减得到天数_【数列】从错位相减到阿贝尔变换
  3. FAST选址与三维仿真模拟研究
  4. 点击桌面计算机图打不开,idf,手把手教你怎么解决电脑桌面图标打不开
  5. 执行删除操作返回没被删除的信息
  6. SynchronizationContext
  7. 分段二次插值例题_分段三次插值
  8. 深拷贝与浅拷贝、值语义与引用语义对象语义 ——以C++和Python为例
  9. 微信小程序的多选改变样式_微信小程序radio的样式修改
  10. clickhouse CollapsingMergeTree表引擎
  11. [原创]如何培养孩子的自信
  12. PLC与RobotStudio联合仿真调试——项目一
  13. 使用maven引用第三方jar包
  14. Diskpart 删除OEM分区方法,set id=07 override 无效处理方法
  15. 磕磕碰碰中用Visual Studio编译出了64位静态x264和ffmpeg
  16. centos7 npm bulid编译报错解决
  17. php的两种安装方式,PHP的安装方法
  18. .NET动态生成PDF文件(利用iTextSharp)
  19. 图纸转图片cad转换成jpg格式
  20. 大圣归来 三里屯优衣库试衣间是怎么刷爆朋友圈的

热门文章

  1. 硬盘数据恢复工具 硬盘数据恢复需要多少钱
  2. 【浅墨Unity3D Shader编程】之四 热带雨林篇: 剔除、深度测试、Alpha测试以及基本雾效合辑
  3. 短信平台设计和思路G客短信平台移讯云短信系统
  4. ARM Math库的使用
  5. Ubuntu 20.04显卡驱、cuda和cudnn安装以及OpenCV3.3.1的加上openCL和cuda功能编译
  6. Java中static关键字的作用
  7. C语言实现头插法建立单链表
  8. 视频教程-VR局域网对战【捕鱼猎手】实战视频教程(上)-Unity3D
  9. 什么是日光诱导叶绿素荧光?
  10. LBFGS算法的使用~