JS 調(diào)用微信掃一掃功能
1.第一步:
設(shè)置調(diào)用微信js安全域名,就可以在該域名下調(diào)用微信的js接口
2.第二步:
將下面的js附在需要調(diào)用微信掃一掃的頁面上,前提是需要引入微信的js[]
3.第三步:
參考官方文檔 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=876521668&lang=zh_CN
通過后臺(tái)獲取js權(quán)限簽名jsapi_ticket【參考文檔:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E9.99.84.E5.BD.951-JS-SDK.E4.BD.BF.E7.94.A8.E6.9D.83.E9.99.90.E7.AD.BE.E5.90.8D.E7.AE.97.E6.B3.95】
后臺(tái)獲取簽名代碼:
package com.epoch.wap.common; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Formatter; import java.util.HashMap; import java.util.Map; import java.util.UUID; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import com.epoch.common.utils.JsonUtil; /** * 官方給的使用js的驗(yàn)證工具 * @author Administrator * */ public class JsSignUtil { public static String accessToken = null; public static Map<String, Object> sign(String url) { String sendUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=**appid**&secret= **secret**"; String result = getHttpResult(sendUrl); Object accessResult = JsonUtil.getValueFromJson(result, "access_token"); String signUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+accessResult.toString()+"&type=jsapi"; String resultSign = getHttpResult(signUrl); Object ticket = JsonUtil.getValueFromJson(resultSign, "ticket"); Map<String, Object> ret = new HashMap<String, Object>(); String nonce_str = create_nonce_str(); String timestamp = create_timestamp(); String string1; String signature = ""; //注意這里參數(shù)名必須全部小寫,且必須有序 string1 = "jsapi_ticket=" + ticket + "&noncestr=" + nonce_str + "×tamp=" + timestamp + "&url=" + url; 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("nonceStr", nonce_str); ret.put("timestamp", timestamp); ret.put("signature", signature); ret.put("jsapi_ticket", ticket); ret.put("appId", "wx154f74654ae04891"); return ret; } /** * 隨機(jī)加密 * @param hash * @return */ 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 getHttpResult(String url) { String result = ""; HttpGet httpRequest = new HttpGet(url); try { HttpResponse httpResponse = HttpClients.createDefault().execute(httpRequest); if (httpResponse.getStatusLine().getStatusCode() == 200) { result = EntityUtils.toString(httpResponse.getEntity()); } } catch (ClientProtocolException e) { e.printStackTrace(); result = e.getMessage().toString(); } catch (IOException e) { e.printStackTrace(); result = e.getMessage().toString(); } return result; } /** * 產(chǎn)生隨機(jī)串--由程序自己隨機(jī)產(chǎn)生 * @return */ private static String create_nonce_str() { return UUID.randomUUID().toString(); } /** * 由程序自己獲取當(dāng)前時(shí)間 * @return */ private static String create_timestamp() { return Long.toString(System.currentTimeMillis() / 1000); } }
官方文檔示例:
參考以下文檔獲取access_token(有效期7200秒,開發(fā)者必須在自己的服務(wù)全局緩存access_token):../15/54ce45d8d30b6bf6758f68d2e95bc627.html
用第一步拿到的access_token 采用http GET方式請(qǐng)求獲得jsapi_ticket(有效期7200秒,開發(fā)者必須在自己的服務(wù)全局緩存jsapi_ticket):https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi
4 第四步:
前臺(tái)進(jìn)入頁面:`
@RequestMapping(value = "/tiaoma") public String tiaoma( HttpServletRequest request,GoodsVO goods) throws Exception { String Url=request.getRequestURL()+"?"+request.getQueryString().toString();; Map<String, Object> resMap = new HashMap<String, Object>(); resMap = JsSignUtil.sign(Url); request.setAttribute("nonceStr", resMap.get("nonceStr")); request.setAttribute("timestamp", resMap.get("timestamp")); request.setAttribute("signature", resMap.get("signature")); request.setAttribute("appId", resMap.get("appId")); request.setAttribute("url", resMap.get("url")); request.setAttribute("jsapi_ticket", resMap.get("jsapi_ticket")); return "index/tiaoma"; }`
以上所述是小編給大家介紹的JS 調(diào)用微信掃一掃功能,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
es6函數(shù)之嚴(yán)格模式用法實(shí)例分析
這篇文章主要介紹了es6函數(shù)之嚴(yán)格模式用法,結(jié)合實(shí)例形式分析了es6函數(shù)嚴(yán)格模式的定義、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-03-03zTree實(shí)現(xiàn)節(jié)點(diǎn)修改的實(shí)時(shí)刷新功能
在實(shí)際應(yīng)用中會(huì)遇到動(dòng)態(tài)操作樹各節(jié)點(diǎn)的需求,在增加樹節(jié)點(diǎn)后如何實(shí)時(shí)動(dòng)態(tài)刷新樹就十分有必要了。這篇文章主要介紹了zTree實(shí)現(xiàn)節(jié)點(diǎn)修改的實(shí)時(shí)刷新功能,需要的朋友可以參考下2017-03-03js判斷一個(gè)字符串是以某個(gè)字符串開頭的簡單實(shí)例
下面小編就為大家?guī)硪黄猨s判斷一個(gè)字符串是以某個(gè)字符串開頭的簡單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12瀏覽器解析js生成的html出現(xiàn)樣式問題的解決方法
接觸css, javascript有三年多了,今天遇到的問題最令我不可思議,很容易給人一種錯(cuò)覺,那就是js拼成的html結(jié)構(gòu)肯定有問題2012-04-04第二次聊一聊JS require.js模塊化工具的基礎(chǔ)知識(shí)
第二次聊一聊JS require.js模塊化工具的基礎(chǔ)知識(shí),本文為大家JS require.js模塊化工具的最基本知識(shí)點(diǎn),感興趣的小伙伴們可以參考一下2016-04-04js動(dòng)態(tài)添加帶圓圈序號(hào)列表的實(shí)例代碼
這篇文章主要介紹了js動(dòng)態(tài)添加帶圓圈序號(hào)列表的實(shí)例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02