GVKun编程网logo

《微信公众平台入门到精通》Vol.18(微信公众平台教程大全)

10

对于想了解《微信公众平台入门到精通》Vol.18的读者,本文将提供新的信息,我们将详细介绍微信公众平台教程大全,并且为您提供关于DavidCamp微信公众平台开发官方内容拓展版---PHP版本qq微信

对于想了解《微信公众平台入门到精通》Vol.18的读者,本文将提供新的信息,我们将详细介绍微信公众平台教程大全,并且为您提供关于David Camp 微信公众平台开发官方内容拓展版---PHP版本 qq微信公众平台开发 微信公众平台开发员 微信公众平台开发难、Java微信公众平台开发(一)--接入微信公众平台、Java微信公众平台开发(十一)--开发中微信公众平台/开放平台/商户平台的关联、Java微信公众平台开发(1) 接入微信公众平台的有价值信息。

本文目录一览:

《微信公众平台入门到精通》Vol.18(微信公众平台教程大全)

《微信公众平台入门到精通》Vol.18(微信公众平台教程大全)

logo

昨天在ZTalk的技术群里有人在询问如何通过微信来做问答系统,他有1000道题目,想每次随机抽取10道题目让用户来回答,题目格式如图:
img-2

这个图是那位朋友的,从题目上来看,嘻嘻应该是运营商滴干活。关于答题系统之前有朋友提过,我一直没时间搞,其实做这个是非常简单的,趁这次机会干脆做下把源码提供给大家。

源码请在公众号里输入“微信代码”查看下载连接,然后将下载链接自己想办法搞到PC上然后再下载……建议先下载安装了再看文章,以下是注意事项:

1、与微信接口文件为wx_interface.php,大家可以将里面源代码复制粘贴到自己的接口文件里覆盖掉。

2、其他的文件全部上传到SAE的代码编辑里,有同名文件可以先删除原来文件再上传。

3、文件说明:

base-class.php  自定义函数,无需改动
wx_tpl.php 回复消息的模板,无需改动
question_manager.php 题库管理,无需改动
question_add.php  添加题目,无需改动
wx_interface.php 微信接口文件,根据自己实际修改名称

数据库创建方法请查看《微信公众平台入门到精通》Vol.15,创建代码在 数据库.txt 里。数据库分两张表,一张是问题表,一张是答题情况表,问题库的结构我就参照上图来了,答题情况表结构为序号、答题时间、回答的题目序号、答题消耗时间、答题错误次数。

一、题库建立

做问答系统首先是创建一个题库,一般的题目会有单选题、多选题和问答题,鉴于手机用户使用方便考虑,建议使用单选题。

添加题目的文件为 question_add.php,大致的代码结构跟上次的通讯录后台一样,唯一多的是一个题目选项,题目选项我是用textarea这个控件,这是一个支持多行输入的输入框,并且可以直接存放到数据库,并且方便的按原来样子输出显示。
img-3

后台的效果如下图所示:
img-4
img-5

二、从题库随机提取不重复的N个问题

所有做问答系统的朋友都会问这个问题,如何从题库中随机的提取N个不重复的,今天在教程里就有这段代码。
img-6

其实Mysql本身是有自己的获取随机记录的函数,但是那个效率太低,如果数据库里记录超过几万,就会非常慢。

三、用户答题流程

用户答题整个程序都在wx_interface.php里,我在这里简单的介绍一下。

img-7

为了方便随时修改每次让用户回答的题目数,在第17行设了一个抽取题目数,修改这个数字就可以控制用户回答题目的数量。
img-8
img-9

一个友好的关注欢迎引导词是必不可少的,如何设置欢迎词请查阅第9期教程。用户输入“GO”后就进入了答题环节。

首先是从题库中提取N个不重复的随机题目,获取的题目是数组形式,我们将这些题目用serialize序列化后保存到缓存里(命名为:微信用户OPENID_question_data),接下来用户答题就是从这个缓存里获取。

设定答题的当前序号为setp_1并保存到缓存,用户互动时就通过判断这个缓存是否有值决定是否是答题状态。

