


Méthode de développement WeChat pour déterminer si le client actuel prend en charge l'interface js spécifiée
Mar 26, 2017 pm 02:55 PMEn raison de l'utilisation de WeChatjsapiL'interface a l'autorisation d'utilisation, nous devons donc déterminer si le client prend en charge l'interface js
Interface de base, déterminer si la version actuelle du client. prend en charge l'interface JS spécifiée
Tout d'abord, jsapi.jspCode
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>微信jsapi測(cè)試-V型知識(shí)庫(kù)</title> <meta name="viewport" content="width=320.1,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"> <script src="http://res.wx.qq.com/open/js/jweixin-1.1.0.js"> </script> </head> <body> <center><h3>歡迎來(lái)到微信jsapi測(cè)試界面-V型知識(shí)庫(kù)</h3></center> <br> <p>timestamp:${ timestamp}</p> <p>nonceStr:${ nonceStr}</p> <p>signature:${ signature}</p> <p>appId:${ appId}</p> <!-- <input type="button" value="upload" onclick="uploadImg();"/> <input type="button" value="獲取當(dāng)前位置" onclick="getLocation();"/> --> <p>基礎(chǔ)接口之判斷當(dāng)前客戶端是否支持指定的js接口</p> <input type="button" value="checkJSAPI" id="checkJsApi"> <br> <script type="text/javascript"> wx.config({ debug: true, // 開(kāi)啟調(diào)試模式,調(diào)用的所有api的返回值會(huì)在客戶端alert出來(lái),若要查看傳入的參數(shù),可以在pc端打開(kāi),參數(shù)信息會(huì)通過(guò)log打出,僅在pc端時(shí)才會(huì)打印。 appId: '${appId}', // 必填,公眾號(hào)的唯一標(biāo)識(shí) timestamp: '${ timestamp}' , // 必填,生成簽名的時(shí)間戳 nonceStr: '${ nonceStr}', // 必填,生成簽名的隨機(jī)串 signature: '${ signature}',// 必填,簽名, jsApiList: ['chooseImage','getLocation','openLocation'] // 必填,需要使用的JS接口列表,所有JS接口列表見(jiàn)附錄2 }); wx.ready(function(){ // 1 判斷當(dāng)前版本是否支持指定 JS 接口,支持批量判斷 document.querySelector('#checkJsApi').onclick = function () { wx.checkJsApi({ jsApiList: [ 'getNetworkType', 'previewImage' ], success: function (res) { alert(JSON.stringify(res)); } }); }; }); //初始化jsapi接口 狀態(tài) wx.error(function (res) { alert("調(diào)用微信jsapi返回的狀態(tài):"+res.errMsg); }); </script> </body> </html>
package com.test.util; 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 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 = ""; //注意這里參數(shù)名必須全部小寫(xiě),且必須有序 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(); } private static String create_timestamp() { return Long.toString(System.currentTimeMillis() / 1000); } public static void main(String[] args) { String jsapi_ticket =JsapiTicketUtil.getJSApiTicket(); // 注意 URL 一定要?jiǎng)討B(tài)獲取,不能 hardcode String url = "http://www.vxzsk.com/xx/x.do";//url是你請(qǐng)求的一個(gè)action或者controller地址,并且方法直接跳轉(zhuǎn)到使用jsapi的jsp界面 Map<String, String> ret = sign(jsapi_ticket, url); for (Map.Entry entry : ret.entrySet()) { System.out.println(entry.getKey() + ", " + entry.getValue()); } }; } |
>
Quatre paramètres nécessaires dans. la page Web, comme indiqué dans le tableau ci-dessous
參數(shù)名 | 說(shuō)明 |
appId | 必填,公眾號(hào)的唯一標(biāo)識(shí) |
timestamp | 必填,生成簽名的時(shí)間戳 |
nonceStr | 必填,生成簽名的隨機(jī)串 |
signature | 必填,簽名 |
Alors, d'où viennent ces quatre paramètres, veuillez consulter la deuxième étape ci-dessous
Deuxièmement, obtenez appId, timestamp, nonceStr, signature
Avant de passer à l'interface jsapi.jsp, nous devons obtenir les quatre paramètres ci-dessus pour réussir. L'appel de l'interface WeChat jsapi, c'est-à-dire que les quatre paramètres ci-dessus sont les informations d'identification pour appeler l'interface WeChat jsapi Appid est l'identifiant de l'application. en vous connectant à la plateforme publique WeChat. Obtenez l'algorithme de signature
Cliquez sur le lien dans le compte officiel pour accéder à l'interface jsapi.jsp. clique sur l'adresse du lien dans le compte officiel pour accéder à l'interface jsapi. .jsp, nous devons obtenir les trois paramètres ci-dessus dans wxJsAPIServlet, et stocker les paramètres dans l'objet request , puis l'interface jsp sort le code de la servlet comme suit?:
|
注意用戶點(diǎn)擊的地址必須和簽名算法中的地址保持一致,如果要帶參數(shù)那么參數(shù)也要帶上而且參數(shù)的順序不能改變,否則簽名算法得到的簽名 字符串和用戶請(qǐng)求的地址的簽名字符串不一致導(dǎo)致調(diào)用jsapi失敗。
當(dāng)然我在這里用的servlet跳轉(zhuǎn),讀者也可以把doGET方法中的代碼復(fù)制到spring的一個(gè)普通controller中或者struts中的一個(gè)普通的action方法中。
Sign.java代碼
package com.test.util; 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 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 = ""; //注意這里參數(shù)名必須全部小寫(xiě),且必須有序 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(); } private static String create_timestamp() { return Long.toString(System.currentTimeMillis() / 1000); } public static void main(String[] args) { String jsapi_ticket =JsapiTicketUtil.getJSApiTicket(); // 注意 URL 一定要?jiǎng)討B(tài)獲取,不能 hardcode String url = "http://www.vxzsk.com/xx/x.do";//url是你請(qǐng)求的一個(gè)action或者controller地址,并且方法直接跳轉(zhuǎn)到使用jsapi的jsp界面 Map<String, String> ret = sign(jsapi_ticket, url); for (Map.Entry entry : ret.entrySet()) { System.out.println(entry.getKey() + ", " + entry.getValue()); } }; } |
JsapiTicketUtil.java代碼
package com.test.util; 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; import com.test.weixin.TestAcessToken; public class JsapiTicketUtil { /*** * 模擬get請(qǐng)求 * @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; } public static String getAccessToken(){ String appid="你公眾號(hào)基本設(shè)置里的應(yīng)用id";//應(yīng)用ID String appSecret="你公眾號(hào)基本設(shè)置里的應(yīng)用密鑰";//(應(yīng)用密鑰) String url ="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appid+"&secret="+appSecret+""; String backData=TestAcessToken.sendGet(url, "utf-8", 10000); String accessToken = (String) JSONObject.fromObject(backData).get("access_token"); return accessToken; } public static String getJSApiTicket(){ //獲取token String acess_token= JsapiTicketUtil.getAccessToken(); String urlStr = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+acess_token+"&type=jsapi"; String backData=TestAcessToken.sendGet(urlStr, "utf-8", 10000); String ticket = (String) JSONObject.fromObject(backData).get("ticket"); return ticket; } public static void main(String[] args) { String jsapiTicket = JsapiTicketUtil.getJSApiTicket(); System.out.println("調(diào)用微信jsapi的憑證票為:"+jsapiTicket); } } |