詳解微信開發微信jsapi與java初步存取方法

高洛峰
發布: 2017-03-26 14:08:42
原創
2240 人瀏覽過

參數名稱

http://www.php.cn/wiki/835.html" target="_blank">width="346" valign= "top" style="word-break:break-all">  說明
#appId 應用ID 登入微信公眾號管理平台可查詢
timestamp  必填,產生簽章的時間戳 
nonceStr 必填,產生簽名的隨機串 
#signature 必填,簽章,見附錄1 

#################### ##########上述###表格###中的參數,我們在前一章已經說的很明白,之所以做出一個表格是因為如果想要成功接入微信# ##js######api###這四個參數是憑證,也就是相當於一個門必須要有四把鑰匙才能打開,缺一不可 。 ######接下來的案例採用java的###servlet###做的跳轉頁面,沒有用到spring###MVC###,大家可把請求的路徑更換成controller路徑即可。 ######WxJsAPIServlet程式碼:######################xml程式碼
##package com.test;

import java.io.IOException;

import java.io.PrintWriter;

導入java.util.

Map;

導入javax.servlet.ServletException;

#匯入javax.servlet.http.HttpServlet;

導入javax .servlet.http.HttpServletRequest;

導入javax.servlet.http.HttpServletResponse;

導入com.test.util.JsapiTicketUtil;

com.test.util . Sign;

public 

class# WxJsAPIServlet extends HttpServlet {

/**

     * 

物件的建構子。     */

    public 

/**

     * Servlet 的銷毀。 

     */   ) {

        

#super

();

    }

#/**

     * servlet 的 doGet 方法。 

     *     * 當表單的標籤值方法等於 get 時,請呼叫此方法。端送到伺服器的請求

     * @param response 伺服器傳送至客戶端的回應

     * @throws ServletException ## 錯誤則@拋出IOException

#     */

##   }

#/**&*/

##  {

        super.destroy(); // 只要將「destroy」

string

# 放入日誌

// // 將您的程式碼放在這裡

    }

    / **&*/    public void doGet(HttpServletRequest 請求, HttpServletResponse 回應)

        System.out.println("wxJSAPI= ========= =========");

        String jsapi_ticket =JsapiTicketUtil.getJSApiTicket();  String jsapi_ticket =JsapiTicketUtil.getJSApiTicket(); 

  , map = Sign.sign(jsapi_ticket, "http://www.vxzsk.com/weChat/wxJsAPIServlet");

        String nonceStr = map.get("nonceStr");

        String signature = map.get("signature");

    .setAttribute("appId", appId);

        request.setAttribute("timestamp", timestamp);

    request.setAttribute("nonceStr", nonceStr);

        request.getRequestDispatcher("jsapi/jsapi.

jsp

").forward(request,#response);##cue 

    /**

     * Servlet 的doPost 方法。 

     *

     * This method is called when a form has its tag value method equals to post.## send by the client to the server

     * @param response the response send by the server to the client

     * IOException if an error occurred

     * /

    public void doPost(HttpServletRequest request, HttpServletResponse response)

         this.doGet(request, response);

       }

/**

     * servlet 的初始化。 

     *

     * 若有錯誤則@拋出 ServletException

#     */

    public void init() throws ServletException {

#       

}

第44行是產生 jsapi_ticket的工具類,下面有貼出工具類別的程式碼。

第45行 Sign類別的sign方法,把表格中的最後三個參數封裝放到Map集合中了。其中參數就是請求的servlet位址並跳到呼叫微信jsapi的jsp介面。

第49行 appId替換成你自己的應用id,如果不知道應用id 可登陸微信公眾平台管理中心查詢。

servlet對應的web.

##

    This is the description of my J2EE component

#1 is the display name of my J2EE component

    WxJsAPIServlet</servlet-nameWxJsAPIServlet</servlet-nameWxJsAPIServlet) ;/servlet-class>  

    #JsAPIServletservlet-name>#JsAPIServlet/servlet-name>