设定开始的时间和初始化错误次数并保存到缓存,用来记录用户的一些答题数据。
img-10

由于答题是一个循环的过程,因此我们在用户输入go的时候只是把相关数据初始化放入缓存并不输出问题,而是单独写一个每次答题都会用到的循环过程来做答题,这个循环过程包括:

1、从缓存中取出数据
img-11

2、判断当前是否在答题状态,即question_order这个缓存是否有值,同时提取当前是第几题赋值给$now_order。
img-12

3、如果当前不是第一题,则表示这个时候用户发送的回复消息应该是答案,那么检查答案是否正确,如果不正确提示错误并退出程序让用户继续回答当前题目。
img-13
img-14

4、判断当前是否是最后一题,如果是则保存用户答题数据,清空所有缓存,提示用户答题完成信息。
img-15
img-16

5、当前问题回答正确且没有到最后一题的,系统提取下一个题目输出,同时增加答题序号的步长。
img-17
img-18

6、一些附加功能,比如输入best查询自己的最好成绩,输入history查询自己最近10次答题记录。
img-19
img-20



如果想做互动的话还可以让做个查看比你快的用户有多少等等,自由发挥吧。

基本上整个程序介绍就到这里,想试玩的可以搜索微信号“weixincourse”。另外关于批量输入题目这个问题其实好解决,可以用phpexcel这个类程序直接读取XLS表格,具体百度一下吧,哈哈哈!

David Camp 微信公众平台开发官方内容拓展版---PHP版本 qq微信公众平台开发 微信公众平台开发员 微信公众平台开发难

David Camp 微信公众平台开发官方内容拓展版---PHP版本 qq微信公众平台开发 微信公众平台开发员 微信公众平台开发难

微信公众平台开发(一) 配置接口

微信公众平台开发(二) 微信公众平台示例代码分析

微信公众平台开发(三) 订阅事件(subscribe)处理

微信公众平台开发(四) 简单回复功能开发

微信公众平台开发(五) 天气预报功能开发

立即学习“PHP免费学习笔记(深入)”;

微信公众平台开发(六) 翻译功能开发

微信公众平台开发(七) 聊天机器人功能开发

微信公众平台开发(八) 自定义菜单功能开发

微信公众平台开发(九) 数据库操作

微信公众平台开发(十) 消息回复总结

微信公众平台开发(十一) 功能整合

微信公众平台开发(十二) 发送客服消息

以上就介绍了David Camp 微信公众平台开发官方内容拓展版---PHP版本,包括了微信公众平台开发方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

Java微信公众平台开发(一)--接入微信公众平台

Java微信公众平台开发(一)--接入微信公众平台

转自:http://www.cuiyongzhi.com/post/38.html

(一)接入流程解析

在我们的开发过程中无论如何最好的参考工具当然是我们的官方文档了:http://mp.weixin.qq.com/wiki/8/f9a0b8382e0b77d87b3bcc1ce6fbc104.html

通过文档我们可以看出其中接入微信公众平台开发,开发者需要按照如下步骤完成:

 

  • 填写服务器配置

  • 验证服务器地址的有效性

  • 依据接口文档实现业务逻辑

按照上面的逻辑可能是填写服务器配置信息是在第一步,但是我们在真实的开发过程中往往都是先做第二步【编写代码实现验证服务器地址的有效性】,因为没有第二步的完成第一步的配置是不能达到任何效果的!

(二)验证服务器有效性代码编写

按照开发文档我们知道我们的应用服务器需要接受微信服务器的get请求,其中包含四个参数(signature、timestamp、nonce、echostr)然后通过校验方式校验服务器的可靠性,校验方式如下:

  • 将token、timestamp、nonce三个参数进行字典序排序

  • 将三个参数字符串拼接成一个字符串进行sha1加密

  • 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

①我在这里写了一个工具类去实现其中的前两步,将三个参数排序并返回sha1加密后的字符串,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package  com.cuiyongzhi.wechat.util;
 
import  java.security.MessageDigest;  
import  java.security.NoSuchAlgorithmException;  
import  java.util.Arrays;  
   
/**
  * ClassName: SignUtil
  * @Description: 请求校验工具类 
  * @author dapengniao
  * @date 2016年3月4日 下午6:25:41
  */
public  class  SignUtil {  
     // 与接口配置信息中的Token要一致   
     private  static  String token =  "dapengniaowechat" ;  
     /** 
      * 验证签名 
      * @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);  
         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;  
     }  
}

②将我们的工具类应用到我们的服务器验证过程中,这里我新建一个controller为WechatSecurity,实现同一个get用于接收参数和返回验证参数,简单代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package  com.cuiyongzhi.wechat.controller;
 
import  java.io.PrintWriter;
 
import  javax.servlet.http.HttpServletRequest;
import  javax.servlet.http.HttpServletResponse;
 
import  org.apache.log4j.Logger;
import  org.springframework.stereotype.Controller;
import  org.springframework.web.bind.annotation.RequestMapping;
import  org.springframework.web.bind.annotation.RequestMethod;
import  org.springframework.web.bind.annotation.RequestParam;
 
import  com.cuiyongzhi.wechat.util.SignUtil;
 
@Controller
@RequestMapping ( "/wechat" )
public  class  WechatSecurity {
     private  static  Logger logger = Logger.getLogger(WechatSecurity. class );
 
     /**
     
      * @Description: 用于接收get参数,返回验证参数
      * @param @param request
      * @param @param response
      * @param @param signature
      * @param @param timestamp
      * @param @param nonce
      * @param @param echostr
      * @author dapengniao
      * @date 2016年3月4日 下午6:20:00
      */
     @RequestMapping (value =  "security" , method = RequestMethod.GET)
     public  void  doGet(
             HttpServletRequest request,
             HttpServletResponse response,
             @RequestParam (value =  "signature" , required =  true ) String signature,
             @RequestParam (value =  "timestamp" , required =  true ) String timestamp,
             @RequestParam (value =  "nonce" , required =  true ) String nonce,
             @RequestParam (value =  "echostr" , required =  true ) String echostr) {
         try  {
             if  (SignUtil.checkSignature(signature, timestamp, nonce)) {
                 PrintWriter out = response.getWriter();
                 out.print(echostr);
                 out.close();
             else  {
                 logger.info( "这里存在非法请求!" );
             }
         catch  (Exception e) {
             logger.error(e, e);
         }
     }
 
     @RequestMapping (value =  "security" , method = RequestMethod.POST)
     // post方法用于接收微信服务端消息
     public  void  DoPost() {
         System.out.println( "这是post方法!" );
     }
}

那么到这里我们的服务器验证的代码就基本完成了,下面我们就进入验证过程!

(三)服务器验证

这里我用来验证的是我的个人公众号【崔用志】,如果大家有兴趣可以搜索看到的,通过微博认证的一个私人号,当然有想法在这里我们也是可以一起交流的,验证方法如下图:

2.png点击【提交】成功之后如下图所示:

3.png

点击图中【启用】即可,那么到这里我们的服务器接入配置就完成了,【下一篇我们将讲述如何接收消息并进行消息处理】,感谢你的翻阅,如有疑问可以留言讨论!

Java微信公众平台开发(十一)--开发中微信公众平台/开放平台/商户平台的关联

Java微信公众平台开发(十一)--开发中微信公众平台/开放平台/商户平台的关联

转自:http://www.cuiyongzhi.com/post/55.html

微信公众平台(map.weixin.qq.com)/开放平台(open.weixin.qq.com)/商户平台(pay.weixin.qq.com)这三个平台不知道大家有没有完全解除到,有人可能因为接触到其中的一个或者两个对其他的有些陌生或者说都不知道他们分别是干什么的,不要紧,那么这篇文章就带领你认知他们,不论你是一个微信开发者还是一个微信运营者,我相信你都会有足够的理由去认知和了解其中的一个或两个!

(一)微信公众平台(map.weixin.qq.com)

2.png

官方介绍: 微信公众平台,给个人、企业和组织提供业务服务与用户管理能力的全新服务平台。

这个平台是针对普通用户(个人)、企业、组织提供服务的,是运营和开发者的领地!这里说白了就是订阅号、服务号、企业号给我们提供的服务,而微信公众平台也是提供登录、管理和操作处理这三类账号的平台,从注册到最后的登陆、文章发布、用户管理等操作都可以在这里处理,后面简称mp平台!

(二)微信开放平台(open.weixin.qq.com)

3.png

官方介绍:开发平台是为微信用户提供服务的平台,而公众平台开发接口则是提供服务的基础,开发者在公众平台网站中创建公众号、获取接口权限后,可以通过阅读本接口文档来帮助开发!

这里主要是开发者的领地!我们可以从官方的介绍中可以发现这个平台主要是为了开发者服务的,其中涉及移动应用、网站应用、公众号开发、公众号第三方平台等有关微信登录、支付以及相关开发文档都可以在这里找到,简直就是微信和其他第三方应用接入的接口大全,后面简称open平台!

(三)微信商户平台(pay.weixin.qq.com)

4.png

官方介绍:微信支付是腾讯公司的支付业务品牌,微信支付提供公众号支付、APP支付、扫码支付、刷卡支付等支付方式。微信支付结合微信公众账号,全面打通O2O生活消费领域,提供专业的互联网+行业解决方案,微信支付支持微信红包和微信理财通,是移动支付的首选。

在这个商户平台不仅提供开发者有关的开发文档,而且提供流水记录和红包等相关的运营策略,所以这里是开发者,运营者,财务的领地!所有使用微信支付,不论是扫码支付,app支付等所有的流水订单都可以在这里找到足迹,为我们的每一笔订单提供对账凭证和查询记录,后面简称pay平台!

(四)mp平台、open平台、pay平台直接的关联

在我之前讲述的一些开发过程中我们一直用到一个唯一标识Openid,不知道有没有细心看文档的朋友,会发现在我们的微信开发文档中也有提及到一个唯一标识 UnionID,那么我们一直在用的Openid是不是用错了呢?答案当然是没错,这里容我们来详细讲述下Openid和UnionID之间的关系;

openid的唯一标识是说在我们的微信公众平台下,一个个人微信对一个微信公众平台帐号(这里可以是订阅号、服务号、企业号)的微信标识,但是我们的open平台有个功能是一个开发者账号可以绑定最多10个微信公众平台账号、多个网站应用、多个移动应用,这个时候如何在一个微信开发者账号中识别10个map平台下用户的唯一性呢?这个时候UnionId就出现了,所以他的意义是可想而知的,如果在企业中既存在mp平台账号又存在web应用和移动应用的时候我们为了方便用户的管理和去用户冗余性,在整体的设计中我相信大家都会采用UnionId来做微信登录的唯一标识的;但是回过头来说我们说openid是唯一标识也是没有错的,因为前面的我们的讲解都是针对单个公众平台账号来说的!

商户平台和用户以及mp平台之间的关系又是如何呢?从简单原则上来说mp平台和pay平台之间是一一对应的关系的,但是也存在微信开发者拥有微信支付开发权限存在微信商户子账号的存在,但是无论如何pay平台和用户之间的支付关系都是唯一的都是用过openid来产生的,不论是红包支付还是企业支付其依赖关系都是openid;下面我用我的“简笔画”向大家展示用户、mp平台、open平台、pay平台之间的关系:

mp、oepn、pay.png

 

Java微信公众平台开发(1) 接入微信公众平台

Java微信公众平台开发(1) 接入微信公众平台

前面几篇文章一直都在说微信公众平台的开发准备工作,那么从这篇开始我们就将正式的进入JAVA微信公众平台开发的整个流程,那么这篇我们开始聊聊如何将我们的服务端和微信公众平台对接!

(一)接入流程解析

在我们的开发过程中无论如何最好的参考工具当然是我们的官方文档了:http://mp.weixin.qq.com/wiki/8/f9a0b8382e0b77d87b3bcc1ce6fbc104.html

通过上面我们可以看出其中接入微信公众平台开发,开发者需要按照如下步骤完成:

  • 填写服务器配置
  • 验证服务器地址的有效性
  • 依据接口文档实现业务逻辑

按照上面的逻辑可能是填写服务器配置信息是在第一步,但是我们在真实的开发过程中往往都是先做第二步【编写代码实现验证服务器地址的有效性】,因为没有第二步的完成第一步的配置是不能达到任何效果的!

(二)验证服务器有效性代码编写

按照开发文档我们知道我们的应用服务器需要接受微信服务器的get请求,其中包含四个参数(signature、timestamp、nonce、echostr)然后通过校验方式校验服务器的可靠性,校验方式如下:

  • 将token、timestamp、nonce三个参数进行字典序排序
  • 将三个参数字符串拼接成一个字符串进行sha1加密
  • 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

①我在这里写了一个工具类去实现其中的前两步,将三个参数排序并返回sha1加密后的字符串,代码如下:

package com.cuiyongzhi.wechat.util;
 
import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 
import java.util.Arrays; 
 
/**
 * ClassName: SignUtil
 * @Description: 请求校验工具类 
 * @author dapengniao
 * @date 2016年3月4日 下午6:25:41
 */
public class SignUtil { 
 // 与接口配置信息中的Token要一致 
 private static String token = "dapengniaowechat"; 
 /** 
 * 验证签名 
 * @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); 
 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; 
 } 
}

②将我们的工具类应用到我们的服务器验证过程中,这里我新建一个controller为WechatSecurity,实现同一个get用于接收参数和返回验证参数,简单代码如下:

package com.cuiyongzhi.wechat.controller;
 
import java.io.PrintWriter;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
 
import com.cuiyongzhi.wechat.util.SignUtil;
 
@Controller
@RequestMapping("/wechat")
public class WechatSecurity {
 private static Logger logger = Logger.getLogger(WechatSecurity.class);
 
 /**
 * 
 * @Description: 用于接收get参数,返回验证参数
 * @param @param request
 * @param @param response
 * @param @param signature
 * @param @param timestamp
 * @param @param nonce
 * @param @param echostr
 * @author dapengniao
 * @date 2016年3月4日 下午6:20:00
 */
 @RequestMapping(value = "security",method = RequestMethod.GET)
 public void doGet(
 HttpServletRequest request,HttpServletResponse response,@RequestParam(value = "signature",required = true) String signature,@RequestParam(value = "timestamp",required = true) String timestamp,@RequestParam(value = "nonce",required = true) String nonce,@RequestParam(value = "echostr",required = true) String echostr) {
 try {
 if (SignUtil.checkSignature(signature,nonce)) {
 PrintWriter out = response.getWriter();
 out.print(echostr);
 out.close();
 } else {
 logger.info("这里存在非法请求!");
 }
 } catch (Exception e) {
 logger.error(e,e);
 }
 }
 
 @RequestMapping(value = "security",method = RequestMethod.POST)
 // post方法用于接收微信服务端消息
 public void DoPost() {
 System.out.println("这是post方法!");
 }
}

那么到这里我们的服务器验证的代码就基本完成了,下面我们就进入验证过程!

(三)服务器验证

这里我用来验证的是我的个人公众号【崔用志】,如果大家有兴趣可以搜索看到的,通过微博认证的一个私人号,当然有想法在这里我们也是可以一起交流的,验证方法如下图:

点击【提交】成功之后如下图所示:

3.png

点击图中【启用】即可,那么到这里我们的服务器接入配置就完成了,【下一篇我们将讲述如何接收消息并进行消息处理】,感谢你的翻阅,如有疑问可以留言讨论!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

我们今天的关于《微信公众平台入门到精通》Vol.18微信公众平台教程大全的分享就到这里,谢谢您的阅读,如果想了解更多关于David Camp 微信公众平台开发官方内容拓展版---PHP版本 qq微信公众平台开发 微信公众平台开发员 微信公众平台开发难、Java微信公众平台开发(一)--接入微信公众平台、Java微信公众平台开发(十一)--开发中微信公众平台/开放平台/商户平台的关联、Java微信公众平台开发(1) 接入微信公众平台的相关信息,可以在本站进行搜索。

本文标签: