基於微信開發 專題

微信接口建立菜單40016,Invalid button size:php

查詢接口
建立菜單時參考文檔,最好不要直接複製查詢菜單接口的響應:
https://mp.weixin.qq.com/wiki/10/0234e39a2025342c17a7d23595c6b40a.htmlcss

調用菜單查詢接口時,返回以下html

200 OK
Connection: close
Date: Fri, 30 Dec 2016 07:02:32 GMT
Content-Type: application/json; encoding=utf-8
Content-Length: 349
{
    "menu": {
        "button": [
            {
                "name": "一級菜單", 
                "sub_button": [
                    {
                        "type": "view", 
                        "name": "用戶", 
                        "url": "xxx", 
                        "sub_button": [ ]
                    }
                ]
            }
        ]
    }
}

最好不要直接把這個結果作修改,而後調用建立菜單接口,必定要注意最外層沒有menu前端

{
    "button": [
        {
            "name": "hyq", 
            "sub_button": [
                {
                    "type": "view", 
                    "name": "用戶", 
                    "url": "xxx", 
                    "sub_button": [ ]
                }
            ]
        }
    ]
}

http://www.javashuo.com/article/p-qpyunagt-nn.htmljava


 

 

 

 

 

appid和mch_id不匹配\n\t Error code: channel_request_error 多是沒有開通微信支付能力:node

 

 

其中微信的APP ID是在開放平臺獲取的:
mysql

 

  

 

 

 

 

 

https://gitee.com/srddrs/smartwx-bootnginx

https://gitee.com/qingfengtaizi/wxmpgit

https://gitee.com/binary/weixin-java-toolsgithub

 

 

SDK下載
注意事項
騰訊QQ互聯平臺爲廣大開發者整理了如下SDK列表,輔助開發者快速接入QQ登陸、分享等功能。
使用時請注意:
1. 如下有Connect_logo_1.png 標誌的是QQ登陸團隊提供的官方版本。
2. 歡迎廣大開發愛好者自行開發其餘語言版本的SDK,並分享到開發者論壇-開源SDK共享(驚喜禮物等你拿!)
3. 對於非官方SDK包,因爲騰訊未對其進行驗證,所以沒法保證其可用性。使用時遇到問題請直接與做者聯繫或在論壇上反饋,騰訊公司將不提供相關的技術支持。
4. 本頁面提供的SDK所有基於OAuth2.0協議。原有基於OAuth1.0協議的SDK下載請見:SDK下載_OAuth1.0


SDK for 網站接入

http://wiki.open.qq.com/wiki/website/SDK%E4%B8%8B%E8%BD%BD

 

Weixin4J爲Java微信開發愛好者提供的微信公衆開發平臺SDK,簡化了Java對微信的開發。
https://gitee.com/weixin4j/weixin4j/
http://www.weixin4j.org



連接到往期回顧內容在自定義菜單中的頁面地址中選擇跳轉到歷史消息列表便可。該操做至關於複製歷史消息列表連接到頁面地址。

軟件工具:微信公衆平臺

一、進入平臺的自定義菜單,選擇已有或者建立一個「往期回顧」菜單,在頁面地址下點擊「從公衆號圖文消息中選擇」。

二、點擊歷史記錄,選中「跳轉到歷史消息列表」。

https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzA3OTc4MTQ5NQ==#wechat_redirect

 


三、保存發佈併發布,或者選擇預覽發送到測試號去看下效果。

四、預覽效果。歷史消息中顯示以前所發佈的消息。

 



微信開放平臺--掃碼登錄
微信開放平臺https://open.weixin.qq.com

網站應用微信登陸開發指南
準備工做
網站應用微信登陸是基於OAuth2.0協議標準構建的微信OAuth2.0受權登陸系統。
在進行微信OAuth2.在進行微信OAuth2.0受權登陸接入以前,在微信開放平臺註冊開發者賬號,並擁有一個已審覈經過的網站應用,並得到相應的AppID和AppSecret,申請微信登陸且經過審覈後,可開始接入流程。
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN

