喜欢的朋友可以关注下。

已经很久没有给大家分享一片技术文章了,今天抽了点时间来,给大家说一说如何调用微信提供的扫一扫接口。

前提: 需要申请一个公众号:申请公众号需要的资料我就不说了,去申请微信会提示需要哪些。

准备appid(公众号的id) AppSecret (公众号的密钥) 正文: 首先,我们先来简单了解一下流程,详细的微信文档有说明。

获取Token→根据token获取Ticket→根据ticket签名→反会参数给前端→前端调起扫一扫接口 下面直接上代码

1.获取token

/**
* Description: 获取微信公众号token<BR>
*
* @author dsn
* @date 2018年9月21日 上午9:53:26
* @param appid
* @param secret
* @return
* @version 1.0
*/
public static String getAccessToken(String appid, String secret) {
String token = "";
String token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid
+ "&secret=" + secret;
JSONObject result = PayCommonUtil.httpsRequest(token_url, "POST");
if (result.get("access_token") != null) {
token = result.get("access_token").toString();
}
return token;
}

2.获取ticket

/**
* Description: 获取微信ticket<BR>
*
* @author dsn
* @date 2018年9月21日 上午9:54:03
* @param token
* @return
* @version 1.0
*/
public static String getTicket(String token) {
if ("".equalsIgnoreCase(token) || null == token) {
return "";
}
String ticket_url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + token + "&type=jsapi";
JSONObject result = PayCommonUtil.httpsRequest(ticket_url, "POST");
return result.get("ticket").toString(); }

3.签名

 public static String getSign(String jsapi_ticket, String noncestr, Long timestamp, String url)
throws NoSuchAlgorithmException {
String shaStr = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + noncestr + "&timestamp=" + timestamp + "&url="
+ url;
MessageDigest mDigest = MessageDigest.getInstance("SHA1");
byte[] result = mDigest.digest(shaStr.getBytes());
StringBuffer signature = new StringBuffer();
for (int i = 0; i < result.length; i++) {
signature.append(Integer.toString((result[i] & 0xff) + 0x100, 16).substring(1));
}
return signature.toString();
}

4.action中调用

/**
* Description:微信扫一扫接口 <BR>
*
* @author ran.chunlin
* @date 2017年4月11日 上午10:07:35
* @param request
* @return
* @throws Exception
* @version 1.0
*/
@RequestMapping(params = "method=getWechatSign", method = RequestMethod.GET)
public @ResponseBody Map<String, Object> getWechatSign(HttpServletRequest request) throws Exception {
/* 返回的json数据 */
Map<String, Object> jsonMap = new HashMap<>();
// 构成子数据map
Map<String, Object> subJsonMap = new HashMap<>(); // 1.获取参数
String url = showNull(request.getParameter("url"));
String t = showNull(request.getParameter("t"));
String appId = showNull(request.getParameter("appId"));
String appSecret = showNull(request.getParameter("appSecret"));
if (url == null || t == null || appId == null || appSecret == null) {
return json4Map(jsonMap, subJsonMap, "参数为空", STATUSCODE_FAILED_BADINPUT_PARAM);
} else {
String accessToken = WeiXinUtils.getAccessToken(appId, appSecret);
String ticket = WeiXinUtils.getTicket(accessToken);
Long timestamp = System.currentTimeMillis() / 1000;
String nonceStr = RandomStringUtils.randomAlphanumeric(16);
String sign = getSign(ticket, nonceStr, timestamp, url);
subJsonMap.put("result", "1");
subJsonMap.put("timestamp", timestamp);
subJsonMap.put("nonceStr", nonceStr);
subJsonMap.put("appId", appId);
subJsonMap.put("sign", sign);
}
return json4Map(jsonMap, subJsonMap, "获取sign成功", STATUSCODE_SUCCESS);
}

5.前端代码

// 扫一扫 进入页面时去调用
$.ajax({
type : 'GET',
url : "你action的url",
data : {
appId : "",
appSecret : "",
url : location.href,
t : Math.random()
},
success : function(json) {
if (json.data.result == "1") {
wxConfig(json.data.timestamp, json.data.nonceStr,
json.data.sign, json.data.appId);
}
}
}); function wxConfig(_timestamp, _nonceStr, _signature, _appId) {
wx.config({
// debug : false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId : _appId, // 必填,公众号的唯一标识
timestamp : _timestamp, // 必填,生成签名的时间戳
nonceStr : _nonceStr, // 必填,生成签名的随机串
signature : _signature,// 必填,签名,见附录1
jsApiList : [ 'onMenuShareTimeline', 'onMenuShareAppMessage',
'onMenuShareQQ', 'onMenuShareWeibo', 'scanQRCode' ]
// 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
} //扫码调用
function scanCode() {
wx.scanQRCode({
needResult : 1,
scanType : [ "qrCode", "barCode" ],
success : function(res) {
console.log(res)
//扫描返回的数据
var result = res.resultStr; },
fail : function(res) {
layer.open({
content : '请稍后再试',
skin : 'msg',
time : 2
//2秒后自动关闭
}); }
});
}

其实就是这么的简单

这里需要提醒大家 页面一定要引入 不然会调用不了微信的函数

如有需要可以加我Q群【308742428】大家一起讨论技术。

后面会不定时为大家更新文章,敬请期待。

喜欢的朋友可以关注下。

如果对你有帮助,请打赏一下!!!

  

JAVA实现调用微信js-sdk扫一扫的更多相关文章

  1. 调用微信js sdk

    场景:需要调用微信获取当前位置的借口. 途径:查看微信 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115 .后 ...

  2. 微信JS SDK配置授权,实现分享接口

    微信开放的JS-SDK面向网页开发者提供了基于微信内的网页开发工具包,最直接的好处就是我们可以使用微信分享.扫一扫.卡券.支付等微信特有的能力.7月份的时候,因为这个分享的证书获取问题深深的栽了一坑, ...

  3. 实战微信JS SDK开发:贺卡制作与播放(1)

    前段时间忙于CanTK 2.0的开发,所以博客一直没有更新.CanTK 2.0主要增强了游戏和富媒体的开发,现在编码和测试基本完成了,等文档完成了再正式发布,里面有不少激动人心的功能,等发布时再一一细 ...

  4. 微信JS SDK接入的几点注意事项

    微信JS SDK接入,主要可以先参考官网说明文档,总结起来有几个步骤: 1.绑定域名:先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”.备注:登录后可在“开发者中心”查看对 ...

  5. 微信js sdk上传多张图片

    微信js sdk上传多张图片,微信上传多张图片 该案例已tp3.2商城为例 直接上代码: php代码: public function ind(){ $appid="111111111111 ...

  6. 微信JS SDK使用权限签名算法

    jsapi_ticket 生成签名之前必须先了解一下jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临时票据.正常情况下,jsapi_ticket的有效期为7200秒, ...

  7. 微信js sdk分享开发摘记java版

    绑定域名和引入js的就不说了 废话不说直接上代码 public void share(HttpServletRequest request) throws Exception { StringBuff ...

  8. 微信JS SDK Demo 官方案例[转]

    摘要: 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统的能力,同时可以直接使用 ...

  9. 微信js SDK接口

    微信JS-SDK说明文档 http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html 一.微信登录功能 在进行微信OAut ...

随机推荐

  1. EF多字段求和(分组/不分组)

    分组多字段求和 query.GroupBy(q => new { q.Year, q.Month }) .Select(q => new { Year = q.Key.Year, Mont ...

  2. 8.24 关于valid.js

    这是昨天遇到的一个问题. js文件的validator函数里面套用了框架,但是页面上报错,说这不是一个函数..找了wd ht调都不知道怎么回事 后来jf哥说,是因为html页面没有引入valid.js ...

  3. [leetcode]75. Sort Colors三色排序

    Given an array with n objects colored red, white or blue, sort them in-place so that objects of the ...

  4. [leetcode]24. Swap Nodes in Pairs交换节点对

    Given a linked list, swap every two adjacent nodes and return its head. You may not modify the value ...

  5. Py西游攻关之RabbitMQ、Memcache、Redis

    Py西游攻关之RabbitMQ.Memcache.Redis   RabbitMQ 解释RabbitMQ,就不得不提到AMQP(Advanced Message Queuing Protocol)协议 ...

  6. 51nod 1344

    一个很简单的算法题,求最小的前缀和,就是要注意数据范围要开一个longlong #include<iostream> using namespace std; int main() { i ...

  7. centos7 安装maven

    进入指定目录 cd /usr/local/src/   下载maven 包 wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.1.1/bin ...

  8. html-day06

    html-day06 1.定位 定位: 1.普通流定位 普通流,又称为文档流 块级元素:从上到下一个一个的排列 行内元素:一行内从左到右的排列 2.浮动定位 1.什么是浮动定位 将元素排除在普通流之外 ...

  9. Acegi框架

    Acegi(Acegi Security)框架,是一个能为基于Spring的企业应用提供强大而灵活安全访问控制解决方案的框架,Acegi已经成为 Spring官方的一个子项目,所以也称为Spring ...

  10. bgfx入门练习2——找出DX,OpenGL驱动切换实现原理

    找到驱动切换的代码,自然而然就要找实现的位置了,简单搜了下,原来是GLSL Shader字节码转换到HLSL字节码,正好和Klayge做了相反的工作. 时间上似乎也差不多,Klyage是2014年搞的 ...