java实现微信扫一扫详解
java实现微信扫一扫详解
一、微信JS-SDK参数配置及查找
JS安全域名配置(查找:微信公众号里-公众号设置-功能设置页)
注:1、安全域名外网必须可以访问的到
2、域名不能有下划线
3、要将(MP_verify_ZTbWVRm4MwKyq8mw.txt)次文件放到项目根目录下,也就是上面的域名+次文件名称外网可以访问的到。
AppID、AppSecret及IP白名单设置。(微信公众号里-开发者中心-基本设置)
注:1、AppSecret获取到一定一定一定要找个地方记下来,不然下一次还要重新获取这样会影响其他已开发项目的使用。
2、IP名单需要配置部署服务器IP。
二、前端代码
首先要引入微信提供的js库
<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
通过config接口进行权限认证-error接口进行处理失败认证-wx.scanQRCode({})扫一扫接口调用;
注:1、config接口参数,这里是通过ajax方式从后台获取,后面代码会粘出来。
2、debug在调试阶段值设置为true。
<script type="text/javascript">
var timestamp = "";
var nonceStr = "";
var signature = "";
$.ajax({
url:"${pageContext.request.contextPath}/web/wxConfig/getWxConfig",
data:{},
type:"POST",
dataType:"json",
async:false,
cache:false,
success:function(data){
timestamp = data.wxConfig.timestamp;
nonceStr = data.wxConfig.nonceStr;
signature = data.wxConfig.signature;
}
});
wx.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: "xxxxxxxxxx", // 必填,公众号的唯一标识
timestamp: timestamp, // 必填,生成签名的时间戳 ${wxConfig.timestamp}
nonceStr: nonceStr, // 必填,生成签名的随机串 ${wxConfig.nonceStr}
signature: signature,// 必填,签名,见附录1 ${wxConfig.signature}
jsApiList: ['scanQRCode'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
wx.error(function(res) {
alert("出错了:" + res.errMsg);
});
$("#train_signStatus").click(function() {
wx.scanQRCode({
needResult : 1,
desc : 'scanQRCode desc',
success : function(res) {
var url = res.resultStr;
var memberId = $.cookie('userId');
var trainingId=url.substr(url.indexOf("trainingId=")+11,32);
var type = url.substr(url.indexOf("type=")+5,1);
$.ajax({
type: "POST",
url: "${pageContext.request.contextPath}/web/webTraining/signInByQRCode",
data : {
trainingId:trainingId,
memberId:memberId,
type:type
},
dataType : "json",
success : function(res) {
var status = res.status;
if(status=='3'){
alert('已签到');
}else if(status=='5'){
alert('上课签到班主任未开启');
}else if(status=='999'){
alert('签到成功');
}
window.location.reload();
}
});
}
});
});
</script>
三、java后台代码。
下面代码注意事项:
1:url必须和请求jsp的url相同(查看可通过在jsp页面alert输出window.locatiion.href)-----否侧会验证失败
import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody; import com.sms.util.Sign;
import com.sms.util.WxUtils; @Controller
@RequestMapping("web/wxConfig")
public class WebWxConfig { @RequestMapping(value="/getWxConfig",method=RequestMethod.POST)
@ResponseBody
public ModelMap getWxConfig(HttpServletRequest request,ModelMap map){
//http://localhost/WX/browser/member/membertrain.jsp
String url = "http://"+WxUtils.APP_DOMAIN+ request.getContextPath()+"/browser/member/membertrain.jsp";
String ticket = WxUtils.getTicket();
Map<String, String> sign = Sign.sign(ticket, url);
for (Map.Entry entry : sign.entrySet()) {
System.out.println(entry.getKey() + "," + entry.getValue());
}
map.put("wxConfig", sign);
return map;
}
}
下面代码注意事项:
1、AppID和appSecret通过(一)获取
2、getTicket获取票据的方法,票据是微信签名时必须用到的(重点-重点-重点),基本微信所有的接口都是需要票据的。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection; import net.sf.json.JSONObject; public class WxUtils {
private static String APP_ID = "XXXXXX";
private static String AppSecret = "XXXXXXXXXXXX";
public static String APP_DOMAIN ="www.oacloudapp.cn";
public static String getTicket(){
String urlToken="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+APP_ID+"&secret="+AppSecret+"";
String backToken = sendGet(urlToken,"utf-8",);
System.out.println("token:"+backToken);
String accessToken = (String) JSONObject.fromObject(backToken).get("access_token");
String url="https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+accessToken+"&type=jsapi";
String backTicket = sendGet(url,"utf-8",);
System.out.println("Ticket:"+backTicket);
String ticket = (String) JSONObject.fromObject(backTicket).get("ticket");
return ticket;
}
/**
*
* @title getAccessToken
* @Description 获取访问令牌
* @author sss
* @Date 2018-5-18上午11:07:18
* @return
*/
public static String getAccessToken(){
String url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+APP_ID+"&secret="+AppSecret+"";
String backData = sendGet(url,"utf-8",);
String accessToken = (String) JSONObject.fromObject(backData).get("access_token");
return accessToken;
}
/**
*
* @title sendGet
* @Description
* @author sss
* @Date 2018-5-18上午11:15:33
* @param url
* @param charset
* @param timeout
* @return
*/
public static String sendGet(String url, String charset, int timeout)
{
String result = "";
try
{
URL u = new URL(url);
try
{
URLConnection conn = u.openConnection();
conn.connect();
conn.setConnectTimeout(timeout);
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), charset));
String line="";
while ((line = in.readLine()) != null)
{
result = result + line;
}
in.close();
} catch (IOException e) {
return result;
}
}
catch (MalformedURLException e)
{
return result;
}
return result;
}
}
以下代码是微信提供的Demo 生成签名时使用。
import java.util.UUID;
import java.util.Map;
import java.util.HashMap;
import java.util.Formatter;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.io.UnsupportedEncodingException; public class Sign {
/*public static void main(String[] args) {
String ticket = WxUtils.getTicket();
// 注意 URL 一定要动态获取,不能 hardcode
String url = "http://"+WxUtils.APP_DOMAIN+"/RAFFLE/gotoLetter";
Map<String, String> ret = sign(ticket, url);
for (Map.Entry entry : ret.entrySet()) {
System.out.println(entry.getKey() + ", " + entry.getValue());
}
};*/
public static Map<String, String> sign(String jsapi_ticket, String url) {
Map<String, String> ret = new HashMap<String, String>();
String nonce_str = create_nonce_str();
String timestamp = create_timestamp();
String string1;
String signature = ""; //注意这里参数名必须全部小写,且必须有序
string1 = "jsapi_ticket=" + jsapi_ticket +
"&noncestr=" + nonce_str +
"×tamp=" + timestamp +
"&url=" + url;
System.out.println(string1); try
{
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(string1.getBytes("UTF-8"));
signature = byteToHex(crypt.digest());
}
catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
} ret.put("url", url);
ret.put("jsapi_ticket", jsapi_ticket);
ret.put("nonceStr", nonce_str);
ret.put("timestamp", timestamp);
ret.put("signature", signature); return ret;
} private static String byteToHex(final byte[] hash) {
Formatter formatter = new Formatter();
for (byte b : hash)
{
formatter.format("%02x", b);
}
String result = formatter.toString();
formatter.close();
return result;
} private static String create_nonce_str() {
return UUID.randomUUID().toString().replace("-", "");
} private static String create_timestamp() {
return Long.toString(System.currentTimeMillis() / );
}
}
以上代码及为微信JS-SDK微信扫一扫功能的开发详细步骤。微信JS-SDK的其他功能同理。
本人处女作,有错误之处请大佬们指处,鄙人虚心学习及时更正。
有不懂之处的同学们,可以及时联系我。
java实现微信扫一扫详解的更多相关文章
- 【转】Java魔法堂:String.format详解
Java魔法堂:String.format详解 目录 一.前言 二.重载方法 三.占位符 四.对字符.字符串进行格式化 五.对整数进行格式化 六. ...
- Scala IDEA for Eclipse里用maven来创建scala和java项目代码环境(图文详解)
这篇博客 是在Scala IDEA for Eclipse里手动创建scala代码编写环境. Scala IDE for Eclipse的下载.安装和WordCount的初步使用(本地模式和集群模式) ...
- 微信授权步骤与详解 -- c#篇
微信授权步骤与详解 -- c#篇 注:这里不涉及界面操作,只介绍代码操作. 1.基本原理如下: 从图上所知,第一步用户访问我们的网页,第二步我们后台跳转到微信授权页面,第三步用户点击授权,第四步微信重 ...
- java的集合框架最全详解
java的集合框架最全详解(图) 前言:数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作 ...
- Java学习-007-Log4J 日志记录配置文件详解及实例源代码
此文主要讲述在初学 Java 时,常用的 Log4J 日志记录配置文件详解及实例源代码整理.希望能对初学 Java 编程的亲们有所帮助.若有不足之处,敬请大神指正,不胜感激!源代码测试通过日期为:20 ...
- java线程池的使用与详解
java线程池的使用与详解 [转载]本文转载自两篇博文: 1.Java并发编程:线程池的使用:http://www.cnblogs.com/dolphin0520/p/3932921.html ...
- Java之Static静态修饰符详解
Java之Static静态修饰符详解 Java之Static静态修饰符详解 一.特点 1.随着类的加载而加载,随着类的消失而消失,生命周期最长 2.优先于对象存在 3.被所有类的对象共享 4.可以直接 ...
- Java 反射 设计模式 动态代理机制详解 [ 转载 ]
Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ...
- Java线程创建形式 Thread构造详解 多线程中篇(五)
Thread作为线程的抽象,Thread的实例用于描述线程,对线程的操纵,就是对Thread实例对象的管理与控制. 创建一个线程这个问题,也就转换为如何构造一个正确的Thread对象. 构造方法列表 ...
- (7)Java数据结构--集合map,set,list详解
MAP,SET,LIST,等JAVA中集合解析(了解) - clam_clam的专栏 - CSDN博---有颜色, http://blog.csdn.net/clam_clam/article/det ...
随机推荐
- MySQL服务器与MySQL57服务器区别与不同处在哪里,他们各自的领域范围,能不能同时启动服务?
安装了MySQL-5.7.18.0版本数据库,版本中包含了MySQL Workbench可视化试图工具,在服务列表栏中会有MySQL的两个服务器:如果启动第一项MySQL服务器就只能操作数据库,外界不 ...
- [题解](树形dp/记忆化搜索)luogu_P1040_加分二叉树
树形dp/记忆化搜索 首先可以看出树形dp,因为第一个问题并不需要知道子树的样子, 然而第二个输出前序遍历,必须知道每个子树的根节点,需要在树形dp过程中记录,递归输出 那么如何求最大加分树——根据中 ...
- POJ 2068 NIm (dp博弈,每个人都有特定的取最大值)
题目大意: 有2n个人,从0开始编号,按编号奇偶分为两队,循环轮流取一堆有m个石子的石堆,偶数队先手,每个人至少取1个,至多取w[i]个,取走最后一个石子的队伍输.问偶数队是否能赢. 分析: 题目数据 ...
- Uva12174
#include <bits/stdc++.h> using namespace std; ; int t; int s,n; ]; ]; ]; void init(){ memset(a ...
- BeanFilterUtil
package com.yundaex.utility.bean.filter; import java.util.ArrayList; import java.util.List; import o ...
- 020 Valid Parentheses 有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效.括号必须以正确的顺序关闭,"()" 和 "()[]{}" 是有效的 ...
- Nodejs mysql pool使用实例
前段时间在写一个版本发布工具,用到express+mysql实现,当站点运行很长一段空白时间后,node进程会自动down掉,提示mysql连接错误,谷歌后发现是mysql自身的特性导致,因此后来改为 ...
- Docker | 第五章:构建自定义镜像
前言 上一章节,主要是介绍了下Dockerfile的一些常用命令的说明.我们知道,利用Dockerfile可以构建一个新的镜像,比如运行Java环境,就需要一个JDK环境的镜像,但直接使用公共的镜像时 ...
- 北航oo作业第四单元小结
1.总结本单元两次作业的架构设计 在我动手开始总结我的设计之前,我看了其他同学已经提交在班级群里的博客,不禁汗颜,我是真的偷懒.其他同学大多使用了新建一个类,用以储存每一个UMLelemet元素的具体 ...
- 关于安卓visualizer的用法
看别人显示播放wav文件显示频谱写的代码都是断断续续的,在这里我贴了完整的代码,给有需要的人做参考,显示频谱还没有完成,不知道怎么弄,已经可以得到byte[] fft数据了,参考别人的写法也可以开方取 ...