根據微信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;
}