新增一個網站應用的入口https://open.weixin.qq.com/cgi-bin/frame?t=home/web_tmpl&lang=zh_CN

 實踐:https://www.cnblogs.com/0201zcr/p/5133062.html



微信公衆號開發:

微信-公衆平臺https://mp.weixin.qq.com

https://github.com/ihaolin/wechat

 

 

--獲取用戶信息中文亂碼的解決方案

在微信開發中咱們會常常須要獲取用戶的信息。
微信給咱們提供了獲取用戶信息的api,
地址爲

https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

將其中的access_token替換爲咱們的access_token 
openid爲關注用戶的openid就能夠獲取到用戶的信息了。

問題描述

不過獲取到的數據倒是中文亂碼

 

而用Java程序獲取的結果也是同樣的

 

解決方案

這個亂碼主要是因爲微信那邊採用的是「ISO-8859-1」編碼形成的。

咱們對獲取的結果進行編碼

 

    String token = AccessTokenTool.getAccessToken();
    String URL = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
    // 原始json
    String jsonResult = HttpUtil.sendGet(URL.replace("OPENID", openid).replace("ACCESS_TOKEN", token));
    System.out.println(jsonResult);
    // 編碼後的json
    String json = new String(jsonResult.getBytes("ISO-8859-1"), "UTF-8");
    System.out.println(json);

獲取自定義菜單亂碼也是同樣的解決方法

 

參考文獻

獲取用戶基本信息(UnionID機制) 
HttpUtil工具類參考

 http://blog.csdn.net/frankcheng5143/article/details/51612550

 


微信公衆號開發小結:
使用了框架https://gitee.com/kingshine/FastBootWeixin
造型理由,基於spring boot,readme一看就懂,項目活躍。雖然個別地方仍是不很理解
遇到的問題:
項目集成了spring security,要對FastBootWeixin相關的url進行權限處理 pass
點擊按鈕後須要跳轉到相關url,這個時候須要附帶可以標識用戶的相關信息,譬如code或openId。目前採起的處理辦法是這樣的:
WxButton中寫有一個url,這個url會盅到後臺另外一個url,這個url會redirect到獲取code的url,而後微信回調第三個接口。
目前方案的流程:
btn Url-->後臺api_1【redirect 獲取用戶信息的url https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842】-->微信服務器回調接口2 api_2  -->根據code從FastBootWeixin,至此就獲取到用戶的openId
--->根據openId獲取到用戶UserName,生成token--->redirect 前端頁面地址?token=生成的用戶token---->前端服務目前已經拿到token,至關於完成了登錄過程
===========================================================================
===========================================================================
上面的交互流程看看怎麼優化下

微信公衆號的一些有用的功能,回覆信息後,後臺能夠給予響應。這個地方也能夠是一個好的入口

其它問題:
這個項目是先後端分離的,而且分開部署。微信公衆號須要使用80端口,前端頁面也要使用80端口。
這個時候要麼分開部署到兩臺機器,要麼使用nginx分流

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        #listen       80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;	
		client_max_body_size	10m;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location /{
            proxy_pass 	http://localhost:8081;
        }
		
        location /wx{
            proxy_pass 	http://localhost:8080;
        }

        location /api{
            proxy_pass 	http://localhost:8080;
        }		

        location /swagger-ui.html{
            proxy_pass http://localhost:8080;
        }
		
        location /swagger{
            proxy_pass http://localhost:8080;
        }
		
        location /swagger-resources{
            proxy_pass http://localhost:8080;
        }
		
        location /webjars{
            proxy_pass http://localhost:8080;
        }
		
        location /v2/api-docs{
            proxy_pass http://localhost:8080;
        } 
		

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

}

上面配置中兩個坑:
(1)一個是前端的坑:前端的nodejs程序只listen了服務器的外網ip,因此上面的配置沒有生效。
錯誤信息以下:
The page you are looking for is temporarily unavailable. Please try again later.
而後curl 一個這個localhost:8081 也是connect refuse的。嘗試了幾回,不行。而後問前端的同窗,說沒有監聽localhost和127.0.0.1 (哭)
解決辦法:

        location /{
            proxy_pass 	http://localhost:8081;
        }

改成

        location /{
            proxy_pass 	http://nodesjs監聽的IP(引自爲服務器的外網ip):8081;
        }

(2)FastBootWeixin框架在微信網頁受權時,報錯:

微信登陸失敗
受權回調域名校驗出錯,錯誤碼:1003

解決辦法:

        location /wx{
            proxy_pass 	http://localhost:8080;
        }

更改成:

        location /wx{
            proxy_set_header   Host $host; //解決getRequestURL、getServerName、getServerPort
                                           //若是nginx是80服務,上面就夠,表明默認servlet_port是80;不然須要Host $host:$server_port,不配置servlet_port會致使丟失端口
            proxy_pass 	http://localhost:8080;
        }

Tips:受權域名回調,此處回調的域名在正規企業號中配置的地方:
開發--->接口權限-->網頁受權獲取用戶基本信息 後面的「修改」-->公衆號設置-->功能設置-->網頁受權域名

PS:在企業號或服務號中設置域名時,還須要一個文件MP_verify_s48K3hK0cfXLUMMn.txt,若是須要nginx 轉發,配置辦法以下:

        location = /MP_verify_s48K3hK0cfXLUMMn.txt{
              proxy_set_header   Host $host;
              proxy_pass        http://localhost:8080;
        }

上面配置中有兩個注意事項:
1:location後面要加空格,不然會報錯:

[root@localhost nginx]# nginx -s reload
nginx: [emerg] unknown directive "location=/MP_verify_s48K3hK0cfXLUMMn.txt" in /etc/nginx/nginx.conf:64

2: 擴展名的點號"."前不須要加轉義符「\」,由於使用「=」時,是直接匹配,沒有使用正則表達式

1、語法規則:
location [=|~|~*|^~] /uri/ { … }
= 開頭表示精確匹配
^~ 開頭表示uri以某個常規字符串開頭,理解爲匹配 url路徑便可。nginx不對url作編碼,所以請求爲/static/20%/aa,能夠被規則^~ /static/ /aa匹配到(注意是空格)。
~ 開頭表示區分大小寫的正則匹配
~*  開頭表示不區分大小寫的正則匹配
!~和!~*分別爲區分大小寫不匹配及不區分大小寫不匹配 的正則
/ 通用匹配,任何請求都會匹配到。
多個location配置的狀況下匹配順序爲(參考資料而來,還未實際驗證,試試就知道了,沒必要拘泥,僅供參考):
首先匹配 =,其次匹配^~, 其次是按文件中順序的正則匹配,最後是交給 / 通用匹配。當有匹配成功時候,中止匹配,按當前匹配規則處理請求。
例子,有以下匹配規則:
location = / {
   #規則A
}
location = /login {
   #規則B
}
location ^~ /static/ {
   #規則C
}
location ~ \.(gif|jpg|png|js|css)$ {
   #規則D
}
location ~* \.png$ {
   #規則E
}
location !~ \.xhtml$ {
   #規則F
}
location !~* \.xhtml$ {
   #規則G
}
location / {
   #規則H
}
那麼產生的效果以下:
訪問根目錄/, 好比http://localhost/ 將匹配規則A
訪問 http://localhost/login 將匹配規則B,http://localhost/register 則匹配規則H
訪問 http://localhost/static/a.html 將匹配規則C
訪問 http://localhost/a.gif, http://localhost/b.jpg 將匹配規則D和規則E,可是規則D順序優先,規則E不起做用,而 http://localhost/static/c.png 則優先匹配到規則C
訪問 http://localhost/a.PNG 則匹配規則E,而不會匹配規則D,由於規則E不區分大小寫。
訪問 http://localhost/a.xhtml 不會匹配規則F和規則G,http://localhost/a.XHTML不會匹配規則G,由於不區分大小寫。規則F,規則G屬於排除法,符合匹配規則可是不會匹配到,因此想一想看實際應用中哪裏會用到。
訪問 http://localhost/category/id/1111 則最終匹配到規則H,由於以上規則都不匹配,這個時候應該是nginx轉發請求給後端應用服務器,好比FastCGI(php),tomcat(jsp),nginx做爲方向代理服務器存在。

http://blog.csdn.net/oranyujian/article/details/42169597




注意事項:
一、回調頁面域名或路徑需使用字母、數字及「-」的組合(例:wx.qq.com或wx.qq.com/mp),不支持IP地址、端口號及短鏈域名。填寫的域名或路徑需與實際回調URL中的域名或路徑相同。
二、填寫的域名須經過ICP備案的驗證。
三、將文件MP_verify_s48K3hK0cfXLUMMn.txt(點擊下載)上傳至填寫域名或路徑指向的web服務器(或虛擬主機)的目錄(若填寫域名,將文件放置在域名根目錄下,例如wx.qq.com/MP_verify_s48K3hK0cfXLUMMn.txt;若填寫路徑,將文件放置在路徑目錄下,例如wx.qq.com/mp/MP_verify_s48K3hK0cfXLUMMn.txt),並確保能夠訪問。



在測試號中設置時,點「修改」會直接彈出對話框,讓填寫須要回調的域名

 

http://blog.sina.com.cn/s/blog_56d8ea900102vhaj.html
http://blog.csdn.net/sondx/article/details/7593540
緣由解析:
已經確認過「網頁受權獲取用戶基本信息」中配置的url是沒有錯誤的
後與FastBootWeinxin項目的做者光正 聯繫(在此處要感謝一個光正,贊)
肯定回調地址是這樣的

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxd63033623663454d&redirect_uri=http%3A%2F%2Flocalhost%3A9090%2Fwx%2Fv1%2Fnavigate%2Findex%2Fbtn&response_type=code&scope=snsapi_userinfo&state&connect_redirect=1#wechat_redirect

,緣由是redirect_uri是經過下面的api獲取的

String redirectUrl = request.getRequestURL() + (StringUtils.isEmpty(request.getQueryString()) ? "" : "?" + request.getQueryString());

來獲取的,而後
可是由於你這個經過nginx代理,因此致使取requestURL時取到的是localhost



使用nginx後後端



差點忘記了,還有一個大坑:
接入指南https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319
項目中使用了com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter,而後就憑空出了一個坑:
返回的echostr,加了一個雙引號一個雙引號,
而後微信服務器認證就不經過

解決辦法:
在com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter前面添加org.springframework.http.converter.StringHttpMessageConverter就不會出現這個問題

   @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

        // See SPR-7316,for weixin token verify.fastjson will convert string 123 to "123"
        StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter();
        stringHttpMessageConverter.setWriteAcceptCharset(false);
        //增長兩個優先處理的轉換類型.
        converters.add(new ByteArrayHttpMessageConverter());
 converters.add(stringHttpMessageConverter); 
        FastJsonHttpMessageConverter httpMessageConverter = new FastJsonHttpMessageConverter();
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(SerializerFeature.QuoteFieldNames,
                SerializerFeature.WriteEnumUsingToString,
                SerializerFeature.WriteMapNullValue,
                SerializerFeature.WriteDateUseDateFormat,
                SerializerFeature.DisableCircularReferenceDetect);
        fastJsonConfig.setSerializeFilters((ValueFilter) (o, s, source) -> {
            if (source == null) {
                return "";
            }
            if (source instanceof Date) {
                return ((Date) source).getTime();
            }
            return source;
        });
        httpMessageConverter.setFastJsonConfig(fastJsonConfig);
        converters.add(httpMessageConverter);
    }

spring3.0開始引用org.springframework.http.converter.HttpMessageConverter


定義上面報錯緣由的途徑:
在postman中帶上微信服務器的參數【日誌中有】,去訪問配置的接口,查看返回值便可

 

回覆的關鍵詞回覆中文亂碼

解決辦法:

