java對接微信公眾號


對接微信公眾號一般我們有測試地址和正式的微信公眾號,如果沒有正式的建議使用測試地址

微信公眾平台測試地址:https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index

正式的需要自己開通微信公眾號;

 

1,登錄微信公眾平台,設置
找到左側菜單中的開發基本配置

 

 

 

 

 基本配置要求

  1,白名單這個需要記住配置,否則獲取不到token, 

    獲取白名單IP方式, 瀏覽器中【百度】直接輸入ip,找到顯示出ip的這個,把這個寫入到白名單中就行

 

 

 

2,服務器地址 這個是自己項目的地址,一般加上一個方法名稱,主要為了驗證微信發送的消息

3,token 任意寫【按照微信要求】

4,EncodingAESKey 點擊生成就行

5,消息加解密方式 一般就選擇【明文】 【兼容模式】

 

 

 

 

問題:微信公眾號配置URL 請求URL超時

思路:這個可能是我們使用的ip地址是內網的地址, 我在家使用的是路由器提供的ip地址,那這個地址是內網的。總是不能讓微信通過域名把信息反給我們。
解決: 通過natapp這個軟件,我們可以得到一個免費的映射。
地址:https://natapp.cn/#download
下載軟件按照官網文檔操作

mac啟動后會出現界面,使用出現的域名作為微信公眾號配置的地址,然后加上自己的方法就可以。

 

 

微信配置

 

 

剩下的就是我們的controller中,主要注意點

1,返回的是字符串

2,返回的是微信給我門的echostr字符串,驗證方式可以到微信官網獲取

地址:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html  

https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Message_Encryption/Message_encryption_and_decryption.html

上邊兩個地址都可以找到下載的代碼,只是比較不好找, [官網上給出的demo,我這里總是出問題,不知道怎么調試。就往上找了一個,貼到下邊了]

 

 如果不驗真,直接返回微信給的echostr就可以

@ResponseBody
@RequestMapping("verify")
public String verifyUrl(String signature, String timestamp, String nonce, String echostr)
{
final boolean b = WeixinCheckoutUtil.checkSignature(signature, timestamp, nonce);
if(b)
{
return echostr;
}
return "0";
}
 
public class WeixinCheckoutUtil {

    // 與接口配置信息中的Token要一致
    private static String token = "ddrsgz";

    /**
     * 驗證簽名
     *
     * @param signature
     * @param timestamp
     * @param nonce
     * @return
     */
    public static boolean checkSignature(String signature, String timestamp, String nonce) {
        String[] arr = new String[] { token, timestamp, nonce };
        // 將token、timestamp、nonce三個參數進行字典序排序
        // Arrays.sort(arr);
        sort(arr);
        StringBuilder content = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {
            content.append(arr[i]);
        }
        MessageDigest md = null;
        String tmpStr = null;

        try {
            md = MessageDigest.getInstance("SHA-1");
            // 將三個參數字符串拼接成一個字符串進行sha1加密
            byte[] digest = md.digest(content.toString().getBytes());
            tmpStr = byteToStr(digest);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        content = null;
        // 將sha1加密后的字符串可與signature對比,標識該請求來源於微信

        return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
    }

    /**
     * 將字節數組轉換為十六進制字符串
     *
     * @param byteArray
     * @return
     */
    private static String byteToStr(byte[] byteArray) {
        String strDigest = "";
        for (int i = 0; i < byteArray.length; i++) {
            strDigest += byteToHexStr(byteArray[i]);
        }
        return strDigest;
    }

    /**
     * 將字節轉換為十六進制字符串
     *
     * @param mByte
     * @return
     */
    private static String byteToHexStr(byte mByte) {
        char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
        char[] tempArr = new char[2];
        tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
        tempArr[1] = Digit[mByte & 0X0F];
        String s = new String(tempArr);
        return s;
    }
    public static void sort(String a[]) {
        for (int i = 0; i < a.length - 1; i++) {
            for (int j = i + 1; j < a.length; j++) {
                if (a[j].compareTo(a[i]) < 0) {
                    String temp = a[i];
                    a[i] = a[j];
                    a[j] = temp;
                }
            }
        }
    }


    public static void main(String[] args)
    {

        String verifyMsgSig = "70023ded8e972680e8506161043feaeb1ae6d7c8";
        String timeStamp = "1609253670";
        String nonce = "584987070";
        String echoStr = "160542013663168510";
        final boolean b = checkSignature(verifyMsgSig, timeStamp, nonce);
        System.out.println(b);
    }
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM