1. 程式人生 > >微信java版本之掃碼關注公眾號(帶引數的臨時二維碼)

微信java版本之掃碼關注公眾號(帶引數的臨時二維碼)

1.生成帶引數的二維碼介面介紹

為了滿足使用者渠道推廣分析的需要,公眾平臺提供了生成帶引數二維碼的介面。使用該介面可以獲得多個帶不同場景值的二維碼,使用者掃描後,公眾號可以接收到事件推送。

目前有2種類型的二維碼,分別是臨時二維碼和永久二維碼,前者有過期時間,最大為1800秒,但能夠生成較多數量,後者無過期時間,數量較少(目前引數只支援1--100000)。兩種二維碼分別適用於帳號繫結、使用者來源統計等場景。

使用者掃描帶場景值二維碼時,可能推送以下兩種事件:

  1. 如果使用者還未關注公眾號,則使用者可以關注公眾號,關注後微信會將帶場景值關注事件推送給開發者。
  2. 如果使用者已經關注公眾號,在使用者掃描後會自動進入會話,微信也會將帶場景值掃描事件推送給開發者。

獲取帶引數的二維碼的過程包括兩步,首先建立二維碼ticket,然後憑藉ticket到指定URL換取二維碼。

建立二維碼ticket

每次建立二維碼ticket需要提供一個開發者自行設定的引數(scene_id),分別介紹臨時二維碼和永久二維碼的建立二維碼ticket過程。

臨時二維碼請求說明

http請求方式: POST
URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN
POST資料格式:json
POST資料例子:{"expire_seconds": 1800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}

永久二維碼請求說明

http請求方式: POST
URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN
POST資料格式:json
POST資料例子:{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": 123}}}
或者也可以使用以下POST資料建立字串形式的二維碼引數:
{"action_name": "QR_LIMIT_STR_SCENE", "action_info": {"scene": {"scene_str": "123"}}}

引數說明

引數 說明
expire_seconds 該二維碼有效時間,以秒為單位。 最大不超過1800。
action_name 二維碼型別,QR_SCENE為臨時,QR_LIMIT_SCENE為永久,QR_LIMIT_STR_SCENE為永久的字串引數值
action_info 二維碼詳細資訊
scene_id 場景值ID,臨時二維碼時為32位非0整型,永久二維碼時最大值為100000(目前引數只支援1--100000)
scene_str 場景值ID(字串形式的ID),字串型別,長度限制為1到64,僅永久二維碼支援此欄位

返回說明

正確的Json返回結果:

{"ticket":"gQH47joAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL2taZ2Z3TVRtNzJXV1Brb3ZhYmJJAAIEZ23sUwMEmm3sUw==","expire_seconds":60,"url":"http:\/\/weixin.qq.com\/q\/kZgfwMTm72WWPkovabbI"}
引數 說明
ticket 獲取的二維碼ticket,憑藉此ticket可以在有效時間內換取二維碼。
expire_seconds 二維碼的有效時間,以秒為單位。最大不超過1800。
url 二維碼圖片解析後的地址,開發者可根據該地址自行生成需要的二維碼圖片

錯誤的Json返回示例:

{"errcode":40013,"errmsg":"invalid appid"}

通過ticket換取二維碼

獲取二維碼ticket後,開發者可用ticket換取二維碼圖片。請注意,本介面無須登入態即可呼叫。

請求說明

返回說明

ticket正確情況下,http 返回碼是200,是一張圖片,可以直接展示或者下載。

HTTP頭(示例)如下:
Accept-Ranges:bytes
Cache-control:max-age=604800
Connection:keep-alive
Content-Length:28026
Content-Type:image/jpg
Date:Wed, 16 Oct 2013 06:37:10 GMT
Expires:Wed, 23 Oct 2013 14:37:10 +0800
Server:nginx/1.4.1

錯誤情況下(如ticket非法)返回HTTP錯誤碼404

掃描帶引數二維碼事件

使用者掃描帶場景值二維碼時,可能推送以下兩種事件:

  1. 如果使用者還未關注公眾號,則使用者可以關注公眾號,關注後微信會將帶場景值關注事件推送給開發者。
  2. 如果使用者已經關注公眾號,則微信會將帶場景值掃描事件推送給開發者。

1. 使用者未關注時,進行關注後的事件推送

推送XML資料包示例:

<xml><ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[subscribe]]></Event>
<EventKey><![CDATA[qrscene_123123]]></EventKey>
<Ticket><![CDATA[TICKET]]></Ticket>
</xml>

引數說明:

引數 描述
ToUserName 開發者微訊號
FromUserName 傳送方帳號(一個OpenID)
CreateTime 訊息建立時間 (整型)
MsgType 訊息型別,event
Event 事件型別,subscribe
EventKey 事件KEY值,qrscene_為字首,後面為二維碼的引數值
Ticket 二維碼的ticket,可用來換取二維碼圖片

2. 使用者已關注時的事件推送

推送XML資料包示例:

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[SCAN]]></Event>
<EventKey><![CDATA[SCENE_VALUE]]></EventKey>
<Ticket><![CDATA[TICKET]]></Ticket>
</xml>

引數說明:

引數 描述
ToUserName 開發者微訊號
FromUserName 傳送方帳號(一個OpenID)
CreateTime 訊息建立時間 (整型)
MsgType 訊息型別,event
Event 事件型別,SCAN
EventKey 事件KEY值,是一個32位無符號整數,即建立二維碼時的二維碼scene_id
Ticket 二維碼的ticket,可用來換取二維碼圖片

2.公眾號設定

設定url伺服器為微信推送的地址

3.程式碼實現

3.1微信推送

@Controller
@RequestMapping("/weixin/callback")
public class WeiXinCallBackAttentionController {
	
	/**
	 * 微信驗證回撥
	 * @param request
	 * @param response
	 * 
	 * 
	 * <xml><ToUserName><![CDATA[gh_2a5540516edb]]></ToUserName>
		<FromUserName><![CDATA[odwP2jt6aTBu_Dl1ypoUJ8pN9UOs]]></FromUserName>
		<CreateTime>1425633941</CreateTime>
		<MsgType><![CDATA[event]]></MsgType>
		<Event><![CDATA[SCAN]]></Event>
		<EventKey><![CDATA[0]]></EventKey>
		<Ticket><![CDATA[gQGK8DoAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL2RIVlBsRVBsdEhITk9jQzRaMXV6AAIEgXL5VAMECAcAAA==]]></Ticket>
		</xml>
	 */
	@RequestMapping(value="/init",method={RequestMethod.GET,RequestMethod.POST} )
	public void init(@RequestBody(required=false) String body,HttpServletRequest request,HttpServletResponse response){
		
		System.out.println(body.toString());
		System.out.println("================================微信URL回撥測試=========================");
		SAXReader saxReader = new SAXReader();
		Document document;
		try {
			try {
				document = saxReader.read(new ByteArrayInputStream(body.toString().getBytes("UTF-8")));
				Element rootElt = document.getRootElement();
				System.out.println("FromUserName==="+rootElt.elementText("FromUserName"));
			} catch (UnsupportedEncodingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	/*	
	 * 微信回撥驗證
	 * 
	 * String signature = request.getParameter("signature");
		String timestamp = request.getParameter("timestamp");
		String nonce = request.getParameter("nonce");
		String echostr = request.getParameter("echostr");
		
		String token = "dmx";
		
		PrintWriter out;
		try {
			out = response.getWriter();
			out.println(echostr);
			out.close();
			response.flushBuffer();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}*/
		
		
}
		
}


3.2微信生成帶引數的臨時二維碼,用於掃碼關注公眾賬號

@Controller
@RequestMapping("/attention")
public class WeiXinAttentionController {
	
	


	@RequestMapping(value = "/weixinAttention", method = RequestMethod.POST)
	@ResponseBody
	public Object init(@RequestBody String body, HttpServletRequest request,HttpServletResponse response) {
		try{
			
			KeyStore keyStore = KeyStore.getInstance("PKCS12");
			FileInputStream instream = new FileInputStream(new File(
					CustomizedPropertyPlaceholderConfigurer.getContextProperty("wx.cert").toString()));
			try {
				keyStore.load(instream, "見郵件".toCharArray());
			}finally {
				instream.close();
			}

			// Trust own CA and all self-signed certs
			SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore,
					"<span style="font-family: Arial, Helvetica, sans-serif;">見郵件</span><span style="font-family: Arial, Helvetica, sans-serif;">".toCharArray()).build();</span>
			// Allow TLSv1 protocol only
			SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
					sslcontext, new String[] { "TLSv1" }, null,
					SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
			CloseableHttpClient httpclient = HttpClients.custom()
					.setSSLSocketFactory(sslsf).build();
			// HttpGet httpget = new
			// HttpGet("https://api.mch.weixin.qq.com/secapi/pay/refund");
			JSONObject bodyXml = JSONObject.fromObject(body);
			HttpPost httppost = new HttpPost("https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token="+bodyXml.get("accessToken"));
			
			Map<String,Map<String,Integer>> sceneMap = new HashMap<String,Map<String,Integer>>();
			Map<String,Integer> sceneIdMap = new HashMap<String, Integer>();
			sceneIdMap.put("scene_id", (Integer) bodyXml.get("sceneId"));
			sceneMap.put("scene", sceneIdMap);
			
			JSONObject attentionXml = new JSONObject();
			attentionXml.put("expire_seconds", Integer.valueOf(bodyXml.get("expireSeconds").toString()));
			attentionXml.put("action_name", weixinActionName.ACTION_NAME_TEMPORARY);
			attentionXml.put("action_info", sceneMap);
			System.out.println("atten====="+attentionXml.toString());
			try {

				StringEntity se = new StringEntity(attentionXml.toString());
				
				httppost.setEntity(se);

				System.out.println("executing request" + httppost.getRequestLine());

				CloseableHttpResponse responseEntry = httpclient.execute(httppost);
				try {
					HttpEntity entity = responseEntry.getEntity();

					System.out.println("----------------------------------------");
					System.out.println(responseEntry.getStatusLine());
					if (entity != null) {
						System.out.println("Response content length: "
								+ entity.getContentLength());
						JSONObject result = null ;
						System.out.println("Response content length: "
								+ entity.getContentLength());
					BufferedReader bufferedReader = new BufferedReader(
								new InputStreamReader(entity.getContent()));
						String text;
						while ((text = bufferedReader.readLine()) != null) {
							System.out.println("text======="+text);
							result = JSONObject.fromObject(text);
						}
//此url位生成臨時二維碼url,掃碼後可進行公眾賬號關注
						String resultUrl = result.getString("url");
//						JSONObject result = new JSONObject();
						if(!StringUtils.isEmpty(resultUrl)){
							result.put("attentionUrl", resultUrl);
							result.put("expireSeconds", result.getString("expire_seconds"));
						}else{
							result.put("status", "error");
							result.put("errcode", result.getString("errcode"));
							result.put("errmsg", result.getString("errmsg"));
						}
						
						return result;

					}
					EntityUtils.consume(entity);
				}
				finally {
					responseEntry.close();
				}
			}
			finally {
				httpclient.close();
			}
			return null;		
		}catch(Exception e){
			e.printStackTrace();
			JSONObject result = new JSONObject();
			result.put("status","error");
			result.put("msg",e.getMessage());
			return result;
		}
	}
}


相關推薦

java版本關注公眾(引數臨時)

1.生成帶引數的二維碼介面介紹 為了滿足使用者渠道推廣分析的需要,公眾平臺提供了生成帶引數二維碼的介面。使用該介面可以獲得多個帶不同場景值的二維碼,使用者掃描後,公眾號可以接收到事件推送。 目前有2種類型的二維碼,分別是臨時二維碼和永久二維碼,前者有過期時間,最大為1

公眾參數怎麽生成?

一個 aec mar 數據查詢 col pro fff ESS 最大 微信公眾平臺提供了生成帶參數二維碼的接口。使用該接口可以獲得多個帶不同場景值的二維碼,用戶掃描後,公眾號可以接收到事件推送。二維碼分為臨時二維碼和永久二維碼!就算你不用代碼也沒關系,使用微號幫平臺渠道二維

公眾參數的使用?

img 推送 自己 粉絲 分組 每一個 ima 方便 進行 帶參數的二維碼:使用微號幫平臺生成,每一個二維碼都帶有參數,可以統計關註的每一個粉絲從哪裏來的,做到渠道場景分析,方便以後進行粉絲精細化運營,使用微號幫平臺其他發信息功能,針對性推送信息給公眾號粉絲。 1、創建渠道

生成引數,合成海報,後推送小程式

背景:公司開發的小程式要實現將產品免費給使用者試用的功能,使用者登入小程式後在產品頁可以將產品以二維碼海報的方式分享給微信好友,好友掃碼後跳轉公眾號,關注後公眾號推送小程式,點選小程式後跳轉到小程式中的相應產品頁面。 如下圖: 這裡涉及到兩個重要的環節: 1.生成帶

java 引數

//獲取ticketpublic static String getQr(String accessToken, String jsonMsg){ String result = null;

java生成引數

生成帶引數的二維碼 為了滿足使用者渠道推廣分析和使用者帳號繫結等場景的需要,公眾平臺提供了生成帶引數二維碼的介面。使用該介面可以獲得多個帶不同場景值的二維碼,使用者掃描後,公眾號可以接收到事件推送。 目前有2種類型的二維碼: 1、臨時二維碼,是有過期時間的,最長可以

掃描引數關注公眾自動分組

今天學習了建立帶引數的二維碼並建立標籤,掃描帶引數的二維碼後自動分組到所在的標籤中。首先,先建立帶引數的二維碼,程式碼如下: public function qrcodeAdd(){ if(IS_GET){ $this->display('qrcode_a

wechat-0050,公眾引數獲取與事件推送

獲取二維碼 1. 二維碼型別 臨時二維碼,是有過期時間的,最長可以設定為在二維碼生成後的30天(即2592000秒)後過期,但能夠生成較多數量。臨時二維碼主要用於帳號繫結等不要求二維碼永久儲存的業務場景 永久二維碼,是無過期時間的,但數量較少(目前為最多10萬個)。永久

公眾獲取引數

    public void publicQR(             HttpServletResponse response,HttpServletRequest requ

實現引數功能

.近期專案中需要使用到將在門店註冊的會員做個區分,以便每個商戶統計在微商城內的業績 在這裡就需要使用到帶引數的二維碼。將門店引數載入二維碼裡面,使用者在掃描二維碼後,將使用者唯一的openid關聯到使用者掃碼的門店   1 ,實現步驟 ① 當然是拿到使用者的accesstoken這個很重要,

開發–引數

1 接入 首先進入微信公眾號 -> 基本配置 下面是基本配置的頁面,在URL中填寫伺服器地址,這個地址就是接受微信推送事件的一個介面,我是使用thinkPHP框架開發的程式,在其中一個Module(Decoration)的Action目錄下新建一個類,比如叫: Wec

公眾平臺 生成引數

前言:最近一直在開發微信的東西,總結一下微信生成帶引數的二維碼。這個其實在參考文章的第一篇總結的非常詳細,大家可以參考一下。這裡總結一下微信生成帶引數二維碼的過程和主要開發程式碼。 注:本文使用RestTemplate提供遠端請求,RestTemplate是S

測試-生成引數

這是前臺樣式,關於後臺怎麼寫,先簡單地說一下思路。 我用的是Thinkphp3.2.3框架,以及LaneWeChat框架 * 獲取帶引數的二維碼的過程包括兩步,首先建立二維碼ticket,然後憑藉ticket到指定URL換取二維碼。 * 目前有2種類型的二維碼,分別是臨時二維

小程式生成引數

微信官方說明 PHP程式碼實現 需要呼叫的公共函式 function https_request($url,$data = null){ if(function_exists('curl_init')){ $curl = curl_ini

開發-生成引數及簡單使用

// 配置微信 function getWechatAccessToken(){ $appid = appid; $appsecret = appsecret; $url = 'https://api.

介面生成引數

為了滿足使用者渠道推廣分析的需要,公眾平臺提供了生成帶引數二維碼的介面。使用該介面可以獲得多個帶不同場景值的二維碼,使用者掃描後,公眾號可以接收到事件推送。 使用者掃描帶場景值二維碼時,可能推送以下兩種事件: (1)如果使用者還未關注公眾號,則使用者可以關注公眾號,關注後微

生成引數

現在微信開發平臺的開發已經越來越火,主要微信端的入口人數多,造成現在開發者很多。 今天遇到一個問題,就是微信端生成的帶引數的二維碼,來為後續推廣做準備,準備記錄一下微信公眾號方面的技術。 <?php $access_token ="fwefwe

小程式生成(引數

class ClientCode(View): """ 獲取access_token 引數: grant_type appid secret """ def get(self, reque

開放平臺第三方平臺代公眾發起網頁授權

正式講解之前我想問一個問題: 微信開放平臺第三方平臺為什麼會出現?或者說微信的開發人員為什麼弄出個開放平臺的第三方平臺出來? 我的理解是:原本公眾號開發時只能給一家公司開發,因為配置的網頁授權域名只有

公眾平臺生成引數

微信生成帶引數的二維碼有哪些應用場景?“帶引數的二維碼” :每一個生成的二維碼都帶有引數,可以統計關注的每一個粉絲從哪裡來的,做到渠道推廣分析,但是關注的都是同一個公眾號。目前有2種類型的二維碼,分別是臨時二維碼和永久二維碼,前者有過期時間,最大為1800秒,但能夠生成較多數