@Configuration
public class WechatWebConfig implements WebMvcConfigurer {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter();
        stringHttpMessageConverter.setDefaultCharset(StandardCharsets.UTF_8);
        converters.add(0, stringHttpMessageConverter);

        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        converters.add(1, converter);
    }

 


 

 http://www.javashuo.com/article/p-aeihakxs-hp.html
https://blog.csdn.net/slx3320612540/article/details/81251642

 




還有一個坑,差點忘掉:
使用nginx後,swaager上展現的接口不能調用,因此的請求地址都變成對127.0.0.1主機的請求,顯示是不對的【應該是部署的服務器地址】
解決辦法

swagger.host=1gepingguo.cn 

這樣調用的接口,就會請求http://1gepingguo.cn/具體的api接口

Spring MVC中jsessionid所引發的問題
多餘的jsessionid,spring boot+spring-boot-starter-web時,@Controller時,return "redirect:"+url;時,redirect被額外添加了一個「;jsessionid=xxx」,致使前端不能正常處理

http://youhuale.cn/;jsessionid=7037A79EACA055A2F6DA8137990472D3?token=eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhMzg0ZmM5MS03YmFjLTQ4NmEtYWQ2Ny1hNjgxZTBmNTkxNWUiLCJleHAiOjE1MTE4NzkxMzcsImlhdCI6MTUxMTgzNTkzNywiaXNzIjoiaGoiLCJhdWQiOiJhcHAifQ.xrdiokjHhSH0V0smi8x19zJ-AUi99KQ2Vepr9Kl3er1UcNAMPlSn9SSVtKKv9C77ZBjaMWjigoqNopSNRjgRgg


解決辦法:

不經過Spring MVC作重定向,本身直接調用:
response.sendRedirect(url);

encodeRedirectURL()僅在沒法肯定瀏覽器是否支持cookie的時候纔會在url後面附加上jsessionid,若是它能找到一個jsessionid的cookie,它就認爲瀏覽器是支持cookie的。所以能夠本身建立一個jsessionid的cookie來欺騙encodeRedirectURL()。
Cookie cookie = new Cookie("jsessionid", "2jcligmgi6fh");
cookie.setMaxAge(Integer.MAX_VALUE);
response.addCookie(cookie);
而後再調用Spring MVC的重定向功能就沒有問題了:
return new ModelAndView("redirect:"+url);

無疑,這裏最好的方法是第3種方法。

 

緣由:
在Spring MVC當使用RedirectView或者"redirect:"前綴來作重定向時,Spring MVC最後會調用:
response.sendRedirect(response.encodeRedirectURL(url));

對於IE來講,打開一個新的瀏覽器窗口,第一次訪問服務器時,encodeRedirectURL()會在url後面附加上一段jsessionid,若是初始的url爲"http://www.sina.com.cn",最終獲得的url爲"http://www.sina.com.cn;jsessionid=2jcligmgi6fh"。

這是典型的Java作事的方式,其餘語言的服務器端平臺並不會這樣作。這個jsessionid不少時候會引發嚴重的問題,例如,若是你使用上述帶有jsessionid的url直接訪問新浪的網站,IE會向你報告:找不到服務器。

http://blog.csdn.net/zshake/article/details/37658147

相關問題:

Spring MVC項目中頁面重定向通常使用return "redirect:/other/controller/";便可。而Spring Boot使用了@RestController註解,上述寫法只能返回字符串,解決方法以下:

將一個HttpServletResponse參數添加處處理程序方法而後調用response.sendRedirect("some-url");

@RestController
public class FooController {

  @RequestMapping("/foo")
  void handleFoo(HttpServletResponse response) throws IOException {
    response.sendRedirect("some-url");
  }

}

https://www.cnblogs.com/EasonJim/p/7459486.html

mysql中的case when

SELECT
    tu.id userId,
    tu.real_name realName,
    cdp.id developPlanId,
    cdp.doing,
    cdp.ability,
    cdp.wealth,
    cdp.living_location livingLocation,
    CASE
WHEN cdp.stage_type = 0 THEN
    'Now'
WHEN cdp.stage_type = 1 THEN
    '一兩年後的'
WHEN cdp.stage_type = 127 THEN
    'Future'
END stageType
FROM
    career_develop_plan cdp
JOIN tb_user tu ON cdp.user_id = tu.id
ORDER BY
    cdp.id ASC,
    stage_type DESC

http://blog.csdn.net/qq_35620807/article/details/52665383
MySql 中 case when then else end 的用法 https://www.cnblogs.com/renpei/p/5485730.html

用戶沒有關注公衆號,經過https://open.weixin.qq.com/connect/oauth2/authorize來獲取用戶的openId時,能夠不要求用戶關注公衆號,就可獲取到openId,但不能獲取用戶的nickName及頭像信息


Oauth2在微信這一點的請求流程:

用fiddler攔截的相關數據以下:
重定向的是這個地址:
Location: https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxdbadbfd67fdf29c8&redirect_uri=http%3A%2F%2Fyouhuale.cn%2Fwx%2Fv3%2Fnavigate%2Findex&response_type=code&scope=snsapi_userinfo&state#wechat_redirect 
以後又重定向到這個
http://youhuale.cn/wx/v3/navigate/index?code=001xnDOx1L0Bsg0DaDQx1mMxOx1xnDOV&state= 
也就是說code其實拿到了

 

微信 {"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}

{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}

 

聲明:是已認證的服務號

 

這個問題已解決!!

 

前置說明

網頁受權獲取用戶基本信息:兩種 scope 域

https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope={2}&state=ok#wechat_redirect

snsapi_base 不須要用戶點贊成,直接跳轉到受權後的頁面,只能用於獲取openid,不能獲取用戶基本信息

snsapi_userinfo 會徵求用戶贊成,受權後,能夠獲取用戶基本信息

 

爲了方便你們理解,把接口返回的數據展現下吧

{

    "access_token":"YNTxefBAfNW565Q4MAI..................j-hLNzin9Vq6BnvcvJ8NKHdBSRhkLjHQliLiNQc",

    "expires_in":7200,

    "refresh_token":"EYmfmvUg0PGtOWiLpb..................T8O2UyKL95_Da23fLV-nYFDgnt14Ljl_x_zCMY",

    "openid":"oYbGRs8MmU6bESxXcX2Z0rFRivjQ",

    "scope":"snsapi_base"

}

{

    "access_token":"IdFXvRMq3J6vXUcZ0iQ..................G1xbkGJEnbnSKQ4G0nyQ5vmNSKF4a4DzGu64",

    "expires_in":7200,

    "refresh_token":"J8ot4JWphxwvyAY3I9r..................krET6P-8dot_-_tQfFoLUQI3EI-NT-I-degNRGumA",

    "openid":"oYbGRs8MmU6bESxXcX2Z0rFRivjQ",

    "scope":"snsapi_userinfo"

}

 

問題再現

1  首次使用 scope=snsapi_base 進行網頁受權

2  拿到 code 後調用接口 https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code

3  根據上一步獲取的 openid 和 access_token 調用接口 https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}&lang=zh_CN 獲取用戶基本信息

