1. 程式人生 > >微信開發 ---呼叫微信掃碼介面

微信開發 ---呼叫微信掃碼介面

呼叫微信掃碼介面

步驟一:繫結域名

微信公眾號繫結域名

步驟二:引入JS檔案

步驟三:通過config介面注入許可權驗證配置

這個是呼叫微信的重要憑證,你想要掉用微信的介面 必須先得把簽名通過,這個方法直接放到javascript裡

wx.config({
    debug: true, // 開啟除錯模式,呼叫的所有api的返回值會在客戶端alert出來,若要檢視傳入的引數,可以在pc端開啟,引數資訊會通過log打出,僅在pc端時才會列印。
    appId: '', // 必填,公眾號的唯一標識
    timestamp: , // 必填,生成簽名的時間戳
    nonceStr: '', // 必填,生成簽名的隨機串
    signature: '',// 必填,簽名,見附錄1
    jsApiList: [] // 必填,需要使用的JS介面列表,所有JS介面列表見附錄2
});

步驟四:通過error介面處理失敗驗證

wx.error(function(res){

    // config資訊驗證失敗會執行error函式,如簽名過期導致驗證失敗,具體錯誤資訊可以開啟config的debug模式檢視,也可以在返回的res引數中檢視,對於SPA可以在這裡更新簽名。

});

步驟五:通過ready介面處理成功驗證

wx.ready(function(){

    // config資訊驗證後會執行ready方法,所有介面呼叫都必須在config介面獲得結果之後,config是一個客戶端的非同步操作,所以如果需要在頁面載入時就呼叫相關介面,則須把相關介面放在ready函式中呼叫來確保正確執行。對於使用者觸發時才呼叫的介面,則可以直接呼叫,不需要放在ready函式中。
}); 

基礎介面 判斷當前客戶端版本是否支援指定JS介面

wx.checkJsApi({
    jsApiList: ['chooseImage'], // 需要檢測的JS介面列表,所有JS介面列表見附錄2,
    success: function(res) {
        // 以鍵值對的形式返回,可用的api值true,不可用為false
        // 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}
    }
});

微信掃一掃 調起微信掃一掃介面

wx.scanQRCode({
    needResult: 0, // 預設為0,掃描結果由微信處理,1則直接返回掃描結果,
    scanType: ["qrCode","barCode"], // 可以指定掃二維碼還是一維碼,預設二者都有
    success: function (res) {
    var result = res.resultStr; // 當needResult 為 1 時,掃碼返回的結果
}
});

上邊就是呼叫微信掃一掃介面的必要條件了 下邊就要放乾貨了

js

<script  type="text/javascript">
  
	 $.ajax({
         type : "post",
         url : "weixinList/sys.do",
         data : {
             "url" : location.href.split('#')[0]
         },
         dataType : "json",
         success : function(data) {
             wx.config({
                 debug: false, // 開啟除錯模式   
                 appId:data.data.appId,
                 timestamp:data.data.timestamp,
                 nonceStr:data.data.nonceStr,
                 signature:data.data.signature,
                 jsApiList: [
                               'checkJsApi',
                               'scanQRCode'// 微信掃一掃介面
                            ] // 必填,需要使用的JS介面列表,所有JS介面列表見附錄2 
             }); 
             //wx.config 調不通 執行的方法
              wx.error(function(res) {
                 alert("出錯了:" + res.errMsg);//這個地方的好處就是wx.config配置錯誤,會彈出視窗哪裡錯誤,然後根據微信文件查詢即可。
             });
            //wx.config 調通 執行的方法
             wx.ready(function() {
                 wx.checkJsApi({
                      jsApiList : ['scanQRCode'],
                      success : function(res) {

                      }
                 });
             });
             //點選按鈕掃描二維碼
             $("#scanQRCode").click(function(){
                 wx.scanQRCode({
                     needResult : 0, // 預設為0,掃描結果由微信處理,1則直接返回掃描結果,
                     scanType : [ "qrCode", "barCode"], // 可以指定掃二維碼還是一維碼,預設二者都有
                     success : function(res) {
                    	 var result = res.resultStr; // 當needResult 為 1 時,掃碼返回的結果
                     },
                 });
             });

             
         }
     });

</script>

頁面載入是 執行ajax方法 獲取到wx.config 需要的引數

jsp

<button  id="scanQRCode" >點我 ! 掃描二維碼</button>

utils

package xxx.utils;
 
/**
 * 官方給的使用js的驗證工具
 * @author Administrator
 *
 */
 //url很重要 一定要從前臺獲取  要不然 生成片名不一致
public class JsSignUtil {
	    public static Map<String, String> sign(String url) throws IOException {
	    //通過AccessToken獲取到ticket   AccessToken怎麼獲取就不粘了
	        JSONObject jsapiTicketObject = AuthUtil.doGetJson("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + WeiXinUtils.getAccessToken() + "&type=jsapi");
	        String jsapiTicket = (String) jsapiTicketObject.get("ticket");
       
       //下邊的就不用看了  直接站就行

	        System.out.println("微信返回jsapiTicketObject"+jsapiTicketObject);
	        Map<String, String> ret = new HashMap<String, String>();
	        String nonce_str = create_nonce_str();
	        String timestamp = create_timestamp();
	        String string1;
	        String signature = "";
	 
	        //注意這裡引數名必須全部小寫,且必須有序
	        string1 = "jsapi_ticket=" + jsapiTicket +
	                "&noncestr=" + nonce_str +
	                "&timestamp=" + timestamp +
	                "&url=" + url;
	        System.out.println("string1="+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", jsapiTicket);
	        ret.put("nonceStr", nonce_str);
	        ret.put("timestamp", timestamp);
	        ret.put("signature", signature);
	        ret.put("appId", "wxca42d473ba246dd9");
	 
	        System.out.println("url="+ret.get("url"));
	        System.out.println("jsapi_ticket="+ret.get("jsapi_ticket"));
	        System.out.println("nonceStr="+ret.get("nonceStr"));
	        System.out.println("signature="+ret.get("signature"));
	        System.out.println("timestamp="+ret.get("timestamp"));
	 
	        return ret;
	    }
	 
	 
	    /**
	     * 隨機加密
	     * @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;
	    }
	 
	    /**
	     * 產生隨機串--由程式自己隨機產生
	     * @return
	     */
	    private static String create_nonce_str() {
	        return UUID.randomUUID().toString();
	    }
	 
	    /**
	     * 由程式自己獲取當前時間
	     * @return
	     */
	    private static String create_timestamp() {
	        return Long.toString(System.currentTimeMillis() / 1000);
	    }
	}

Controller

@ResponseBody
@RequestMapping(value="sys")
	public JsonBean sys(String url) throws IOException {
	//我的是傳JsonBean
		Map<String, String> ret = JsSignUtil.sign(url);
		return new JsonBean(0,ret,"");
	}

老天保佑你 阿門!!!