GVKun编程网logo

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

13

本文将介绍《微信公众平台入门到精通》Vol.9的详细情况,特别是关于微信公众平台教程大全的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于DavidC

本文将介绍《微信公众平台入门到精通》Vol.9的详细情况,特别是关于微信公众平台教程大全的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于David Camp 微信公众平台开发官方内容拓展版---PHP版本 qq微信公众平台开发 微信公众平台开发员 微信公众平台开发难、Java微信公众平台开发(一)--接入微信公众平台、Java微信公众平台开发(十一)--开发中微信公众平台/开放平台/商户平台的关联、Java微信公众平台开发(1) 接入微信公众平台的知识。

本文目录一览:

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

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

logo

昨天这篇SAE的课程貌似很给力,收到一千多回复,多谢朋友们捧场,不少人在问那个菜单的教程是第几篇,是《微信公众平台入门到精通Vol.6》,所有的课程可以输入“微信教程”查看!

还有一些朋友在问开发模式是否可以群发消息或者点对点下发消息,这个是不行的,群发消息、人工回复消息还是得去公众平台,除非你开外挂模拟登陆公众平台后台操作,当然这个肯定是违规的,会被封号。

另外大家在进入开发模式前还是要提醒下,由于微信现在接口开放的还不多,图片回复、视频回复接口都没有,也就是用户回复关键字获取图片或者视频是无法做到的,如果偏运营的公众账号现在并不推荐使用开发模式。


第九章 用微信开发模式做欢迎词

今天的重点是如何将微信开发模式和SAE对接,希望朋友们已经完成了SAE注册,如果还没搞定的话请抓紧,有问题的话请及时提出,接下来的教程都在那上面进行。

在教程开始前建议朋友们可以先注册一个新的公众账号,或者用非主账号当做开发测试账号,因为开发调试过称中可能会经常出现账号无法正常回复用户的情况,影响正常使用,所以在学习期间以及后期开发过程中最好有一个测试公众账号,等开发完成了再切换到主账号上,也是非常方便的。

一、微信公众平台与SAE对接通讯

我们先回到微信公众平台上来,点击高级功能进入,选择开发模式进入开发模式的页面,使用开发模式前记得先把编辑模式关闭,如下图:
img-2

先不着急点开关,点了也没用,会提示必须先成为开发者,但第一步也不是点击“成为开发者”按钮,而是点击查看文档按钮,我们要去下载一个文件,进入开发指南页面后点击左侧菜单的“消息接口指南”,如下图:
img-3

然后在右边打开的页面导航里点击“示例代码”,如下图:
img-4

页面直接会跳到最底部,当然直接拉到页面最下也可以,可以看到示例代码下载,如图:
img-5

点击下载后会得到一个“wx_sample.php”的文件,这个就是微信接口的SDK文件,首先我们将该文件改个名字,比如“wx_interface.php”,这里强调下文件的注意事项:1、后缀必须是.php;2、名字不能用中文,尽量是全小写字母,或者字母+下划线+字母组成;3、名字要便于记忆;4、不要把名字设成“index.php”、“weixin.php”、“admin.php”这些。

让大家改名的原因是为了安全,因为这是一个和微信公众平台通讯的接口文件,原则上要隐蔽,以免被人恶意攻击。改完名字后打开SAE,进入到咱们的应用,点击编辑代码进入编辑后台,把文件上传到SAE里,如下图:
img-6
img-7

双击上传的文件,进入该文件的编辑模式,可以看到密密麻麻的一片代码,朋友们不要被吓到,咱们一步步来,首先修改第7行的通讯秘钥,如图:
img-8

那些斜杠和星号的是注释,可以看到第6行的注释英文是“define your token”,也就是说第7行的代码功能是定义微信公众平台与SAE应用通讯时约定的一个秘钥。

这里解释下define("TOKEN", "weixin")这段代码:

define是用来给常量赋值的函数,这句话的意思是赋予“TOKEN”这个常量值为“weixin”。

PS:常量和变量,是每一种编程语言中都存在的,常量值被定义后,在脚本的其他任何地方都不能被改变。一个常量的名称可以由英文字母、下划线、和数字组成,但数字不能作为首字母出现。变量被定义后随时可以重新赋值,其命名规则与常量一样,区别是变量最前面还要加“$”符号,而常量直接使用它的名称就可以了,如代码第67行,就是给变量$token赋值,值为之前定义的常量TOKEN,可以看到变量和常量的赋值方式也是不同的,变量赋值很简单不需要define函数。
img-9

扯了那么多咱们先把秘钥改了吧,这个秘钥其实有点像设置一个密码,微信公众平台对秘钥设置有要求是3位以上的字母或数字,我这里是测试所以改个“123456”,如图:
img-10

修改保存后,回到微信公众平台的开发模式,点击“成为开发者”按钮,然后会到“接口配置信息”页面,如下图:
img-11

  1. 输入各位在SAE上的应用地址+反斜杠+改名后的SDK文件,比如我这里输入的是
    http://weixincourse.sinaapp.com/wx_interface.phpX7X 要注意的是前面不要忘记加http:// ,域名就是咱们应用的域名,上传的SDK文件名要写完整,包括.php的后缀名。

  2. 这里就是填写在SDK文件里设置的秘钥,我这里填写的是“123456”,大家根据自己设置的填写。

填写完后点击提交,如果一切顺利就会提示成功并跳转页面到开发者页面,如下图:
img-12

  1. 接口配置信息。这里可以看到咱们设定的那些接口信息都清楚的显示出来,如果接口的地址或者token改变的话点击修改按钮可以重新设置。

  2. 接口权限表。打钩的就是咱们可以使用的接口权限,关于这些接口的权限介绍可以查看《微信公众平台入门到精通Vol.7》,有些朋友如果已经拿到自定义菜单内测资格的,那么自定义菜单也会有打钩。

  3. 最重要的一步就是打开开发模式的开关,现在公众账号进入开发模式了!

这个时候你会发现你的公众账号无论是关注还是输入都没有提示了,原来编辑模式下设置的东西都不管用了,因为公众账号已经对接到了你的SAE接口,SO,我们开始下一步吧,先来个欢迎词!


二、开发模式下的欢迎词

先控诉下微信开发模式的设置不合理,接口校验和接口服务用同一个文件,而校验时这个文件必须直接返回echostr参数内容,当接口要启动正式服务时又得修改同个文件……好了这些跟大家无关,抱怨一下而已!

前面接口对接成功后,公众账号无法再与用户互动了,那么我们先把订阅欢迎这个功能恢复吧,回到SAE平台上,在编辑平台新建一个文件,我们把它命名为“wx_tpl.php”,这个文件的目的是存放微信输出内容的模板,细心的朋友会发现这就是目前接口可以给用户回复的三种消息格式,分别是文本、图文、音乐。内容如图:
img-13

然后把前面的那个SDK文件内容全部清空,没错就是全部清空,因为官方那个SDK除了用来做接口校验几乎没有什么用处。然后换上自己的代码,如图:
img-14

给大家解释下这一大段代码:

第3行,include_once是用来加载其他php文件的函数,在这里加载了wx_tpl.php,加载文件是可以设置路径的,由于现在两个文件在同一目录下,因此没有加路径。这样做的好处是有利于代码复用,一些经常用到的类、函数和变量可以放在其他文件统一加载,让代码简洁轻便。

第6行,接收微信公众平台发送过来的用户消息,该消息数据结构为XML,不是php默认的识别数据类型,因此这里用了$GLOBALS[''HTTP_RAW_POST_DATA'']来接收,同时赋值给了$postStr,这里强调一个php的铁律就是php对大小写是敏感的,也就是变量也好函数也好,大小写不同是表示不同的变量或者函数,即$Q1和$q1是两个不同的变量,大家在写代码时千万注意。

第9行,一个条件语句,empty是判断变量是否为空的函数,如果是空返回0否则返回1,感叹号在这里是运算符表示非(not的意思),非0就是1,非1就是0,可能有点绕,意思就是如果$postStr不为空(接收到了数据)就继续执行下面的语句,如果为空就跳转到39行执行(这里就执行了两句代码,第一句是输出空字符串,第二句是退出)。注意:

  1. php的逻辑运算符有“&&”表示与(并且的意思),“||”标示或(或者的意思)“!”表示非(不是的意思),记住并且理解这些符号对后面写代码很有好处……
  2. 所有的编程语言都有if...else..语句,php的规则是if(条件){执行语句}else{执行语句},这里else可以没有,或者可以多重判定,if(条件1){执行语句}elseif(条件2){执行语句}else{执行语句}。判断条件用“()”包含,执行语句用“{}”包含,相邻最近的一对括号标示一段脚本,大家在编写的时候不要漏掉后面的半个括号。我在这段代码里括号标示的比较清楚,大家可以仔细参照一下。

第12行,使用simplexml_load_string() 函数将接收到的XML消息数据载入对象$postObj中。这个严谨的写法后面还得加个判断是否载入成功的条件语句,不过不写也没事。

第14行,将对象$postObj中的发送消息用户的OPENID赋值给$fromUsername变量,这里的“->”是指针,大家了解下就行了。

第16行,将对象$postObj中的公众账号的ID赋值给$toUsername变量。

第18行,将对象$postObj中的消息类型赋值给$form_MsgType变量。

第21行,判断消息是否为事件消息,现在微信公众账号的用户关注和取消订阅都是通过事件消息发送,因此咱们要欢迎用户关注首先得判断来接收的消息类型是否为事件。这里要强调的是在php里一个“=”用来赋值,“==”用来比较是否相等,大家千万注意在判断语句时如果少写一个“=”号这个判断会永远成立。

第24行,如果接收到的消息是事件消息,判断事件类型是否为订阅,在事件消息里“subscribe”表示订阅,“unsubscribe”表示取消订阅。

第29到32行,完成的是欢迎词回复的输出:

第29行是设定回复消息类型为文本;

第30行是设定回复消息的内容,其中可以使用表情符号的文本方式,换行使用“\n”,这里要注意的是字符串里如果要使用双引号或者单引号一般用中文符号,如果一定要用英文符号,要在引号前面加反斜杠比如“echo "\"";”输出的是一个双引号;

第31行,使用sprintf这个函数将格式化的数据写入到变量中去,其中“$textTpl”这个就是我们在wx_tpl.php里定义过的文本消息模板变量,后面的“$fromUsername, $toUsername, time(), $msgType, $contentStr”分别顺序替换模板里“%s”位置,也即是“$resultStr”这个变量最后实际为:

       <xml>
       <ToUserName><![CDATA[$fromUsername]]></ToUserName>
       <FromUserName><![CDATA[$toUsername,]]></FromUserName>
       <CreateTime>time()</CreateTime>
       <MsgType><![CDATA[$msgType]]></MsgType>
       <Content><![CDATA[$contentStr]]></Content>
       <FuncFlag>0</FuncFlag>
       </xml>

