微信开发接入指南

移动开发 Android
登录微信公众平台官网后,在公众平台后台管理页面 - 开发者中心页,点击“修改配置”按钮,填写服务器地址(URL)、Token和EncodingAESKey,其中URL是开发者用来接收微信消息和事件的接口URL。Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。

概述

接入微信公众平台开发,开发者需要按照如下步骤完成:

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

下面详细介绍这3个步骤。
***步:填写服务器配置

登录微信公众平台官网后,在公众平台后台管理页面 - 开发者中心页,点击“修改配置”按钮,填写服务器地址(URL)、Token和EncodingAESKey,其中URL是开发者用来接收微信消息和事件的接口URL。Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。

同时,开发者可选择消息加解密方式:明文模式、兼容模式和安全模式。模式的选择与服务器配置在提交后都会立即生效,请开发者谨慎填写及选择。加解密方式的默认状态为明文模式,选择兼容模式和安全模式需要提前配置好相关加解密代码,详情请参考消息体签名及加解密部分的文档。

 

第二步:验证服务器地址的有效性

开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带四个参数:

开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。

加密/校验流程如下:
1. 将token、timestamp、nonce三个参数进行字典序排序
2. 将三个参数字符串拼接成一个字符串进行sha1加密
3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

检验signature的PHP示例代码:

  1. private function checkSignature() 
  2.         $signature = $_GET["signature"]; 
  3.         $timestamp = $_GET["timestamp"]; 
  4.         $nonce = $_GET["nonce"];     
  5.                  
  6.     $token = TOKEN; 
  7.     $tmpArr = array($token, $timestamp, $nonce); 
  8.     sort($tmpArr, SORT_STRING); 
  9.     $tmpStr = implode( $tmpArr ); 
  10.     $tmpStr = sha1( $tmpStr ); 
  11.      
  12.     if( $tmpStr == $signature ){ 
  13.         return true
  14.     }else
  15.         return false
  16.     } 

PHP示例代码

 

  1. <?php 
  2. /** 
  3.   * wechat php test 
  4.   */ 
  5.  
  6. //define your token 
  7. define("TOKEN""weixin"); 
  8. $wechatObj = new wechatCallbackapiTest(); 
  9. $wechatObj->valid(); 
  10.  
  11. class wechatCallbackapiTest 
  12.     public function valid() 
  13.     { 
  14.         $echoStr = $_GET["echostr"]; 
  15.  
  16.         //valid signature , option 
  17.         if($this->checkSignature()){ 
  18.             echo $echoStr
  19.             exit
  20.         } 
  21.     } 
  22.  
  23.     public function responseMsg() 
  24.     { 
  25.         //get post data, May be due to the different environments 
  26.         $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; 
  27.  
  28.         //extract post data 
  29.         if (!emptyempty($postStr)){ 
  30.                 /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection, 
  31.                    the best way is to check the validity of xml by yourself */ 
  32.                 libxml_disable_entity_loader(true); 
  33.                 $postObj = simplexml_load_string($postStr'SimpleXMLElement', LIBXML_NOCDATA); 
  34.                 $fromUsername = $postObj->FromUserName; 
  35.                 $toUsername = $postObj->ToUserName; 
  36.                 $keyword = trim($postObj->Content); 
  37.                 $time = time(); 
  38.                 $textTpl = "<xml> 
  39.                             <ToUserName><![CDATA[%s]]></ToUserName> 
  40.                             <FromUserName><![CDATA[%s]]></FromUserName> 
  41.                             <CreateTime>%s</CreateTime> 
  42.                             <MsgType><![CDATA[%s]]></MsgType> 
  43.                             <Content><![CDATA[%s]]></Content> 
  44.                             <FuncFlag>0</FuncFlag> 
  45.                             </xml>";              
  46.                 if(!emptyempty$keyword )) 
  47.                 { 
  48.                     $msgType = "text"
  49.                     $contentStr = "Welcome to wechat world!"
  50.                     $resultStr = sprintf($textTpl$fromUsername$toUsername$time$msgType$contentStr); 
  51.                     echo $resultStr
  52.                 }else
  53.                     echo "Input something..."
  54.                 } 
  55.  
  56.         }else { 
  57.             echo ""
  58.             exit
  59.         } 
  60.     } 
  61.          
  62.     private function checkSignature() 
  63.     { 
  64.         // you must define TOKEN by yourself 
  65.         if (!defined("TOKEN")) { 
  66.             throw new Exception('TOKEN is not defined!'); 
  67.         } 
  68.          
  69.         $signature = $_GET["signature"]; 
  70.         $timestamp = $_GET["timestamp"]; 
  71.         $nonce = $_GET["nonce"]; 
  72.                  
  73.         $token = TOKEN; 
  74.         $tmpArr = array($token$timestamp$nonce); 
  75.         // use SORT_STRING rule 
  76.         sort($tmpArr, SORT_STRING); 
  77.         $tmpStr = implode( $tmpArr ); 
  78.         $tmpStr = sha1( $tmpStr ); 
  79.          
  80.         if$tmpStr == $signature ){ 
  81.             return true; 
  82.         }else
  83.             return false; 
  84.         } 
  85.     } 
  86.  
  87. ?> 

第三步:依据接口文档实现业务逻辑

验证URL有效性成功后即接入生效,成为开发者。如果公众号类型为服务号(订阅号只能使用普通消息接口),可以在公众平台网站中申请认证,认证成功的服务号将获得众多接口权限,以满足开发者需求。

此后用户每次向公众号发送消息、或者产生自定义菜单点击事件时,开发者填写的服务器配置URL将得到微信服务器推送过来的消息和事件,然后开发者可以依据自身业务逻辑进行响应,例如回复消息等。

公众号调用各接口时,一般会获得正确的结果,具体结果可见对应接口的说明。返回错误时,可根据返回码来查询错误原因。全局返回码说明

用户向公众号发送消息时,公众号方收到的消息发送者是一个OpenID,是使用用户微信号加密后的结果,每个用户对每个公众号有一个***的OpenID。

此外,由于开发者经常有需在多个平台(移动应用、网站、公众帐号)之间共通用户帐号,统一帐号体系的需求,微信开放平台(open.weixin.qq.com)提供了UnionID机制。开发者可通过OpenID来获取用户基本信息,而如果开发者拥有多个应用(移动应用、网站应用和公众帐号,公众帐号只有在被绑定到微信开放平台帐号下后,才会获取UnionID),可通过获取用户基本信息中的UnionID来区分用户的***性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号,用户的UnionID是***的。换句话说,同一用户,对同一个微信开放平台帐号下的不同应用,UnionID是相同的。详情请在微信开放平台的资源中心-移动应用开发-微信登录-授权关系接口调用指引-获取用户个人信息(UnionID机制)中查看。

另请注意,微信公众号接口只支持80接口。

责任编辑:chenqingxiang
相关推荐

2016-11-04 10:31:49

微信程序指南

2022-01-11 21:06:45

微信企业微信移动应用

2019-06-21 10:40:25

微信小程序前端

2017-06-27 10:53:32

2013-10-10 14:15:22

微信开发

2013-03-29 13:10:06

微信公众平台企业微信微信

2013-08-08 10:13:25

微信

2015-02-11 14:53:58

微信SDK

2013-04-12 03:15:34

微信开放平台Android

2013-04-12 02:54:04

微信开放平台iOS

2016-11-04 09:55:16

微信小程序

2013-05-22 10:58:09

微信公众账号微信

2016-09-27 16:38:24

JavaScript微信Web

2016-11-04 10:49:48

微信小程序

2017-03-29 18:27:41

互联网

2016-09-28 18:10:59

微信程序MINA

2013-03-21 09:54:51

微信开发者案例

2013-04-15 16:56:48

微信公众平台Android开发

2013-04-10 18:45:52

微信公众平台接口开发

2016-09-27 20:36:23

微信HttpWeb
点赞
收藏

51CTO技术栈公众号