เมนูที่กำหนดเองของแพลตฟอร์มสาธารณะ WeChat Development ต้องการเงินที่จะได้รับการรับรองเพื่อให้บรรลุ หากคุณไม่ต้องการใช้จ่ายเงินคุณสามารถเล่นกับบัญชีทดสอบเท่านั้น แต่สิ่งนี้ไม่ส่งผลกระทบต่อการพัฒนา การพัฒนาของฉันขึ้นอยู่กับการพัฒนาแอปพลิเคชันของแพลตฟอร์มสาธารณะ WeChat ของ Liu Feng
ตราบใดที่เราใช้แพลตฟอร์มสาธารณะเพื่อทดสอบบัญชีเราสามารถพัฒนาเมนูที่กำหนดเองได้ สะดวกกว่า บัญชีทดสอบมีอินเทอร์เฟซมากมายซึ่งสะดวกมาก
เมื่อพัฒนาเมนูที่กำหนดเองคุณสามารถอ้างถึงเมนูที่กำหนดเองในเอกสารนักพัฒนาแพลตฟอร์มสาธารณะ WeChat เพื่อสร้าง
1. เมนูปรับแต่ง
1. เมนูที่กำหนดเองรวมถึงเมนูระดับแรกสูงสุด 3 เมนูและเมนูระดับแรกแต่ละเมนูมีเมนูระดับสองวินาที
2. เมนูระดับแรกมีอักขระจีนสูงสุด 4 ตัวและเมนูระดับที่สองมีอักขระจีนมากถึง 7 ตัว ชิ้นส่วนพิเศษจะถูกแทนที่ด้วย "... "
3. หลังจากสร้างเมนูที่กำหนดเองกลยุทธ์การรีเฟรชเมนูคือเมื่อผู้ใช้เข้าสู่หน้าเซสชันบัญชีอย่างเป็นทางการหรือหน้าโปรไฟล์บัญชีอย่างเป็นทางการหากเขาพบว่าคำขอสุดท้ายที่จะดึงเมนูคือ 5 นาทีที่ผ่านมาเขาจะดึงเมนู หากเมนูได้รับการอัปเดตเมนูของลูกค้าจะได้รับการรีเฟรช ในระหว่างการทดสอบคุณสามารถพยายามยกเลิกการติดตามบัญชีสาธารณะและติดตามอีกครั้งจากนั้น
คุณสามารถเห็นผลกระทบหลังจากการสร้าง
อินเทอร์เฟซเมนูที่กำหนดเองสามารถใช้ปุ่มหลายประเภทดังนี้:
1. คลิก: คลิกเพื่อผลักดันเหตุการณ์
หลังจากผู้ใช้คลิกปุ่มประเภทคลิกเซิร์ฟเวอร์ WeChat จะส่งโครงสร้างของเหตุการณ์ประเภทข้อความไปยังผู้พัฒนาผ่านอินเทอร์เฟซข้อความ (ดูที่คู่มืออินเตอร์เฟสข้อความ) และนำค่าคีย์ที่กรอกโดยนักพัฒนาในปุ่ม นักพัฒนาสามารถโต้ตอบกับผู้ใช้ผ่านค่าคีย์ที่กำหนดเอง
2. ดู: กระโดด url
หลังจากผู้ใช้คลิกปุ่มประเภทมุมมองไคลเอนต์ WeChat จะเปิด URL หน้าเว็บที่กรอกโดยนักพัฒนาในปุ่มซึ่งสามารถรวมกับการอนุญาตเว็บเพจเพื่อให้ได้อินเทอร์เฟซข้อมูลพื้นฐานของผู้ใช้เพื่อรับข้อมูลพื้นฐานของผู้ใช้
3. scancode_push: รหัสสแกนเพื่อผลักดันเหตุการณ์
หลังจากผู้ใช้คลิกปุ่มไคลเอ็นต์ WeChat จะเรียกใช้เครื่องมือสแกนและแสดงผลการสแกนหลังจากดำเนินการสแกนเสร็จ (หากเป็น URL มันจะเข้าสู่ URL) และผลการสแกนจะถูกส่งผ่านไปยังนักพัฒนาและนักพัฒนาสามารถส่งข้อความได้
4. scancode_waitmsg: สแกนรหัสเพื่อผลักดันเหตุการณ์และกล่องพรอมต์ "ข้อความรับ" จะปรากฏขึ้น
หลังจากผู้ใช้คลิกปุ่มไคลเอนต์ WeChat จะเรียกเครื่องมือสแกน หลังจากเสร็จสิ้นการดำเนินการรหัสสแกนให้ส่งผลลัพธ์ของรหัสสแกนไปยังผู้พัฒนา ในเวลาเดียวกันเครื่องมือสแกนจะถูกปิดและกล่องพรอมต์ "ข้อความรับ" จะปรากฏขึ้นและจากนั้นข้อความที่ส่งโดยนักพัฒนาอาจได้รับ
5. PIC_SYSPHOTO: ระบบป๊อปอัพเพื่อถ่ายภาพและโพสต์รูปภาพ
หลังจากผู้ใช้คลิกปุ่มไคลเอ็นต์ WeChat จะปรับกล้องระบบ หลังจากดำเนินการถ่ายภาพเสร็จแล้วมันจะส่งภาพถ่ายที่จับได้ไปยังนักพัฒนาและผลักดันเหตุการณ์ไปยังนักพัฒนา ในเวลาเดียวกันมันจะถือกล้องระบบแล้วรับข้อความที่นักพัฒนาส่ง
6. pic_photo_or_album: ป๊อปอัพและถ่ายรูปหรือโพสต์รูปภาพในอัลบั้ม
หลังจากผู้ใช้คลิกปุ่มไคลเอ็นต์ WeChat จะปรากฏตัวเลือกให้ผู้ใช้เลือก "ถ่ายภาพ" หรือ "เลือกจากอัลบั้มโทรศัพท์มือถือ" หลังจากผู้ใช้เลือกเขาจะผ่านกระบวนการอีกสองกระบวนการ
7. PIC_WEIXIN: ผู้ส่งอัลบั้ม Pop-Up WeChat
หลังจากผู้ใช้คลิกปุ่มไคลเอนต์ WeChat จะปรับอัลบั้ม WeChat หลังจากเสร็จสิ้นการเลือกการเลือกจะส่งภาพถ่ายที่เลือกไปยังเซิร์ฟเวอร์ของนักพัฒนาและส่งเหตุการณ์ไปยังนักพัฒนา ในเวลาเดียวกันอัลบั้มจะปิด จากนั้นอาจได้รับข้อความจากนักพัฒนา
8. location_select: ตัวเลือกตำแหน่งทางภูมิศาสตร์ป๊อปอัพ
หลังจากผู้ใช้คลิกปุ่มไคลเอ็นต์ WeChat จะเรียกใช้เครื่องมือเลือกตำแหน่งทางภูมิศาสตร์ หลังจากเสร็จสิ้นการดำเนินการเลือกจะส่งที่ตั้งทางภูมิศาสตร์ที่เลือกไปยังเซิร์ฟเวอร์ของนักพัฒนาและในเวลาเดียวกันมันจะปิดเครื่องมือการเลือกตำแหน่งแล้วรับข้อความที่ส่งโดยนักพัฒนา
9. Media_id: ส่งข้อความ (ยกเว้นข้อความ)
หลังจากผู้ใช้คลิกปุ่มประเภท media_id เซิร์ฟเวอร์ WeChat จะส่งวัสดุที่สอดคล้องกับรหัสวัสดุถาวรที่ผู้พัฒนากรอกไว้ให้กับผู้ใช้ ประเภทวัสดุถาวรอาจเป็นรูปภาพเสียงวิดีโอและข้อความกราฟิก โปรดทราบ: รหัสวัสดุถาวรจะต้องเป็นรหัสกฎหมายที่ได้รับหลังจากอัปโหลดอินเทอร์เฟซ "การจัดการวัสดุ/เพิ่มวัสดุถาวร"
10. view_limited: ข้ามไปที่ URL ของข้อความ
หลังจากผู้ใช้คลิกปุ่มประเภท View_limited ไคลเอ็นต์ WeChat จะเปิด URL ข้อความกราฟิกที่สอดคล้องกับรหัสวัสดุถาวรที่กรอกโดยนักพัฒนาในปุ่ม ประเภทวัสดุถาวรรองรับข้อความกราฟิกเท่านั้น โปรดทราบ: รหัสวัสดุถาวรจะต้องเป็นรหัสกฎหมายที่ได้รับหลังจากอัปโหลดอินเทอร์เฟซ "การจัดการวัสดุ/เพิ่มวัสดุถาวร"
2. เข้าถึงอินเตอร์เฟสเมนูที่กำหนดเอง
1: รับ access_token
การสร้างการสืบค้นและการลบเมนูที่กำหนดเองจำเป็นต้องเรียกใช้อินเทอร์เฟซเมนูที่กำหนดเองที่เปิดไปยังแพลตฟอร์มสาธารณะ ในการเรียกอินเทอร์เฟซนี้คุณจะต้องได้รับ access_token (ข้อมูลรับรองการเข้าถึงอินเตอร์เฟส) อินเทอร์เฟซเหล่านี้ทั้งหมดขึ้นอยู่กับโปรโตคอล HTTPS ดังนั้นเราต้องแก้ปัญหาวิธีการส่งคำขอ HTTPS ในโปรแกรม Java ก่อน
รับข้อมูลรับรองการเข้าถึงอินเตอร์เฟส access_token:
การรับ access_token สามารถเข้าถึงได้ผ่าน Get:
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=appid&secret=appsecret
มีสามพารามิเตอร์ในลิงค์คือ Grant_type, Appid และ Secret ตามคำอธิบายพารามิเตอร์ในรูปที่ Grant_Type ส่งผ่าน client_credential ค่าคงที่และ AppId และ Secret ได้รับมอบหมายให้เราโดย WeChat หลังจากสมัครเมนูที่กำหนดเอง
หลังจากส่งคำขอเรียบร้อยแล้วเซิร์ฟเวอร์ WeChat จะส่งคืนสตริง JSON รวมถึง Access_Token และ Expires_in ในหมู่พวกเขา Access_token เป็นข้อมูลประจำตัวที่เราต้องการในที่สุดและ Expires_in คือระยะเวลาที่ถูกต้องของข้อมูลรับรองหน่วยคือวินาทีและ 7200 วินาทีคือ 2 ชั่วโมง ซึ่งหมายความว่าไม่ใช่ทุกครั้งที่คุณเข้าถึงอินเทอร์เฟซพิเศษคุณจะต้องได้รับ access_token อีกครั้งและสามารถใช้งานได้ตราบใดที่ Access_Token ยังคงอยู่ในระยะเวลาที่ถูกต้อง
2: การสร้างเมนู
หากต้องการสร้างเมนูให้โทรหาส่วนต่อประสานเมนู
คำอธิบายคำขอการโทรแบบอินเตอร์เฟส
วิธีการร้องขอ http: โพสต์ (โปรดใช้โปรโตคอล https) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=access_token
อันที่จริงแล้วมันคือการส่งสตริงเมนู JSON ในโพสต์ไปยังที่อยู่ https://api.weixin.qq.com/cgi-bin/menu/create?access_token=access_token
3. ห่อหุ้มวิธีการร้องขอทั่วไป (Custom Trust Manager)
ในการสร้างเมนูหนึ่งคือการได้รับอินเตอร์เฟส access_token และอื่น ๆ คือการปรับแต่งอินเทอร์เฟซเมนูทั้งสองเป็นคำขอ HTTPS
1: สร้างตัวจัดการความน่าเชื่อถือของใบรับรอง
สำหรับคำขอ HTTPS เราต้องมีตัวจัดการความน่าเชื่อถือของใบรับรอง คลาส Manager นี้จะต้องถูกกำหนดด้วยตัวเอง แต่จำเป็นต้องใช้อินเตอร์เฟส X509TrustManager รหัสมีดังนี้:
แพ็คเกจ org.liufeng.weixin.util; นำเข้า java.security.cert.certificateException; นำเข้า java.security.cert.x509certificate; นำเข้า Javax.net.ssl.x509trustManager; / ** * ตัวจัดการความน่าเชื่อถือของใบรับรอง (สำหรับคำขอ https) * * @author liufeng * @date 2013-08-08 */ คลาสสาธารณะ Myx509TrustManager ใช้ X509TrustManager {โมฆะสาธารณะ checkClientTrusted (x509Certificate [] เชน checkserverTrusted (x509Certificate [] chain, string authtype) พ่นใบรับรองการรับรู้ {} สาธารณะ x509certificate [] getacceptedissuers () {return null; - ฟังก์ชั่นของผู้จัดการใบรับรองคือการเชื่อถือใบรับรองทั้งหมดที่ระบุ
2: สร้างคำขอ HTTPS Universal
คำขอ HTTPS ที่เป็นสากลควร
1) สนับสนุนคำขอ HTTPS;
2) สนับสนุนรับและโพสต์;
3) การสนับสนุนการส่งพารามิเตอร์และยังไม่มีพารามิเตอร์;
แพ็คเกจ org.liufeng.weixin.util; นำเข้า java.io.bufferedreader; นำเข้า Java.io.InputStream; นำเข้า Java.io.InputStreamReader; นำเข้า Java.io.OutputStream; นำเข้า java.net.connectException; นำเข้า java.net.url; นำเข้า javax.net.ssl.httpsurlconnection; นำเข้า javax.net.ssl.sslcontext; นำเข้า javax.net.ssl.sslsocketfactory; นำเข้า Javax.net.ssl.TrustManager; นำเข้า net.sf.json.jsonobject; นำเข้า org.slf4j.logger; นำเข้า org.slf4j.loggerfactory; / ** * แพลตฟอร์มสาธารณะคลาสอินเตอร์เฟสเครื่องมือคลาส * * @author liuyq * @date 2013-08-09 */ คลาสสาธารณะ weixinutil {logger logger แบบคงที่ส่วนตัว = loggerFactory.getLogger (weixinutil.class); / *** เริ่มต้นคำขอ https และรับผลลัพธ์** @param requesturl request ที่อยู่* @param requestmethod วิธีการขอ (รับ, โพสต์)* @param outputstr ส่งข้อมูล* @return jsonobject (รับแอตทริบิวต์ของวัตถุ JSON jsonObject jsonObject = null; StringBuffer buffer = new StringBuffer (); ลอง {// สร้างวัตถุ SSLContext และเริ่มต้น TrustManager [] tm = {ใหม่ myx509trustManager ()}; sslContext sslContext = sslContext.getInstance ("ssl", "sunjsse"); sslcontext.init (null, tm, ใหม่ java.security.securerandom ()); // รับวัตถุ SSLSocketFactory จากวัตถุ SSLContext ด้านบน SSLSocketFactory SSF = SSLContext.getSocketFactory (); url url = url ใหม่ (requesturl); httpsurlconnection httpurlconn = (httpsurlconnection) url.openconnection (); httpurlconn.setsslsocketfactory (SSF); httpurlconn.setDooutput (จริง); httpurlconn.setDoInput (จริง); httpurlconn.setusecaches (เท็จ); // ตั้งค่าวิธีการร้องขอ (รับ/โพสต์) httpurlconn.setRequestMethod (requestMethod); if ("get" .equalsignorecase (requestmethod)) httpurlconn.connect (); // เมื่อมีข้อมูลที่จำเป็นต้องส่งถ้า (null! = outputstr) {outputStream outputStream = httpurlConn.getOutputStream (); // ให้ความสนใจกับรูปแบบการเข้ารหัสเพื่อป้องกันไม่ให้ OutputStream.write (outputstr.getBytes ("UTF-8")); outputstream.close (); } // แปลงสตรีมอินพุตที่ส่งคืนเป็นสตริงอินพุตอินพุตสตรีม = httpurlconn.getInputStream (); inputStreamReader inputStreamReader = new InputStreamReader (inputStream, "UTF-8"); bufferedReader bufferedReader = ใหม่ bufferedReader (inputStreamReader); string str = null; ในขณะที่ ((str = bufferedreader.readline ())! = null) {buffer.append (str); } bufferedReader.close (); InputStreamReader.close (); // รีลีสทรัพยากร inputstream.close (); inputStream = null; httpurlconn.disconnect (); jsonObject = jsonObject.FromObject (buffer.toString ()); } catch (ConnectException ce) {log.error ("การเชื่อมต่อเซิร์ฟเวอร์ Weixin หมดเวลา"); } catch (exception e) {log.error ("ข้อผิดพลาดคำขอ https: {}", e); } return jsonObject; - 4. คลาสเมนูเอนทิตีเมนู
1: การจำแนกประเภทของปุ่ม
เรามักจะถือว่ารายการเมนูที่กำหนดเองเป็นปุ่มและประเภทของปุ่มจะถูกแบ่งออกเป็นคลิก (เหตุการณ์คลิก) และดู (เยี่ยมชมหน้าเว็บ)
ปุ่มของคลิกประเภทมีสามแอตทริบิวต์: ประเภทชื่อและคีย์ในขณะที่ปุ่มมุมมองประเภทมีสามแอตทริบิวต์: ประเภทชื่อและ URL
2: ก่อนอื่นหลังจากเรียกอินเทอร์เฟซข้อมูลรับรองการเข้าถึงเซิร์ฟเวอร์ WeChat จะส่งคืนข้อมูลในรูปแบบ JSON: {"Access_Token": "Access_Token", "Expires_in": 7200} เราห่อหุ้มมันเป็นวัตถุ AccessToken วัตถุมีสองแอตทริบิวต์: โทเค็นและ expiresin รหัสมีดังนี้:
แพ็คเกจ org.liufeng.weixin.pojo; / ** * WeChat Universal Interface Credentials * * @author liufeng * @date 2013-08-08 */ คลาสสาธารณะ AccessToken {// โทเค็นสตริงส่วนตัวที่ได้รับ // เวลาที่ถูกต้องของข้อมูลรับรองหน่วย: วินาที INT ส่วนตัวหมดอายุ สตริงสาธารณะ getToken () {กลับมาโทเค็น; } โมฆะสาธารณะ Settoken (โทเค็นสตริง) {this.token = โทเค็น; } public int getExpiresin () {return expiresin; } โมฆะสาธารณะ setExpiresin (int expiresin) {this.expiresin = expiresIn; - ถัดไปคือการห่อหุ้มของโครงสร้างเมนู เนื่องจากเราใช้การเขียนโปรแกรมเชิงวัตถุข้อมูลเมนูรูปแบบ JSON ที่ส่งขั้นสุดท้ายควรแปลงโดยตรงจากวัตถุแทนที่จะสะกดข้อมูล JSON จำนวนมากลงในรหัสโปรแกรม การห่อหุ้มโครงสร้างเมนูขึ้นอยู่กับโครงสร้างเมนูรูปแบบ JSON ที่ให้ไว้ในเอกสาร API แพลตฟอร์มสาธารณะดังที่แสดงด้านล่าง:
ตัวอย่างคำขอคลิกและดู
{"ปุ่ม": [{"type": "คลิก", "ชื่อ": "เพลงวันนี้", "key": "v1001_today_music"}, {"ชื่อ": "เมนู", "sub_button": [{"type": "ดู", "ชื่อ": "ค้นหา" "type": "ดู", "ชื่อ": "วิดีโอ", "url": "http://v.qq.com/"}, {"type": "คลิก", "ชื่อ": "Like us", "key": "v1001_good"}]}}}}} 3: โครงสร้างเมนูห่อหุ้ม
วัตถุแต่ละปุ่มต้องการแอตทริบิวต์ชื่อสามัญดังนั้นคลาสฐานวัตถุปุ่มจำเป็นต้องกำหนดและวัตถุปุ่มทั้งหมดจำเป็นต้องสืบทอดคลาสนี้ รหัสของคลาสฐานมีดังนี้:
แพ็คเกจ org.liufeng.weixin.pojo; / ** * คลาสพื้นฐานของปุ่ม * * @author liufeng * @date 2013-08-08 */ ปุ่มคลาสสาธารณะ {ชื่อสตริงส่วนตัว; สตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; - ถัดไปคือการห่อหุ้มของรายการเมนูย่อย เมนูย่อยถูกกำหนดไว้ที่นี่ดังนี้: รายการเมนูที่ไม่มีเมนูย่อยอาจเป็นรายการเมนูรองหรือเมนูหลักที่ไม่มีเมนูรอง รายการเมนูย่อยประเภทนี้จะต้องมีสามแอตทริบิวต์: ประเภทชื่อและคีย์ รหัสห่อหุ้มมีดังนี้:
แพ็คเกจ org.liufeng.weixin.pojo; / ** * ปุ่มปกติ (ปุ่มย่อย) * * @author liufeng * @date 2013-08-08 */ คลาสสาธารณะ CommonButton ขยายปุ่ม {ประเภทสตริงส่วนตัว; คีย์สตริงส่วนตัว สตริงสาธารณะ getType () {ประเภทกลับ; } โมฆะสาธารณะ setType (ประเภทสตริง) {this.type = type; } Public String getKey () {return key; } โมฆะสาธารณะ setKey (คีย์สตริง) {this.key = key; - คำจำกัดความของรายการเมนูแม่: เมนูระดับแรกที่มีรายการเมนูรอง รายการเมนูประเภทนี้มีสองคุณสมบัติ: ชื่อและ sub_button และ sub_button เป็นอาร์เรย์ของรายการเมนูเมนู รหัสการห่อหุ้มของรายการเมนูหลักมีดังนี้:
แพ็คเกจ org.liufeng.weixin.pojo; / ** * ปุ่มคอมเพล็กซ์ (ปุ่มหลัก) * * @author liufeng * @date 2013-08-08 */ คลาสสาธารณะคอมเพล็กซ์ Button ขยายปุ่ม {ปุ่มส่วนตัว [] sub_button; ปุ่มสาธารณะ [] getSub_button () {return sub_button; } โมฆะสาธารณะ setsub_button (ปุ่ม [] sub_button) {this.sub_button = sub_button; - ห่อหุ้มเมนูทั้งหมด วัตถุเมนูมีรายการเมนูหลายรายการ (ส่วนใหญ่อาจมี 3) รายการเมนูเหล่านี้สามารถเป็นรายการเมนูย่อย (เมนูระดับแรกโดยไม่มีเมนูรอง) หรือรายการเมนูหลัก (รายการเมนูที่มีเมนูรอง)
แพ็คเกจ org.liufeng.weixin.pojo; / ** * เมนู * * @author liufeng * @date 2013-08-08 */ เมนูคลาสสาธารณะ {ปุ่มส่วนตัว [] ปุ่ม; ปุ่มสาธารณะ [] getButton () {ปุ่มส่งคืน; } โมฆะสาธารณะ setButton (ปุ่ม [] ปุ่ม) {this.button = ปุ่ม; -ด้วยวิธีนี้เราเสร็จสิ้นการห่อหุ้มของคลาสเอนทิตีเมนู
วิธีการรับข้อมูลรับรอง access_token
ดำเนินการต่อเพื่อเพิ่มรหัสต่อไปนี้ในคลาส weixinutil.java ของวิธีการร้องขอสากลก่อนหน้านี้เพื่อรับข้อมูลรับรองการเข้าถึงอินเตอร์เฟส:
// รับที่อยู่อินเตอร์เฟสของ Access_Token (รับ) จำกัด ไว้ที่ 200 เท่า/วันสาธารณะสตริงคงสุดท้าย access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid / ** * รับ access_token * * @param credential * @param apparam apparam appsecret key * @return */ สาธารณะ accesstoken getAccessToken (สตริง appid, string appsecret) {AccessToken AccessToken = null; string requestUrl = access_token_url.replace ("appid", appid) .retlace ("AppSecret", AppSecret); jsonObject jsonObject = httprequest (requesturl, "get", null); // ถ้าคำขอสำเร็จถ้า (null! = jsonObject) {ลอง {accessToken = new AccessToken (); AccessToken.settoken (jsonobject.getString ("Access_Token")); AccessToken.SeteXpiresin (jsonObject.getInt ("Expires_in")); } catch (jSonexception e) {accessToken = null; // ล้มเหลวในการรับโทเค็น log.error ("ล้มเหลวในการรับโทเค็น errcode: {} errmsg: {}", jsonobject.getInt ("errcode"), jsonobject.getString ("errmsg")); }} return AccessToken; - วิธีสร้างเมนูที่กำหนดเอง
ดำเนินการต่อเพื่อเพิ่มรหัสต่อไปนี้ในคลาส weixinutil.java ของวิธีการร้องขอสากลก่อนหน้านี้เพื่อสร้างเมนูที่กำหนดเอง:
// การสร้างเมนู (โพสต์) จำกัด 100 ครั้ง/วันสตริงคงที่ menu_create_url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=access_token"; / *** สร้างเมนู** @param เมนูเมนูตัวอย่าง* @param AccessToken access_token* @return 0 หมายถึงความสำเร็จค่าอื่น ๆ ระบุความล้มเหลว*/ public Static int createMenu (เมนูเมนู accessToken สตริง) {int result = 0; // ประกอบ URL ของเมนูการสร้างสตริง url = menu_create_url.replace ("access_token", AccessToken); // แปลงวัตถุเมนูเป็นสตริงสตริง JSON JSONMENU = JSONOBJECT.FROMOBJECT (เมนู) .toString (); // โทรหาอินเทอร์เฟซเพื่อสร้างเมนู jsonObject jsonObject = httprequest (url, "โพสต์", jsonmenu); if (null! = jsonObject) {ถ้า (0! = jsonObject.getInt ("errCode")) {result = jsonObject.getInt ("errCode"); log.error ("สร้างเมนูล้มเหลว errcode: {} errmsg: {}", jsonobject.getint ("errcode"), jsonobject.getString ("errmsg")); }} ผลการส่งคืน; - วิธีการโทรแบบห่อหุ้มเพื่อสร้างเมนูที่กำหนดเอง
แพ็คเกจ org.liufeng.weixin.main; นำเข้า org.liufeng.weixin.pojo.accessToken; นำเข้า org.liufeng.weixin.pojo.button; นำเข้า org.liufeng.weixin.pojo.commonbutton; นำเข้า org.liufeng.weixin.pojo.complexbutton; นำเข้า org.liufeng.weixin.pojo.menu; นำเข้า org.liufeng.weixin.util.weixinutil; นำเข้า org.slf4j.logger; นำเข้า org.slf4j.loggerfactory; / ** * คลาสผู้จัดการเมนู * * @author liufeng * @date 2013-08-08 */ ชั้นเรียนสาธารณะ Menumanager {บันทึกการบันทึกแบบคงที่ส่วนตัว = loggerFactory.getLogger (menumanager.class); โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// ผู้ใช้บุคคลที่สามผู้ใช้ข้อมูลรับรองที่ไม่ซ้ำกันสตริง appid = "00000000000000000"; // ผู้ใช้บุคคลที่สามผู้ใช้คีย์คีย์คีย์ที่ไม่ซ้ำกันแอพพลิเคชั่น AppSecret = "000000000000000000000000000000000000000"; // โทรหาอินเทอร์เฟซเพื่อรับ Access_Token AccessToken ที่ = Weixinutil.getAccessToken (AppId, AppSecret); if (null! = at) {// เรียกอินเทอร์เฟซเพื่อสร้างเมนู int result = weixinutil.createMenu (getMenu (), at.getToken ()); // กำหนดผลการสร้างเมนูถ้า (0 == ผลลัพธ์) log.info ("การสร้างเมนูสำเร็จ!"); else log.info ("การสร้างเมนูล้มเหลวรหัสข้อผิดพลาด:" + ผลลัพธ์); }} / ** * รวบรวมข้อมูลเมนู * * @return * / เมนูคงที่ส่วนตัว getMenu () {CommonButton BTN11 = New CommonButton (); btn11.setName ("พยากรณ์อากาศ"); btn11.setType ("คลิก"); btn11.setkey ("11"); CommonButton BTN12 = New CommonButton (); BTN12.SetName ("Bus Query"); BTN12.SetType ("คลิก"); BTN12.SetKey ("12"); CommonButton BTN13 = New CommonButton (); btn13.setName ("การค้นหาอุปกรณ์ต่อพ่วง"); BTN13.SetType ("คลิก"); BTN13.SetKey ("13"); CommonButton BTN14 = New CommonButton (); btn14.setName ("วันนี้ในประวัติศาสตร์"); BTN14.SetType ("คลิก"); BTN14.SetKey ("14"); CommonButton BTN21 = New CommonButton (); btn21.setName ("เพลง on Demand"); BTN21.SetType ("คลิก"); BTN21.SetKey ("21"); CommonButton BTN22 = New CommonButton (); btn22.setName ("เกมคลาสสิค"); btn22.setType ("คลิก"); BTN22.SetKey ("22"); CommonButton BTN23 = New CommonButton (); btn23.setName ("วิทยุที่สวยงาม"); BTN23.SetType ("คลิก"); BTN23.SetKey ("23"); CommonButton BTN24 = New CommonButton (); btn24.setName ("การจดจำใบหน้า"); BTN24.SetType ("คลิก"); BTN24.SetKey ("24"); CommonButton BTN25 = New CommonButton (); btn25.setName ("แชท"); BTN25.SetType ("คลิก"); BTN25.SetKey ("25"); CommonButton BTN31 = New CommonButton (); BTN31.SetName ("Q Friends Circle"); BTN31.SetType ("คลิก"); BTN31.SetKey ("31"); CommonButton BTN32 = New CommonButton (); btn32.setName ("การจัดอันดับภาพยนตร์"); BTN32.SetType ("คลิก"); BTN32.SetKey ("32"); CommonButton BTN33 = New CommonButton (); btn33.setName ("ตลกตลก"); BTN33.SetType ("คลิก"); BTN33.SetKey ("33"); ComplexButton MainBtn1 = New ComplexButton (); Mainbtn1.setName ("ผู้ช่วยชีวิต"); Mainbtn1.setsub_button (New CommonButton [] {BTN11, BTN12, BTN13, BTN14}); ComplexButton MainBtn2 = New ComplexButton (); Mainbtn2.setName ("สถานีโชคดี"); Mainbtn2.setsub_button (New CommonButton [] {BTN21, BTN22, BTN23, BTN24, BTN25}); ComplexButton MainBtn3 = New ComplexButton (); mainbtn3.setName ("ประสบการณ์มากขึ้น"); Mainbtn3.setsub_button (New CommonButton [] {BTN31, BTN32, BTN33}); /*** นี่คือโครงสร้างเมนูปัจจุบันของบัญชีอย่างเป็นทางการ Xiaoqrobot แต่ละเมนูระดับแรกมีรายการเมนูระดับที่สอง * * หากไม่มีเมนูระดับที่สองภายใต้เมนูระดับแรกที่แน่นอนเมนูควรกำหนดอย่างไร? * ตัวอย่างเช่นรายการเมนูระดับที่สามไม่ใช่ "ประสบการณ์มากกว่า" แต่เป็น "ตลกตลก" โดยตรงจากนั้นเมนูควรกำหนดเช่นนี้: * เมนู SetButton (ปุ่มใหม่ [] {MainBTN1, MainBTN2, BTN33}); */ เมนูเมนู = เมนูใหม่ (); menu.setButton (ปุ่มใหม่ [] {MainBTN1, MainBTN2, MainBTN3}); เมนูกลับ; -หมายเหตุ: เมื่อเรียกใช้รหัสด้านบนคุณต้องแทนที่ AppID และ AppSecret ด้วยบัญชีอย่างเป็นทางการของคุณเอง
การตอบสนองต่อเมนูคลิกเหตุการณ์
แพ็คเกจ org.liufeng.course.Service; นำเข้า java.util.date; นำเข้า java.util.map; นำเข้า Javax.servlet.http.httpservletRequest; นำเข้า org.liufeng.course.message.resp.textmessage; นำเข้า org.liufeng.course.util.messageutil; / ** * คลาสบริการหลัก * * @author liufeng * @date 2013-05-20 */ คลาสสาธารณะ coreservice {/ ** * คำขอกระบวนการจาก weChat * * @param Request * @return */ processRequest String สาธารณะ ลอง {// เนื้อหาข้อความที่ส่งคืนโดยสตริงเริ่มต้น respcontent = "ข้อยกเว้นการจัดการคำขอโปรดลอง!"; // XML Request Parsing Map <String, String> requestMap = MessageUtil.Parsexml (คำขอ); // บัญชีผู้ส่ง (open_id) สตริง fromusername = requestmap.get ("fromusername"); // สตริงบัญชีสาธารณะ tousername = requestmap.get ("tousername"); // ประเภทข้อความสตริง msgtype = requestmap.get ("msgtype"); // ตอบกลับข้อความ TextMessage TextMessage = new TextMessage (); TextMessage.SetTouSerName (จากชื่ออัสบันทึก); TextMessage.setFromusername (Tousername); TextMessage.setCreateTime (วันที่ใหม่ (). getTime ()); textMessage.setMsgType (MessageUtil.resp_message_type_text); TextMessage.SetFuncFlag (0); // ข้อความถ้า (msgtype.equals (messageUtil.req_message_type_text)) {respcontent = "คุณกำลังส่งข้อความ!"; } // ข้อความรูปภาพอื่นถ้า (msgtype.equals (messageUtil.req_message_type_image)) {respcontent = "คุณกำลังส่งข้อความรูปภาพ!"; } // ข้อความตำแหน่งทางภูมิศาสตร์อื่น ๆ ถ้า (msgtype.equals (messageUtil.req_message_type_location)) {respcontent = "คุณกำลังส่งข้อความที่ตั้งทางภูมิศาสตร์!"; } // ลิงก์ข้อความอื่นถ้า (msgtype.equals (MessageUtil.req_message_type_link)) {respcontent = "คุณกำลังส่งข้อความลิงก์!"; } // ข้อความเสียงอื่นถ้า (msgtype.equals (messageUtil.req_message_type_voice)) {respcontent = "คุณกำลังส่งข้อความเสียง!"; } // เหตุการณ์พุชอื่นถ้า (msgtype.equals (messageUtil.req_message_type_event)) {// ประเภทเหตุการณ์สตริง EventType = requestmap.get ("เหตุการณ์"); // สมัครสมาชิกถ้า (EventType.equals (MessageUtil.Event_Type_Subscribe)) {respcontent = "ขอบคุณสำหรับความสนใจของคุณ!"; } // ยกเลิกการสมัครอื่นถ้า (EventType.equals (MessageUtil.event_type_unsubsribe)) {// todo หลังจากยกเลิกการสมัครผู้ใช้ไม่สามารถรับข้อความที่ส่งโดยบัญชีอย่างเป็นทางการดังนั้นจึงไม่จำเป็นต้องตอบกลับ ระบุเมื่อสร้างสตริงเมนูที่กำหนดเอง EventKey = requestMap.get ("EventKey"); if (eventKey.equals ("11")) {respcontent = "รายการเมนูพยากรณ์อากาศถูกคลิก!"; } อื่นถ้า (eventkey.equals ("12")) {respcontent = "รายการเมนูการสืบค้นรถบัสถูกคลิก!"; } อื่นถ้า (eventkey.equals ("13")) {respcontent = "รายการเมนูการค้นหาอุปกรณ์ต่อพ่วงจะถูกคลิก!"; } อื่นถ้า (eventkey.equals ("14")) {respcontent = "รายการเมนูในประวัติศาสตร์ถูกคลิก!"; } อื่นถ้า (eventkey.equals ("21")) {respcontent = "รายการเมนูเพลงตามความต้องการถูกคลิก!"; } อื่นถ้า (eventkey.equals ("22")) {respcontent = "รายการเมนูเกมคลาสสิกถูกคลิก!"; } อื่นถ้า (eventkey.equals ("23")) {respcontent = "รายการเมนูวิทยุความงามถูกคลิก!"; } อื่นถ้า (eventkey.equals ("24")) {respcontent = "รายการเมนูการจดจำใบหน้าถูกคลิก!"; } อื่นถ้า (eventkey.equals ("25")) {respcontent = "รายการเมนูแชทถูกคลิก!"; } อื่นถ้า (eventkey.equals ("31")) {respcontent = "รายการเมนู Q Circle ถูกคลิก!"; } อื่นถ้า (eventkey.equals ("32")) {respcontent = "รายการเมนูการจัดอันดับภาพยนตร์ถูกคลิก!"; } อื่นถ้า (eventkey.equals ("33")) {respcontent = "รายการเมนูตลกอารมณ์ขันถูกคลิก!"; }}} textMessage.setContent (respcontent); respmessage = messageUtil.TextMessAgetOxml (textMessage); } catch (exception e) {e.printstacktrace (); } Return Respmessage; -ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น