PS:time()是php里的时间函数,返回当前时间的 Unix 时间戳(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数。

第32行就是把回复消息输出。

第33行是退出整个程序,在php里exit可以放置在任何地方,当程序运行到这里就直接退出,否则还将继续运行,即使已经有结果输出在页面。



好了大家可以自己试着玩玩,不想敲字的朋友可以直接下载,地址是: http://weinxincourse.b0.upaiyun.com/lesson1.zip ,或者点击这里下载,下载后解压里面两个文件都有,请用记事本或者其他文本编辑器打开,复制内容到SAE上,请尽量不要使用文件上传,主要是怕大家编辑器保存文件时没存成UTF-8,会出错。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

今天正式开始微信公众平台的二次开发。网上有很多的及射入微信公众平台的教程。总的来说都差不多,当了解了接入流程解析,什么都显得理所当然。

所以我们还是先看微信给出的官网文档吧:

地址:http://mp.weixin.qq.com/wiki/8/f9a0b8382e0b77d87b3bcc1ce6fbc104.html

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

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

一、验证服务器代码编写。

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

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

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

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

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

 1 package com.gede.wechat.util;
 2 
 3 import java.security.MessageDigest;
 4 import java.security.NoSuchAlgorithmException;
 5 import java.util.Arrays;
 6 
 7 /**
 8 * @author gede
 9 * @version date:2019年5月22日 下午2:50:43
10 * @description :
11 */
12 public class SignUtil {  
13     // 与接口配置信息中的 Token 要一致   
14     private static String token = "gede";  
15     /** 
16      * 验证签名 
17      * @param signature 
18      * @param timestamp 
19      * @param nonce 
20      * @return 
21      */  
22     public static boolean checkSignature(String signature, String timestamp, String nonce) {  
23         String[] arr = new String[] { token, timestamp, nonce };  
24         // 将 token、timestamp、nonce 三个参数进行字典序排序   
25         Arrays.sort(arr);  
26         StringBuilder content = new StringBuilder();  
27         for (int i = 0; i < arr.length; i++) {  
28             content.append(arr[i]);  
29         }  
30         MessageDigest md = null;  
31         String tmpStr = null;  
32 
33         try {  
34             md = MessageDigest.getInstance("SHA-1");  
35             // 将三个参数字符串拼接成一个字符串进行 sha1 加密   
36             byte[] digest = md.digest(content.toString().getBytes());  
37             tmpStr = byteToStr(digest);  
38         } catch (NoSuchAlgorithmException e) {  
39             e.printStackTrace();  
40         }  
41 
42         content = null;  
43         // 将 sha1 加密后的字符串可与 signature 对比,标识该请求来源于微信   
44         return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;  
45     }  
46 
47     /** 
48      * 将字节数组转换为十六进制字符串 
49      * @param byteArray 
50      * @return 
51      */  
52     private static String byteToStr(byte[] byteArray) {  
53         String strDigest = "";  
54         for (int i = 0; i < byteArray.length; i++) {  
55             strDigest += byteToHexStr(byteArray[i]);  
56         }  
57         return strDigest;  
58     }  
59 
60     /** 
61      * 将字节转换为十六进制字符串 
62      * @param mByte 
63      * @return 
64      */  
65     private static String byteToHexStr(byte mByte) {  
66         char[] Digit = { ''0'', ''1'', ''2'', ''3'', ''4'', ''5'', ''6'', ''7'', ''8'', ''9'', ''A'', ''B'', ''C'', ''D'', ''E'', ''F'' };  
67         char[] tempArr = new char[2];  
68         tempArr[0] = Digit[(mByte >>> 4) & 0X0F];  
69         tempArr[1] = Digit[mByte & 0X0F];  
70         String s = new String(tempArr);  
71         return s;  
72     }  
73 }

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

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

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

二、服务器端验证。

 1、首先要将我们的内网穿透工具运行起来,然后再本地服务器上运行我们的项目。

 2.、在这里我用的是测试号,其他的大家对号入座。测试号登录网址 https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

 

 

3、当我们点击提交时,发现提交失败。原因是之前忘记配置springMVC ,在准备工作中我们只是开启了spring功能,现在我们开始配置springMVC

  在我们项目的src 下,新增appServlet.xml配置文件。开启mvc,并指明mvc扫描包,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
    <mvc:annotation-driven></mvc:annotation-driven> 
    <mvc:default-servlet-handler/>
    <context:component-scan base-package="com.gede.wechat.controller"></context:component-scan>
    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>

4、再打开我们的web.xml,添加appServlet.xml的扫描。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name>mychat</display-name>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
  </context-param>
  
  <servlet>
      <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
            classpath:appServlet.xml
            </param-value>
        </init-param>
      <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

</web-app>

5、这个时候我们再次重启本地服务器,然后提交接口配置信息就大功告成了。

 

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.9微信公众平台教程大全的分享就到这里,谢谢您的阅读,如果想了解更多关于David Camp 微信公众平台开发官方内容拓展版---PHP版本 qq微信公众平台开发 微信公众平台开发员 微信公众平台开发难、Java微信公众平台开发(一)--接入微信公众平台、Java微信公众平台开发(十一)--开发中微信公众平台/开放平台/商户平台的关联、Java微信公众平台开发(1) 接入微信公众平台的相关信息,可以在本站进行搜索。

本文标签: