根据微信api,整理了一下调用微信扫一扫功能。如有问题请指正:
以下是具体步骤:
- 1、绑定域名(很关键)
- 2、引入JS文件(很简单)<scriptsrc="http://res.wx.qq.com/open/js/jweixin-1.1.0.js"></script>
- 3、通过config接口注入权限验证配置(很重要)
- 4、通过ready接口处理成功验证(还没用到)
- 5、通过error接口处理失败验证(还没用到)
以下是通过config接口注入权限验证配置(第三步):
下面是js代码:
$.ajax({
type : "post",
url : "/weixin/open/weixinOAuthCallback_sign.action",
data : {
"url" : location.href.split('#')[0]
},
dataType : "json",
success : function(data) {
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: data.appId, // 必填,公众号的唯一标识
timestamp: data.timestamp, // 必填,生成签名的时间戳
nonceStr: data.nonceStr, // 必填,生成签名的随机串
signature: data.signature,// 必填,签名,见附录1
jsApiList: [
'checkJsApi',
'startRecord',
'stopRecord',
'translateVoice',
'scanQRCode',// 微信扫一扫接口
'openCard'
] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
wx.error(function(res) {
alert("出错了:" + res.errMsg);//这个地方的好处就是wx.config配置错误,会弹出窗口哪里错误,然后根据微信文档查询即可。
});
wx.ready(function() {
wx.checkJsApi({
jsApiList : ['scanQRCode'],
success : function(res) {
}
});
});
//点击按钮扫描二维码
$("#scanQRCode").click(function(){
wx.scanQRCode({
needResult : 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
scanType : [ "qrCode"], // 可以指定扫二维码还是一维码,默认二者都有
success : function(res) {
var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
window.location.href = result;//因为我这边是扫描后有个链接,然后跳转到该页面
},
error : function(){
console.log('123');
}
});
});
}
});
下面是后台java代码,用于 获取sign签名 : AppID:微信公众号应用的唯一标识,AppSecret:微信公众号的私匙(相当于密码)
/**
* 得到jsApi-ticket
* @return
*/
@SuppressWarnings({ "static-access", "unused" })
private String getJsapiTicket(){
HttpServletRequest request = ServletActionContext.getRequest();
String code = request.getParameter("code");
String requestUrl = "https://api.weixin.qq.com/cgi-bin/token?";
String params = "grant_type=client_credential&appid=" + APPID + "&secret=" + APP_SECRET + "";
String result = this.httpGet(requestUrl+params);
String accessToken = com.alibaba.fastjson.JSONObject.parseObject(result).getString("access_token");
requestUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?";
params = "access_token=" + accessToken + "&type=jsapi";
result = this.httpGet(requestUrl+params);
String jsapi_ticket = com.alibaba.fastjson.JSONObject.parseObject(result).getString("ticket");
return jsapi_ticket;
}
/**
* 获取sign签名
* @return
*/
public String sign() {
HttpServletRequest request = ServletActionContext.getRequest();
Map ret = new HashMap();
String url = request.getParameter("url");
String jsapi_ticket= getJsapiTicket();
String nonce_str = create_nonce_str();
String timestamp = create_timestamp();
String string1;
String signature = "";
int length=url.indexOf("#");
String uri = url;
if(length > 0){
uri=url.substring(0,length);//当前网页的URL,不包含#及其后面部分
}
//注意这里参数名必须全部小写,且必须有序
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("appId", APPID);
ret.put("url", uri);
ret.put("jsapi_ticket", jsapi_ticket);
ret.put("nonceStr", nonce_str);
ret.put("timestamp", timestamp);
ret.put("signature", signature);
System.out.println(signature);
this.setJsonString(JsonUtil.toJSONString(ret));
return "json";
}
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();
}
private static String create_timestamp() {
return Long.toString(System.currentTimeMillis() / 1000);
}
/**
* 发送get请求
* @param url 路径
* @return
*/
public static String httpGet(String url){
//get请求返回结果
String strResult = null;
try {
DefaultHttpClient client = new DefaultHttpClient();
//发送get请求
HttpGet request = new HttpGet(url);
HttpResponse response = client.execute(request);
/**请求发送成功,并得到响应**/
if (response.getStatusLine().getStatusCode() == org.apache.http.HttpStatus.SC_OK) {
/**读取服务器返回过来的json字符串数据**/
strResult = EntityUtils.toString(response.getEntity());
} else {
logger.error("get请求提交失败:" + url);
}
} catch (IOException e) {
logger.error("get请求提交失败:" + url, e);
}
return strResult;
}