微信公衆號號開發(Java)

參考:http://www.cnblogs.com/fengzheng/p/5023678.htmlhtml

http://www.cnblogs.com/xdp-gacl/p/5151857.htmljava

 

一:先在微信測試公衆號網址申請一個測試帳號:web

https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index數組

二:配置內網穿透。ngrok安全

https://natapp.cn/服務器

下載。而後配置,有個受權碼微信

輸入命令:app

natapp - -authtoken 受權碼 80測試

以後再啓動,雙擊ngrok.exe便可,啓動後輸入命令將本機映射到外網,將本地8080端口下的web服務映射到外網80端口,命令以下:ui

ngrok http 8080

 

三:書寫代碼

package com.wx.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

/**
 * Created by xdp on 2016/1/25.
 * 使用@WebServlet註解配置WxServlet,urlPatterns屬性指明瞭WxServlet的訪問路徑
 */
@WebServlet(urlPatterns="/WxServlet")
public class WxServlet extends HttpServlet {

    /**
     * Token可由開發者能夠任意填寫,用做生成簽名(該Token會和接口URL中包含的Token進行比對,從而驗證安全性)
     * 好比這裏我將Token設置爲gacl
     */
    private final String TOKEN = "gacl";

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("開始校驗簽名");
        /**
         * 接收微信服務器發送請求時傳遞過來的4個參數
         */
        String signature = request.getParameter("signature");//微信加密簽名signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。
        String timestamp = request.getParameter("timestamp");//時間戳
        String nonce = request.getParameter("nonce");//隨機數
        String echostr = request.getParameter("echostr");//隨機字符串
        //排序
        String sortString = sort(TOKEN, timestamp, nonce);
        //加密
        String mySignature = sha1(sortString);
        //校驗簽名
        if (mySignature != null && mySignature != "" && mySignature.equals(signature)) {
            System.out.println("簽名校驗經過。");
            //若是檢驗成功輸出echostr,微信服務器接收到此輸出,纔會確認檢驗完成。
            //response.getWriter().println(echostr);
            response.getWriter().write(echostr);
        } else {
            System.out.println("簽名校驗失敗.");
        }

    }

    /**
     * 排序方法
     *
     * @param token
     * @param timestamp
     * @param nonce
     * @return
     */
    public String sort(String token, String timestamp, String nonce) {
        String[] strArray = {token, timestamp, nonce};
        Arrays.sort(strArray);
        StringBuilder sb = new StringBuilder();
        for (String str : strArray) {
            sb.append(str);
        }

        return sb.toString();
    }

    /**
     * 將字符串進行sha1加密
     *
     * @param str 須要加密的字符串
     * @return 加密後的內容
     */
    public String sha1(String str) {
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-1");
            digest.update(str.getBytes());
            byte messageDigest[] = digest.digest();
            // Create Hex String
            StringBuffer hexString = new StringBuffer();
            // 字節數組轉換爲 十六進制 數
            for (int i = 0; i < messageDigest.length; i++) {
                String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
                if (shaHex.length() < 2) {
                    hexString.append(0);
                }
                hexString.append(shaHex);
            }
            return hexString.toString();

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return "";
    }
}

而後在微信公衆號中配置URL和token

若是提交成功:控制檯會打印以下

我在配置的時候出現的錯誤:配置失敗。緣由是沒有寫  ngrok http 8080這一步。致使內網沒有穿透出去。

相關文章
相關標籤/搜索