4  獲取失敗:返回 {"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}

 

失敗緣由

scope=snsapi_base 時,只能用於獲取openid,不能獲取用戶的基本信息(獲取用戶信息,須要用戶贊成。scope=snspai_base 受權時,並無徵求用戶贊成受權這一操做)

 

問題來了

(有時候成功,有時候失敗)

爲何有的時候(或者另一個公衆號),按上面的步驟,能成功獲取到用戶的基本信息?

「48001,api unauthorized」之因此讓不少人疑惑不解,就在於這個問題

 

先直接上解決方式,再說緣由

使用 scope=snsapi_userinfo 進行一次網頁受權,步驟跟上面【問題再現】同樣,成功獲取到用戶的微信基本信息。

再使用 scope=snsapi_base 重複一遍【問題再現】,此次成功了!!!

 

緣由

上面的實驗其實已經說明緣由了,怕有些人一會兒理解不了,因此

第一次使用 scope=snsapi_base,這是不須要通過用戶贊成的受權,不能獲取用戶的基本信息

第二次使用 scope=snsapi_userinfo,這是須要用戶點擊贊成的受權,能獲取到用戶的基本信息

使用 scope=snsapi_userinfo,用戶贊成受權後,在必定時間內,不須要用戶的贊成,也能夠獲取用戶基本信息(此時使用 scope=snsapi_base 也能獲取到用戶基本信息:甚至參數openid的值隨便填都不要緊,能夠是空格,但不能爲空)

 

注意

使用 scope=snsapi_userinfo,用戶贊成受權後,access_token 的有效期是7200秒(兩小時)。

access_token 失效後,可使用 refresh_token 調用接口 https://api.weixin.qq.com/sns/oauth2/refresh_token?appid={0}&grant_type=refresh_token&refresh_token={1} 從新獲取 access_token(有效期7200秒)

(終於知道 refresh_token 是幹嗎用的了吧)

refresh_token 的有效期是30天,即用戶贊成受權後,在30天內,再也不須要用戶贊成受權,就能夠獲取用戶基本信息

https://www.cnblogs.com/liaolongjun/p/6080240.html?utm_source=itdadao&utm_medium=referral


如何在微信公衆號上發佈一個投票活動?
https://jingyan.baidu.com/article/84b4f565bd13a060f6da323b.html

 

獲取當前一個公衆號的二維碼:

不少時候,咱們須要本身的公衆號二維碼,或者其餘公衆號的二維碼,又懶得去找,有沒有簡單的方法呢?今天小編就給你們帶來了一個簡單快速獲取二維碼的方法。
http://open.weixin.qq.com/qr/code/?username=原始ID
上面就是微信官方獲取二維碼的接口,紅色部分就是微信號,記住:不是」名稱「,也不是」原始ID「。
可是,目前已不支持我的微信號,只支持微信公衆號。
原始ID示例:

 

微信text客服消息的換行:

首先肯定微信上消息文本換行是採用 \n 換行的。

錯誤作法:
推送到公衆號的消息文本採用的是單引號包含內容。這樣是不行的,不會換行,會原樣返回
return array('歡迎您關注愛心互助公衆服務號,開啓您的財富之旅。如需人工服務請加\n客服微信號:187182764,\n客服QQ號:27688677,\n客服電話:181281606', 'text');

正確作法:
採用雙引號包含要推送的內容
return array("歡迎您關注愛心互助公衆服務號,開啓您的財富之旅。如需人工服務請加\n客服微信號:187182764,\n客服QQ號:27688677,\n客服電話:181281606", 'text');
這樣子纔會有換行效果。\n\n等相似處理便可

https://blog.csdn.net/everything1209/article/details/48294179

 

當用戶和公衆號產生特定動做的交互時(具體動做列表請見下方說明),微信將會把消息數據推送給開發者,開發者能夠在一段時間內(目前修改成48小時)調用客服接口,經過POST一個JSON數據包來發送消息給普通用戶。此接口主要用於客服等有人工消息處理環節的功能,方便開發者爲用戶提供更加優質的服務。

目前容許的動做列表以下(公衆平臺會根據運營狀況更新該列表,不一樣動做觸發後,容許的客服接口下發消息條數不一樣,下發條數達到上限後,會遇到錯誤返回碼,具體請見返回碼說明頁):

一、用戶發送信息
二、點擊自定義菜單(僅有點擊推事件、掃碼推事件、掃碼推事件且彈出「消息接收中」提示框這3種菜單類型是會觸發客服接口的)
三、關注公衆號
四、掃描二維碼
五、支付成功
六、用戶維權

爲了幫助公衆號使用不一樣的客服身份服務不一樣的用戶羣體,客服接口進行了升級,開發者能夠管理客服帳號,並設置客服帳號的頭像和暱稱。該能力針對全部擁有客服接口權限的公衆號開放。

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140547

超過48小時就會報下面的錯:

{
    "errcode": 45015,
    "errmsg": "response out of time limit or subscription is canceled hint: [mJiNCA09963924]"
}

 

相關文章
相關標籤/搜索