#    /wxJsAPIServlet

  

####################################################。簽章演算法類別Sign程式碼:######################
##package com.test.util;

/***

 * V型知識庫 www.vxzsk.com

# */

import java.util.UUID;

導入java.util.Map;

導入java.util.HashMap;

導入java.util.Formatter;

導入java.security.MessageDigest ;

import java.security.NoSuchAlgorithmException;

#import java.io.UnsupportedEncodingException;  

  public class Sign {

    public 

static Map sign(String jsapi_ticket, String url) {

        地圖; ret = new HashMap();

        String nonce_str = create_nonce_str();

#    String string1;

        String signature = "";

        //注意這裡參數名稱必須全部小寫,且必須小區

 

" &noncestr=" + nonce_str +

                  "×tamp=" + url;

        System.out.println(string1);

        嘗試

        {

#            Message上#igest           crypt.

reset

();

            crypt.up

date

(string1.getBytes("UTF-8"));

# );        }

#        catch (NoSuchAlgorithmException  race();

        }

#        catch (UnsupportedEncodingException e)

        {

    

        ret.put("url", url);

        ret.put("jsapi_ticket", jsapi_ticket);

        ret.put("nonceStr",cnonce_str. ;

        ret.put("簽名", 簽名);

        

#return ret;## (final

 byte[] 哈希) {

        格式化程式 格式化程式 = new Formatter();

  

        {

            formatter.format("%02x", b);

        String result = formatter.toString();

        formatter.close();

#  private static String create_nonce_str () {

        return UUID.randomUUID().toString();

##    }

#  return Long.toString (System.currentTimeMillis() / 1000);

    }

    public static void 

main

( Util .getJSApiTicket();

        // 注意 URL 使用動態取得,且無法 hardcode

        String /url是你要求的一個

action

或controller位址,並且方法直接跳到使用jsapi的jsp介面        Map ret = sign(jsapi_ticket ret = sign(jsapi_ticket ret = sign(jsapi_ticket ret = sign(jsapi_ticket ret = sign(jsapi_ticket ret);

        for (Map.Entry entry : ret.entrySet()) {

          

##        }

    };

}

#產生jsapi_ticket參數的工具類別JsapiTicketUtiltil代碼

產生jsapi_ticket參數的工具類別Jsapi

##package com.test.util;

import java.io.BufferedReader;

import java.io.IOException;

導入java.io.InputStreamReader;

導入java.net.MalformedURLException;

導入java.net.URL;

##導入java.net.URLConnection;

import net.sf.

json

.JSONObject;import com.test.weixin.TestAcessToken;

public class JsapiTicketUtil {

    /***

     * 模擬get請求

     * @param url

     * @param 

     */

     public static String sendGet(String url, String charset, int timeout)

      {

        String result = "";

        嘗試

        {

          若          {

            URLConnection conn = u.openConnection();

            con Reader = new BufferedReader(new InputStreamReader(conn.getInputStream) ( ), 字元集));

            String line="";

          

null

)

            {

              

            in.close();

          } catch (IOException e) {

           }

        catch (MalformedURLException e)

        {           返回結果;        }

        與getAccessToken(){

            String appid="你在公有

            String url ="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+app TestAcessToken.sendGet(url, "utf-8", 10000);

            String accessToken = (String) JObject.fromObject(backData).  

            return accessToken;

     }

    public 

        //取得token

        String acess_token= JsapiTicketUtil.getAccessToken( /ticket/ getticket?access_token="+acess_token+"&type=jsapi";  

        String backData=TestAcessToken.sendGet(urlStr, "utf-8. icket = (String) JSONObject .fromObject(backData).get("ticket");  

        return  ticket;  

    ##        String jsapiTicket = JsapiTicketUtil.getJSApiTicket();

        S的}

上述程式碼中有一個取得access_token的方法,請讀者更換自己的參數即可

jsapi.jsp程式碼

測試場景:開啟微信公眾號,點擊選單回覆帶有請求servlet位址,跳到jsapi.jsp介面連結位址,然後介面會彈出呼叫微信jsapi成功或失敗的視窗訊息,所以還需要接下來的程式碼:
##

字串路徑= request.getContextPath();

字串basePath = request.getScheme()+"://"+request.getServerName()+":"+request .getServerPort ()+path+"/";

%>

HTML PUBLIC "-//

HTML PUBLIC "-//W3C//DTD

 HTML 4.01 過渡//EN">

  head

>

    ">

    微信jsapi測試-V型知識庫

    viewport" content="width=320.1,initial-scale= 1,minimum-scale=1,maximum-scale=1,user-scala

#ble=no">

     

  

  

  

歡迎來到微信jsapi測試介面-V型知識庫 h3>

  

     

時間戳:${ 時間戳}

  

     

nonceStr:${ nonceStr}

  

     

簽章:${ 簽章}

  

     

appId:${ appId}

  

    onclick

=「uploadImg();」/>  

    #取得目前位置

" onclick="getLocation();"/>  

  

  javascript

">

  wx.config({  

debug: true, // 開啟調試模式

,呼叫的所有api的回傳值會在客戶端alert出來,若要查看確定的參數,在pc端打開,參數資訊會透過log打出,僅pc端時才會印製。 / 必填,產生簽章的時間  

    nonceStr: '${ nonceStr}', // 必填,產生簽署的隨機串  

   必填,簽名,見附件1  

    jsApiList: ['chooseImage','getLocation','openLocation'] // 必填,需要使用的JS

介面

列表,所有JS介面列表見附錄2  

});  

wx.ready(function(){  

    alert("就緒");  

});  

wx.error(function (res) {

  alert("呼叫微信jsapi回傳的

狀態

:"+res.errMsg);

# });

function uploadImg() {  

#    wx.checkJsApi({  

    ¡  偵測形式的JS介面列表,所有JS介面清單請見附錄2,  

        success: function(res) {  

   使用為假

            // 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}  

>           wx.chooseImage ({  

                  

count

: 1, //   original', 'compressed'], // 可以指定是原圖還是壓縮圖,預設二者都有                    sourceType: ['album', 'camera'],         success: function (res是圖片

  

                    alert(localIds);  

                 });  

        }  

## 

}  function getLocation() {      var latitude = "";     

        type: 'gcj02', // 默認為wgs84的gps座標,若要回直接給予openLocation的火星座標,可傳入為'gcj02' {  

            latitude = res.latitude; // 緯度,以浮點數,範圍為90 ~ -90  // 經度,浮點數,範圍為180 ~ - 180。

            var speed = res.speed; // 速度,以公尺/每秒計  

   

##            wx.openLocation( {  

                latitude: latitude, // 緯度,以浮點數,範圍為90 : longitude, // 經度,浮點數,範圍為180 ~ -180。

#                name: '你目前的位置', // 位置名稱  

     

                scale: 26, // 

#「地圖

縮放等級,整形值,範圍從1~28。

                infoUrl: '' // 在檢視位置介面底部顯示的#超連結,可點選跳轉      }  

    });  

}  

  

  

WeChatServlet為微信接入的servlet,不清楚的同學可學習我們的微信開發教程。

##package com.test;

import java.io.IOException;

import java.io.PrintWriter;

導入java.util.Date;

導入java.util.Map;

導入javax.servlet.ServletException;

導入javax.servlet.http.HttpServlet;

導入javax.servlet.http.HttpServletRequest;

導入javax.servlet.http.HttpServletResponse;

導入com.test.message.resp.TextMessage;

#import com.test.util.MessageUtil;

/**

 * 核心請求處理類別

 * doGet方法裡 有個weixinTest,這個是公眾管理平台裡面自己設定的token 大家根據自己的token替換

# */

public 類別WeChatServlet 擴充HttpServlet {

    private static final long 

#    private static final long 

#    private static final long 

#    private static final long 

#    private static final long 

#    private static final long 

#    private static final long 

#    private 處的;

    /**

     * 確認請求來自微型訊號伺服器

     */

    public void doGet(HttpServletRequest 請求, HttpServlet # .println(" V型知識庫原創www.vxzsk.com");

        //微信加密簽章

        String signature  request.getParameter("#c); out.println("微信加密簽章signature:------------------------"+signature);

        // 計時器

        String timestamp = request.getParameter("timestamp");

        System.out.println("時間戳記:------------------ ------"+timestamp);

        // 隨機數

        String nonce = request.getParameter("nonce)); ("隨機數nonce:------------------------"+nonce);

        // 隨機字串

        String echostr = request.getParameter("echostr");

        System.out.printlnln("隨機字串- ----------"+echostr);

        //System.out.println("token------------------ -- ----:"+token);

        PrintWriter out = response.getWriter();

       ,表示接入成功,否則接入失敗

        if (SignUtil.checkSignature("weixinTest", signature, timestamp, nonce)) 

            //System.out.println("這是:"+echostr);

        } out = null;

    }

    /**

     * 處理微型訊號伺服器發送的訊息

     * 實例原始碼在文章上方有下載連線

     */

    public void doPost(HttpServletRequest 請求, Htt    System. out .println("V型知識庫原創www.vxzsk.com");

        System.out.println("微信伺服器發送訊息------------") ;

        // 將請求、回應的編碼都設為UTF-8(防止中文亂碼)

        request.set 。

        String respMessage = null;

        try{

   questMap = MessageUtil.parseXml(request);//接收微信發過來的xml格式

        //發送方帳號(open_id)

        String fromUserName 

##        String toUserName = requestMap.get("ToUserName");

        #        //訊息建立時間

        String createTime = requestMap.get("CreateTime");#1 weixinContent = requestMap.get ("Content");

        System.out.println("公眾號使用者寄來的文字訊息內容:"+weixinContent);

        //接下來我們用上一章節自己封裝好的工具類別

        if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {//文字類型 用戶回覆 「hh」#/簡訊自動回覆訊息# c文字訊息

        TextMessage textMessage = new TextMessage();

        toUserName);

        textMessage. setCreateTime(new Date().getTime());

        textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT) .    //回覆用戶的換行字串 \n表示換行

        StringBuffer buffer = new StringBuffer();

       

#        buffer.append("歡迎造訪").append("\n");

        buffer.append("微信jsapi測試介面").append("\n\n");

        buffer.append("回覆'hh'二字即可能顯示此訊息");

        }

else

{

        buffer.append("您好我為V

##        textMessage.setContent(buffer.toString());

        respMessage = 

# // 回應回覆訊息

        PrintWriter out = response.getWriter();

        #         }catch(Exception e){

          e.printStackTrace();

#  

MessageUtil工具類別

##TextMessage代碼
##package com.test.util;

import java.io.InputStream;

import java.io.Writer;

導入java.util.HashMap;

導入java.util.List;

#導入java.util.Map;

##導入javax.servlet.http。 ;

導入org.dom4j.

Document

;導入org.dom4j.Element;

導入org.dom4j.io.SAXReader;

導入com.test.message.resp.Article;

導入com.test.message.resp.MusicMessage;

導入com.test.message.resp.NewsMessage;

導入com.test.message.resp.TextMessage;

導入com.thoughtworks.xstream.XStream;

導入com.thoughtworks.xstream.core.util.QuickWriter ;

導入com.thoughtworks.xstream.io.HierarchicalStreamWriter;

導入com.thoughtworks.xstream.io.xml.PrettyPrintWriter;

com.thoughtworks.xstream. io .xml.XppDriver;

/**

 * 訊息工具類別

 */

公共類別MessageUtil {

    /**

     * 回傳訊息類型:文字

     */

public static final String RESP_MESSAGE_TYPE_TEXT = 「text」;

    /**

     * 回訊息類型:音樂

     */

#    public  final#Namp;RESP_MString; &*/

    public static final String RESP_MESSAGE_TYPE_NEWS = 「新聞」;

##    /**

     * 回訊息類型:圖文

     */

    /**

     * 要求訊息類型:文字

     */

    public static final String REQ_MESSAGE_TYPE_IMAGE = 「image」;

# # static final String REQ_MESSAGE_TYPE_LINK = “link”;

    /**

     * 要求訊息類型:圖片

     */

    public static final String REQ_MESSAGE_TYPE_LOCATION = “location”;

    /**

     * 請求訊息類型:連結

     */

    public static final String REQ_MESSAGE_TYPE_VOICE = 「語音」;

    /**

     * 請求訊息類型:地理位置

     */

#    /**

     * 請求訊息類型:

音訊

#     */    public static final String EVENT_TYPE_SUBSCRIBE = 「訂閱」;

##  static final String EVENT_TYPE_UNSUBSCRIBE = 「取消訂閱」;

    /**

     * 請求訊息類型:推播

     */

    public stat

##     * 解析微信發來的請求(XML)

     * 

     * @param requesto

#     * @param re例外###

     */

    @SuppressWarnings("unchecked")

    public static Map

        Map map = new HashMap

        // 讀取輸入流

        SAXReader  = reader.read(inputStream);

        // 得到xml根元素

        Element root = document.getRootElement(   List< Element> elementList = root.elements();

        // 遍歷所有子節點

         map.put(e.getName( ), e.getText());

        }

        // 釋放資源

  = null;

        return map;

#    }

    /**

     * 文字訊息物件轉換成xml  

     * @param textMessage 文字訊息物件

#*/

I      xstream .alias("xml", textMessage.getClass());

        return xstream.toXML(textMessage);

    }

# ## 

##    public static String musicMessageToXml(MusicMessage musicMessage) {

        xstream xstream.toXML(musicMessage);

    }

    /**

     * 音樂訊息物件轉換成xml  

     * @param musicMessage 音樂訊息物件

 #   */

    public static String newsMessageToX .getClass());

        xstream.alias("item", new Article().getClass());

      }

    /**

     * 圖文訊息物件轉換成xml  

     * @param newsMessage 圖文訊息物件

   @*/

    private static XStream xstream = new XStream(new Xpp  {

            return new PrettyPrintWriter(out) {

                //使用所有xml中的轉換增加CDATA標記

##                 @SuppressWarnings("unchecked")

                publicNode(String name, Class clazz) {

                    super.startNode(name,               protected void writeText(QuickWriter writer, String text) {

#                    if (cdata) {

        

                        writer.write(text);## .write(" ] ]>");

                    } 其他 {

                        writer.write(text);

                    }

                }

            } ;

        }

    });

}

TextMessage代碼

##package com.test.message.resp;公有類別TextMessage 擴充 BaseMessage {
    //回覆的訊息內容

    private String Content;

    public String get

    public void setContent(String content) {

        Content = content;

1

##BaseMessage程式碼

package com.test.message.resp;

/**

 * 訊息基類別(公用帳號 -> 一般使用者)

 */

public class BaseMessage {

    // 接收方帳號(收到的OpenID)

    private String ToUserName;

#    /

    // 訊息建立時間 (整數)

    private long CreateTime;

    // 訊息類型(

##    // 位元0x0

001

被標誌時,星號剛收到的訊息

    private int FuncFlag;

##        return ToUserName;    }

    public void setToUserName(User     }

#    public String getFromUserName() {

#        return FromUserName;

##    }     FromUserName = fromUserName;

    }

    public long getCreateTime() {

        return CreateTime {

        CreateTime = createTime;

    }

    public String getMsgType( {

 

##    public void setMsgType(String msgType) {

        MsgType = msgType;

    }

##  Flag;

}

    public void setFuncFlag(int funcFlag) {

        FuncFlag =

 

#效果如下:

#

以上是詳解微信開發微信jsapi與java初步存取方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!