1. 程式人生 > >微信開發坑哭了自己Code、OpenID、WXConfig、TOKEN、TICKET處處是坑

微信開發坑哭了自己Code、OpenID、WXConfig、TOKEN、TICKET處處是坑

在進行微信開發中,你時常會因為獲取某些值或者配置什麼設定而陷入莫名其妙的坑中,我也一樣。明明覺得對的,卻始終不成功,這篇文章主要總結一下我陷入的坑。

微信獲取openID

在進行微信開發中,你可能會想獲取使用者的openID,作為使用者在公眾號中的唯一憑證。
官方文件中對openID是這樣介紹的:為了識別使用者,每個使用者針對每個公眾號會產生一個安全的OpenID,如果需要在多公眾號、移動應用之間做使用者共通,則需前往微信開放平臺,將這些公眾號和應用繫結到一個開放平臺賬號下,繫結後,一個使用者雖然對多個公眾號和應用有多個不同的OpenID,但他對所有這些同一開放平臺賬號下的公眾號和應用,只有一個UnionID,可以在使用者管理-獲取使用者基本資訊(UnionID機制)文件瞭解詳情。
也許你會在使用者開啟我們的網頁時獲取到使用者的openID。
那問題來了,我們到底該怎麼獲取到這個openID呢?
你可以參考這地址下的文件:

http://mp.weixin.qq.com/wiki/4/9ac2e7b1f1d22e9e57260f6553822520.html
獲取openID的基本流程圖:

這裡寫圖片描述

  • 首先你需要獲取Code

    每次獲取的code只能使用一次,5分鐘未被使用自動過期。
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf0e81c3bee622d60&redirect_uri=你要回調的的地址&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect

在上面的連結中通過設定scope的值可以改變獲取方式,snsapi_base(不彈出授權頁面,直接跳轉,只能獲取使用者openid),snsapi_userinfo (彈出授權頁面,可通過openid拿到暱稱、性別、所在地。並且,即使在未關注的情況下,只要使用者授權,也能獲取其資訊)。

當開啟此連結時頁面將跳轉至 redirect_uri/?code=CODE&state=STATE。。這時上面的code便會被賦予值,這值便是我們想要的code。
- 通過Code獲取openID

獲取code後,請求以下連結獲取access_token:

https://api.weixin.qq
.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

如果成功返回json資料,上面便帶有我們想要的openID。本人在後臺開發中用到是SpringMVC技術,將就點看吧。

參考如下例項程式碼:

 @RequestMapping("startRegister")
    public void thCarStartRegister(Map<String, Object> map, HttpServletRequest request,Writer out) throws IOException{
        String wxcode = request.getParameter("code");
        if (wxcode != null && !"".equals(wxcode)) {// 判斷微信的code是否有值
            // 微信獲取使用者openID
            String openID = (String) JSON.parseObject(ThcHttpUtils.thcGet(WeiXinUtils.getWXAccessUri(wxcode), ""))
            out.wirte(openID);
        } else {//沒有code值重新重定向下
            return "redirect:" + WeiXinUtils.getWXCodeUri(THCarData.THCAR_URL + "startRegister");
        }
    }



    public static String getWXAccessUri(String wxcode) {
        String uri = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + APPID + "&secret=" + SECRET + "&code="
                + wxcode + "&grant_type=authorization_code";
        return uri;
    }

這樣便能取得openID,用於我們對使用者的唯一身份憑證。上面寫得比較粗糙,希望對你有幫助。

在使用微信的js時,對配置的設定


可以說這東西真麻煩,一不小心你就陷入坑中。一定要詳細再詳細的看文件。

2.配置js

$(function wxconfig(){
    wx.config({
    debug: true, // 開啟除錯模式,呼叫的所有api的返回值會在客戶端alert出來,若要檢視傳入的引數,可以在pc端開啟,引數資訊會通過log打出,僅在pc端時才會列印。
    appId: '', // 必填,公眾號的唯一標識
    timestamp: , // 必填,生成簽名的時間戳
    nonceStr: '', // 必填,生成簽名的隨機串
    signature: '',// 必填,簽名,見附錄1
    jsApiList: [] // 必填,需要使用的JS介面列表,所有JS介面列表見附錄2
    });
    wx.ready(function(){
    // config資訊驗證後會執行ready方法,所有介面呼叫都必須在config介面獲得結果之後,config是一個客戶端的非同步操作,所以如果需要在頁面載入時就呼叫相關介面,則須把相關介面放在ready函式中呼叫來確保正確執行。對於使用者觸發時才呼叫的介面,則可以直接呼叫,不需要放在ready函式中。
    });
    wx.error(function(res){
    // config資訊驗證失敗會執行error函式,如簽名過期導致驗證失敗,具體錯誤資訊可以開啟config的debug模式檢視,也可以在返回的res引數中檢視,對於SPA可以在這裡更新簽名。
    });
});


具體的瞭解請詳情文件。這裡需要特別強調的是wx.config的配置。

很有可能你會出現如下錯誤:

出現config:fail錯誤

這是由於傳入的config引數不全導致,請確保傳入正確的appId、timestamp、nonceStr、signature和需要使用的jsApiList

invalid signature簽名錯誤

建議按如下順序檢查:

2.確認config中nonceStr(js中駝峰標準大寫S), timestamp與用以簽名中的對應noncestr, timestamp一致。

3.確認url是頁面完整的url(請在當前頁面alert(location.href.split(‘#’)[0])確認),包括’http(s)://’部分,以及’?’後面的GET引數部分,但不包括’#’hash後面的部分。

4.確認 config 中的 appid 與用來獲取 jsapi_ticket 的 appid 一致。

5.確保一定快取access_token和jsapi_ticket。

6.確保你獲取用來簽名的url是動態獲取的,如上面的http://xxx.xxx.com/startRegister就是一個冬天的url。 如果是html的靜態頁面在前端通過ajax將url傳到後臺簽名,前端需要用js獲取當前頁面除去’#’hash部分的連結(可用location.href.split(‘#’)[0]獲取,而且需要encodeURIComponent),因為頁面一旦分享,微信客戶端會在你的連結末尾加入其它引數,如果不是動態獲取當前連結,將導致分享後的頁面簽名失敗。

7.一定要確保你進行配置的頁面url與簽名所用的url地址一致。如上面的配置是在http://xx.xx.com/startRegister這頁面上配置的,那麼你用於加密的url也要與此相同。

the permission value is offline verifying 錯誤

這個錯誤是因為config沒有正確執行,或者是呼叫的JSAPI沒有傳入config的jsApiList引數中。建議按如下順序檢查:

確認config正確通過。
如果是在頁面載入好時就呼叫了JSAPI,則必須寫在wx.ready的回撥中。
確認config的jsApiList引數包含了這個JSAPI。

permission denied 錯誤

該公眾號沒有許可權使用這個JSAPI,或者是呼叫的JSAPI沒有傳入config的jsApiList引數中(部分介面需要認證之後才能使用)。

function not exist 錯誤

當前客戶端版本不支援該介面,請升級到新版體驗。

本人例項程式碼:

前臺部分

<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>

$(function share() {
        wx.config({
            debug:true, // 開啟除錯模式,呼叫的所有api的返回值會在客戶端alert出來,若要檢視傳入的引數,可以在pc端開啟,引數資訊會通過log打出,僅在pc端時才會列印。
            appId : '${WXConfig.appId}', // 必填,企業號的唯一標識,此處填寫企業號corpid
            timestamp:${WXConfig.timestamp}, // 必填,生成簽名的時間
            nonceStr : '${WXConfig.nonceStr}', // 必填,生成簽名的隨機串
            signature : '${WXConfig.signature}',// 必填,簽名,見附錄1
            jsApiList:${WXConfig.jsApiList} // 必填,需要使用的JS介面列表,所有JS介面列表見附錄2
        });
        wx.ready(function() {
            alert("readyOK");
            // config資訊驗證後會執行ready方法,所有介面呼叫都必須在config介面獲得結果之後,config是一個客戶端的非同步操作,所以如果需要在頁面載入時就呼叫相關介面,則須把相關介面放在ready函式中呼叫來確保正確執行。對於使用者觸發時才呼叫的介面,則可以直接呼叫,不需要放在ready函式中。
        });
        wx.error(function(res) {
            alert("err:" + res.val());
            // config資訊驗證失敗會執行error函式,如簽名過期導致驗證失敗,具體錯誤資訊可以開啟config的debug模式檢視,也可以在返回的res引數中檢視,對於SPA可以在這裡更新簽名。
        });
    });

後臺部分

@RequestMapping(value = "/sharePage")
    public String thCarSharePage(Map<String, Object> map) throws Exception {
        String nonceStr = THCarUtils.getARandomString();
        String timestamp = Long.toString(System.currentTimeMillis() / 1000);
        String signature = WeiXinUtils.getWXSignature(WeiXinUtils.WEIXIN_JSAPI_TICKET, nonceStr, timestamp, SHARE_URL);
        WXJSConfig config = new WXJSConfig(WeiXinUtils.APPID, SHARE_URL, timestamp, nonceStr, signature,
                "['onMenuShareTimeline', 'onMenuShareAppMessage']");
        map.put("WXConfig", config);
        return "share/sharePage";
    }

其中WXJSConfig是自己封裝的類,裡面的屬性與配置一致,我就不給出了。

看到這,你可能又會因為獲取ACCESS_TOKEN和JSAPI_TICKET而犯愁。在官方文件中對應這兩個值給出了限制,意味著你每天獲取它們的次數是有上限的,我們不可以每次請求都獲取一次,我們需要對它們進行快取,你可以將其儲存在資料庫中,也可以直接放在記憶體中。下面是個人的方式,僅供參考,可能不是很合理。

public class WeiXinUtils {

public static String WEIXIN_TOKEN = "";// 注意微信TOKEN值得有效期為2小時。每日上限呼叫2000此,所有我們設每個小時呼叫一次
public static String WEIXIN_JSAPI_TICKET = "";
public static final String APPID = "wxe2b46f1dbc599123";
private static final String SECRET = "87j3a7f8f5n86764b78d8769298187c33";
private static final long TIME = 6000000;// 毫秒 ,100分鐘
// private static final long TIME = 10000;
private static int i = 0;
private static boolean haveStart = false;

static {
    System.out.println("start get token");
    if (!haveStart) {// 確保只調用一次
        startChangeWXToken();
        haveStart = true;
    }
}

/**
 * 定時獲取獲取微信的Token值
 */
public static void startChangeWXToken() {
    TimerTask task = new TimerTask() {
        @Override
        public void run() {
            WeiXinUtils.WEIXIN_TOKEN = JSON
                    .parseObject(ThcHttpUtils.thcGet("https://api.weixin.qq.com/cgi-bin/token",
                            "grant_type=client_credential&appid=" + APPID + "&secret=" + SECRET))
                    .getString("access_token");
            startChangejsapiTicket();
        }
    };
    Timer timer = new Timer();
    timer.schedule(task, 0, TIME);
}

/**
 * 定時獲取JSAPI_TICKET
 */
private static void startChangejsapiTicket() {
    boolean isOK = false;
    while (!isOK) {
        if (WEIXIN_TOKEN != null && !WEIXIN_TOKEN.isEmpty()) {
            WeiXinUtils.WEIXIN_JSAPI_TICKET = JSON
                    .parseObject(ThcHttpUtils.thcGet("https://api.weixin.qq.com/cgi-bin/ticket/getticket",
                            "access_token=" + WEIXIN_TOKEN + "&type=jsapi"))
                    .getString("ticket");
            isOK = true;
        }
    }

}
}

上面的APPID與SECRET是虛構的。上面通過定時器的方式每100分鐘會呼叫一次方法,更新TOKEN與TICKET的值。
為了讓專案部署到伺服器上就是其有值,本人使用了靜態塊的方式,並在bean中進行宣告。

<bean id="WXUtils" class="com.lihetech.thcar.util.WeiXinUtils"/>

上面這些是個人在微信開發過程中的小小總結。寫的比較粗糙,希望對你由幫助。您在開發中你要確保相關公眾號是正常的,相關許可權有開通。所使用的域名與你在公眾號中設定的一致。

相關推薦

開發自己CodeOpenIDWXConfigTOKENTICKET處處

在進行微信開發中,你時常會因為獲取某些值或者配置什麼設定而陷入莫名其妙的坑中,我也一樣。明明覺得對的,卻始終不成功,這篇文章主要總結一下我陷入的坑。 微信獲取openID 在進行微信開發中,你可能會想獲取使用者的openID,作為使用者在公眾號中的唯

開發相關,解一下

alt 機制 簽名配置 發送消息 還需 eight html 很多 容易 前言:   從微信公眾號到現在的小程序,涉及微信開發方面的內容越來越多,工作大多時候是需要我們更了解微信開發的,比如老大說要做個什麽東西,涉及到微信的,我們能立馬想到方案或者提出可行性的分析嗎? 因

開發一(與自己的後臺互動)

在進入微信開發前,首先我們要將我們的ip對映成url訪問地址,這裡我用的是natapp,感覺還是挺穩定的,只不過對映的地址擱一段時間會被替換掉 接下來進入到微信的公眾號平臺裡面去,如果還沒申請的話可以進行申請,微信的公眾號分為三種:訂閱號,服務號,企業號,

開發】02.搭建一個屬於自己公眾平臺

tro 投票 新浪 關系 blank 訂閱 logs name 開發者 閱讀目錄 【網站開發】在新浪SAE上搭建一個博客 概述   公司年會上同事開發了一個微信企業號,包含了投票,抽獎,祝福墻功能,還開了一個Session,跟我們講了下公司的企業號開發過程和抽獎中獎

開發模式之自己定義菜單實現

ces event pre api pid 開發人員 web weixin src 編輯模式和開發模式是有沖突的。所以我們啟用微信公眾號的開發模式之後。那些菜單是看不到的哦。只是如今個人訂閱號是不能夠使用高級開發人員模式的。如自己定義菜單,只是我們還是能夠通過測試號

蘋果手機 開發下jquery 的一些

mage 時間格式 image 標簽 out point put pointer ava 最近做維系項目中遇到了一些jquery的坑: function GetRTime(){ var EndTime= new Date(‘<?php echo

開發的一些神

code AS valid pro 開發 也不會 但是 菜單 book 微信自定義菜單接口權限問題 最近在開發一個微信第三方平臺,在開發自定義菜單接口的時候遇到一個坑。發送的json數據明明是正確的,因為已經與官方文檔的示例一一對比過了。但是依舊返回40119錯誤,意思是b

[開發] - weixin4j獲取網頁授權後的code進而獲取使用者資訊

weixin4j封裝好的SnsComponent元件中的方法可以執行該步驟 WeixinUserInfoController : package com.baigehuidi.demo.controller; import com.baigehuidi.demo.loader.WeixinIn

[開發] - weixin4j獲取網頁授權後的code進而獲取用戶

port -c ota UNC ets ces rip return mage weixin4j封裝好的SnsComponent組件中的方法可以執行該步驟 WeixinUserInfoController : package com.baigehuidi.demo.

開發事件---未來元素點選事件

相信不少人在微信裡開發過網頁,在非a/button標籤時,頁面沒重新整理生成的新元素我們一般都用$(document).unbind('click',".preview_imag").on('click',".preview_imag",function(){       

開發(3)不要掉進Cookie的

在開發中我遇到了這樣一個問題: 線上環境通過多臺主機多例項部署,所以要用redis儲存統一的session資訊,然後通過一個uid為key來區分,當用戶通過微信網頁鑑權介面(整個介面的互動我寫在了action裡面)時會給使用者分配一個uid然後以此uid為ke

開發之兩天快速開發一個自己小程式

一.寫在前面 1.為什麼要學小程式開發?     對於前端開發而言,微信小程式因為其簡單快速、開發成本低、使用者流量巨大等特點,也就成了前端開發工程師必會的一個技能。 2.先看看小程式效果 (1)歡迎頁 (2)首頁:輪播頭圖,天氣,豆瓣電影正在熱映

開發 介面配置失敗的新手注意

申請的SAE 用來微信開發,填寫完URL TOKEN後總會莫名其妙的爆出配置失敗 如下的錯誤 出現這種原因有如下的原因 ,,看你中招了沒 。。。 (1)最基本的檢查這兩個地方是否正確(怎麼檢查 不用我說吧) (2)當發現上面的填寫沒問題 那就看這個你中招沒,,你是否實名

開發中踩過的

1、spa單頁模式不適合微信開發         所有需要使用JS-SDK的頁面必須先注入配置資訊,否則將無法呼叫(同一個url僅需呼叫一次,對於變化url的SPA的web app可在每次url變化時進行呼叫,目前Android微信客戶端不支援pushState的H5新特性

開發中遇到的access_token ,access_token失效和重新整理

這真是一個巨大的坑,為了避免以後踩到同樣的坑和幫助剛接觸這塊的同學快速脫坑,我花了些時間研究問題的來龍去脈,提供了一個不太完美的解決方案,以及未來規劃的完美解決方案。問題現象在開發微信jssdk的影象介面功能時,測試環境和迴歸環境都ok。但是更新到預釋出環境後,功能就異常了,

JS-SDK說明文件---自己總結config時的引數獲取方式

http://203.195.235.76/jssdk/ 1、引入js http://res.wx.qq.com/open/js/jweixin-1.0.0.js 或  https://res.wx.qq.com/open/js/jweixin-1.0.0.js  2、

關於開發上傳檔案的

微信網頁開發遇到的坑 最近在做一個外包專案,老闆要求使用微信網頁開發,什麼是微信網頁開發呢?我簡單的總結下我在微信開發遇到的兩種網頁: 第三方網站 這個是我自己給的稱謂,所謂的第三方網站就是沒有使用微信給的API,用原生或者框架程式碼做成的網站,這個網站

開發-爹的80埠對映之nginx

測試開發時,用的ngrok對映到本地ip+自定義埠,開發到了網頁授權階段,地址被發現沒有備案,瞬間被禁了。改用了花錢買了的natapp對映地址。開發完畢後,準備正式上線了。 正式上線使用的是阿里雲ECS,域名也是買的阿里雲,使用的阿里雲DNS解析,之前沒有做過域名解析,用了

開發error:40163 code been used

在使用測試號開發的時候遇到了這個問題,報錯顯示access_token未定義,然後我就獲取access_token時的返回值打印出來顯示error:40163 code been used,然後在網上查詢時有各種各樣的答案,但是都無法解決。下面是常見的幾個原因 1.網站沒備

開發筆記-調用自定義分享接口

彈出菜單 菜單 開發筆記 n-1 onf target ready 模式 時間戳 文章來自:http://www.cnblogs.com/ysyn/archive/2015/07/23/4665897.html 引言:   工作中開發微信網站,簡稱微網站。由於微