<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>共享博客</title><link>https://www.sharedbk.com/web/</link><description>专注前端行业精选-分享最具有价值的内容</description><item><title>微信三级分销系统产品详情页怎么开发?</title><link>https://www.sharedbk.com/web/post/41495.html</link><description>&lt;p&gt;微信三级分销系统其实就是微信商城，只是销售模式以三级分销模式为主。针对产品详情页，微信三级分销系统开发要注意哪些方面的内容呢?&lt;/p&gt;&lt;p&gt;微信三级分销系统开发&lt;/p&gt;&lt;p&gt;1、微信三级分销商城系统产品详情页必要部分&lt;/p&gt;&lt;p&gt;1)微信三级分销商城促销说明(热销产品、搭配产品、促销产品、优惠方式)&lt;/p&gt;&lt;p&gt;促销信息要设计的非常明显，促销信息的放大，颜色的突出，价格的诱惑，点击按钮的呈现，绝对经典的促销形式呈现，也是最能吸引消费者眼球，因此促销手段也是最为重要的。&lt;/p&gt;&lt;p&gt;2)吸引购买(卖点打动、情感打动、买家评价、热销盛况)&lt;/p&gt;&lt;p&gt;根据数据分析发现，消费者对品牌的认知率很重要的部分在于头图，而头图就是整个详情页的品牌形象图是至关重要的，占主要地位。因此品牌形象图一定要给消费者有深刻的印象。&lt;/p&gt;&lt;p&gt;对于品牌形象图，应该包含品牌产品、产品名称、产品卖点。结合产品卖点制作品牌形象海报图，加入切合产品功能性的背景，以情感互动的形势才能更能打动消费者。&lt;/p&gt;&lt;p&gt;3)商品展示(色彩、细节、优点、卖点、包装、搭配、效果)&lt;/p&gt;&lt;p&gt;根据产品卖点结合素材图进行图文结合设计，当然也是时刻注意着文字使用规范，大小标题的统一，重要卖点的突出的字体使用规范，才能使整体卖点的统一与连贯性。产品形象图的展示，也是最能体现品牌的特性。&lt;/p&gt;&lt;p&gt;4)交易说明(购买、付款、收获、验货、退换货、保修)&lt;/p&gt;&lt;p&gt;微信三级分销系统开发的交易流程主要是包括购买、付款、收获、验货、退换货、保修等细节，只有把这些设计好才能更加吸引消费者。&lt;/p&gt;&lt;p&gt;另外，所有微信三级分销商城系统类目的产品详情页是不是都应该用统一这样的排序呢?当然不是，不同的商品千差万别，不同类目、品牌都有其不同的特征，应当按照品牌的特征作为定位，制定详情页的逻辑方向，根据卖点详细说明。所以在微信三级分销系统开发过程中还需因地、因时制宜，不能鲁莽行事。&lt;/p&gt;&lt;p&gt;2、微信三级分销系统要开发高销量产品详情页&lt;/p&gt;&lt;p&gt;除了开发基本要求之外，还要在众多产品详情页中打造出高销量的产品详情页，打造权重流量突破点才行。那么可以从以下几个方面入手：&lt;/p&gt;&lt;p&gt;1)做到关联销售&lt;/p&gt;&lt;p&gt;关联销售最大的作用不仅仅是分流，还可以增加微信三级分销系统的产品客单价，让消费者买了这个还想买那个。就算是不能提高客单价，也能提高微信分销商城转化率。&lt;/p&gt;&lt;p&gt;2)把好的写在最前面&lt;/p&gt;&lt;p&gt;前三屏是非常重要的，也是抓住消费者最核心的位置。可以在这三屏下功夫将你的优势都体现出来，比如送运费险、顺丰包邮、终身换新、无忧售后、无理由退换、满减满送等等，让消费者觉得你有最好的服务又划算，让消费者更有欲望去看你的产品。&lt;/p&gt;&lt;p&gt;3)产品的优势(卖点)&lt;/p&gt;&lt;p&gt;这里所需要表达的非常简单，就是你产品的卖点特点，总之就是别人没有的我有，别人有的我比他更好!这里要保持画面的整洁，不要添加没必要的特效之类的，让消费者浏览时更容易看懂。&lt;/p&gt;&lt;p&gt;微信三级分销系统开发产品详情页除了注意常规页面之外，可以打造流量销量产品详情页，主次分明，彻底抓住客户需求。想卖货，微信三级分销系统营销方式也很重要，营销是销售的基础也是拔高点，从而销量只会只增不减。&lt;/p&gt;</description><pubDate>Thu, 13 Mar 2025 12:32:10 +0800</pubDate></item><item><title>微信公众号-获取用户信息（网页授权获取）实现步骤</title><link>https://www.sharedbk.com/web/post/41494.html</link><description>&lt;p&gt;根据微信公众号开发官方文档：&lt;br&gt;&lt;/p&gt;&lt;p&gt;获取用户信息步骤如下：&lt;/p&gt;&lt;p&gt;1 第一步：用户同意授权，获取code&lt;br&gt;2 第二步：通过code换取网页授权access_token&lt;br&gt;3 第三步：刷新access_token（如果需要）&lt;br&gt;4 第四步：拉取用户信息(需scope为 snsapi_userinfo)&lt;/p&gt;&lt;p&gt;1 获取code&lt;/p&gt;&lt;p&gt;在确保微信公众账号拥有授权作用域（scope参数）的权限的前提下（服务号获得高级接口后，默认拥有scope参数中的snsapi_base和snsapi_userinfo），引导关注者打开如下页面：&lt;br&gt;&lt;/p&gt;&lt;p&gt;https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&amp;amp;redirect_uri=REDIRECT_URI&amp;amp;response_type=code&amp;amp;scope=SCOPE&amp;amp;state=STATE#wechat_redirect&lt;br&gt;&lt;/p&gt;&lt;p&gt;若提示“该链接无法访问”，请检查参数是否填写错误，是否拥有scope参数对应的授权作用域权限。&lt;br&gt;&lt;/p&gt;&lt;p&gt;尤其注意：由于授权操作安全等级较高，所以在发起授权请求时，微信会对授权链接做正则强匹配校验，如果链接的参数顺序不对，授权页面将无法正常访问&lt;/p&gt;&lt;p&gt;其中：&lt;br&gt;&lt;/p&gt;&lt;p&gt;AppID - 公众号的唯一标识&lt;br&gt;REDIRECT_URI - 跳转url&lt;br&gt;SCOPE - 值为snsapi_base（不弹出授权页面，直接跳转，只能获取用户openid） 或snsapi_userinfo （弹 出授权页面，可通过openid拿到昵称、性别、所在地。并且，即使在未关注的情况下，只要用户授权，也能获取其信息）&lt;br&gt;STATE - 开发者可以自定义填写a-zA-Z0-9的参数值&lt;/p&gt;&lt;p&gt;2 通过code换取网页授权access_token&lt;/p&gt;&lt;p&gt;如果用户同意授权，页面将跳转至 redirect_uri/?code=CODE&amp;amp;state=STATE。&lt;br&gt;state就是上面的STATE参数原样传过来的&lt;br&gt;&lt;/p&gt;&lt;p&gt;实现代码：&lt;span&gt;   &lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;pre&gt;&amp;lt;code&amp;gt;$code = I('get.code');if (empty($code)) {   //todo 非微信访问   exit('&amp;lt;/code&amp;gt;'); }else{ //授权后操作 }&lt;/pre&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;    &lt;span&gt;在这里我们就可以得到code用作后续的获取access_token。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;获取code后，请求以下链接获取access_token：&lt;/p&gt;&lt;p&gt; https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&amp;amp;secret=SECRET&amp;amp;code=CODE&amp;amp;grant_type=authorization_code&lt;/p&gt;&lt;p&gt;appid - 公众号的唯一标识&lt;br&gt;secret - 密钥&lt;br&gt;code - 上述所返回的code&lt;br&gt;grant_type - 值为authorization_code&lt;/p&gt;&lt;p&gt;实现代码：&lt;/p&gt;&lt;div&gt;&lt;pre&gt;&amp;lt;code&amp;gt;$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&amp;amp;amp;appid=' . C('wechat.AppID') . '&amp;amp;amp;secret=' . C('wechat.AppSecret');$str = file_get_contents($url);$str = json_decode($str, true);$access_token = $str['access_token'];&amp;lt;/code&amp;gt;&lt;/pre&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这里access_token可以做缓存处理，避免造成频繁获取&lt;br&gt;实现代码，以TP框架为例：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;pre&gt;&amp;lt;code&amp;gt;$access_token = S('access_token');if (empty($access_token)) {  $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&amp;amp;amp;appid=' . C('wechat.AppID') . '&amp;amp;amp;secret=' . C('wechat.AppSecret');  $str = file_get_contents($url);  $str = json_decode($str, true);  $access_token = $str['access_token'];  S('access_token', $access_token, 3600);}&amp;lt;/code&amp;gt;&lt;/pre&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;在获取access_token后，也会一并返回openid（用户唯一标识），微信官方文档的解释是：用户唯一标识，请注意，在未关注公众号时，用户访问公众号的网页，也会产生一个用户和公众号唯一的OpenID&lt;br&gt;&lt;/p&gt;&lt;p&gt;openid是唯一标识微信用户的，如果用户不是第一次登陆，可以在得到openid后查询数据库是否有绑定此openid的用户，之后就无需重新获取用户数据，直接获取的数据库user_id设置session，直接登陆访问&lt;/p&gt;&lt;p&gt;3 第三步忽略，只在需要的时间重新获取access_token而已&lt;/p&gt;&lt;p&gt;4 拉取用户信息(需scope为 snsapi_userinfo)&lt;/p&gt;&lt;p&gt;在数据库无此微信号用户的绑定下，就相当于用户首次访问登陆，则通过第四步来获取用户信息（在用户授权情况下，网页授权作用域为snsapi_userinfo，则此时开发者可以通过access_token和openid拉取用户信息了），然后后台创建user并绑定此微&lt;/p&gt;&lt;p&gt;信用户（通过openid）&lt;br&gt;&lt;/p&gt;&lt;p&gt;请求方法&lt;br&gt;&lt;/p&gt;&lt;p&gt;http：GET（请使用https协议） https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&amp;amp;openid=OPENID&amp;amp;lang=zh_CN&lt;/p&gt;&lt;p&gt;access_token - 上述所获取的access_token&lt;br&gt;openid - 公众号唯一标识&lt;br&gt;&lt;/p&gt;&lt;p&gt;实现代码：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;pre&gt;&amp;lt;code&amp;gt;$access_token = S('access_token');if (empty($access_token)) {  $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&amp;amp;amp;appid=' . C('wechat.AppID') . '&amp;amp;amp;secret=' . C('wechat.AppSecret');  $str = file_get_contents($url);  $str = json_decode($str, true);  $access_token = $str['access_token'];  S('access_token', $access_token, 3600);}&amp;lt;/code&amp;gt;&lt;/pre&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;</description><pubDate>Thu, 13 Mar 2025 12:25:45 +0800</pubDate></item><item><title>php微信公众号开发（2）百度BAE搭建和数据库使用</title><link>https://www.sharedbk.com/web/post/41493.html</link><description>&lt;p&gt;微信越来越火，今天开始学习微信公众号开发，在开发之前，假如你已经了解php知识和html/css等技术。&lt;br&gt;&lt;br&gt;1.申请微信公众号：地址https://mp.weixin.qq.com/&lt;br&gt;&lt;br&gt;注册前需要手拿身份证照片半身像，保证身份证信息看清楚，我用iphone 4s拍的可以使用，千万不要美化照片，原装即可，又不是相亲。&lt;br&gt;&lt;br&gt;填写相关信息，真实即可，在7个工作日审核是否通过，一般两三天就知道结果，如果不通过，重新提交即可，你只有一共4次机会，要注意。&lt;br&gt;&lt;br&gt;一个人可以申请两个公众号，因为手机号和身份证都只能登记2次。&lt;br&gt;&lt;br&gt;注册要使用邮箱email，所以提前申请，邮箱是用来验证的，也是登陆号码。&lt;br&gt;&lt;br&gt;个人用户只能申请订阅号，政府，企业，媒体可以申请服务号，两种开发基本一样，不过服务好更多功能，我们只能选择订阅号。&lt;br&gt;&lt;br&gt;申请通过后，登录，先给你的账号上传一张头像，注意要和你的账号主题一样。以及可以绑定微博等等。&lt;br&gt;&lt;br&gt;2申请百度bae，类似新浪sae，两个操作差不多，这里用bae作为例子。&lt;br&gt;&lt;br&gt;申请地址：http://developer.baidu.com/&lt;br&gt;&lt;br&gt;注册个人类型即可，没有啥说的，基本没啥问题。&lt;br&gt;&lt;br&gt;通过申请以后，你就可以使用百度bae了，百度bae可以建站或作为开发应用的服务端平台，提供有很多接口。&lt;br&gt;&lt;br&gt;找到管理中心-》云平台管理-》右上角快速创建应用：&lt;br&gt;&lt;br&gt;填写应用名称，接入方式选择移动应用，确定即可。&lt;br&gt;&lt;br&gt;应用生成，就可以对应用设置云环境，也就是哪种语言来开发，这里选择php。&lt;br&gt;&lt;br&gt;熟悉一下后台，提供有很多功能。后面详细介绍，这里只是预备知识！&lt;br&gt;&lt;br&gt;上面主要是一些准备知识，接着还是准备知识，开发微信也可以不使用数据库，但是要想搭建一些查询类应用，就可能使用到数据库操作，所以本节主要涉及到百度bae上面的数据库表的创建，插入数据，修改数据，删除数据，删除表，以及事务操作。&lt;br&gt;&lt;br&gt;开发前去bae创建应用，然后添加数据库mysql，就会自动生成一个数据库名称，是一串字符串。&lt;br&gt;&lt;br&gt;这里使用mysqli，测试，mysql差不多。&lt;/p&gt;&lt;div&gt;&lt;pre&gt;$dbname = &quot;tIXZeAfkXSSgYzKuMwGZ&quot;;//百度bae数据库 这就是生成的数据库，要替换成自己的   /*从环境变量里取出数据库连接需要的参数*/ $host = getenv('HTTP_BAE_ENV_ADDR_SQL_IP'); $port = getenv('HTTP_BAE_ENV_ADDR_SQL_PORT'); $user = getenv('HTTP_BAE_ENV_AK'); $pwd = getenv('HTTP_BAE_ENV_SK');   $db= new mysqli($host,$user,$pwd,$dbname,$port); if(mysqli_connect_errno()){  die(&quot;coonet error&quot;).mysqli_connect_errno(); }else{  echo 'ok'; }$db-&amp;amp;gt;query(&quot;set names utf8&quot;);&lt;/pre&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这就是百度bae数据库连接，接着就可以使用mysqli相关数据库方法去操作了。&lt;br&gt;&lt;br&gt;1.创建表&lt;/p&gt;&lt;div&gt;&lt;pre&gt;$sql = &quot;create table if not exists t_mysql( id int(10) primary key AUTO_INCREMENT, no int(10), name VARCHAR(255))&quot;;$result = $db-&amp;amp;gt;query($sql);if($result){ echo &quot;创建表成功&quot;;}&lt;/pre&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;2.插入&lt;/p&gt;&lt;div&gt;&lt;pre&gt;$sql =&quot;insert into t_mysql(id,no,name) values(null,1,'你好')&quot;;$result = $db-&amp;amp;gt;query($sql);if($result){ echo '插入成功';}&lt;/pre&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;3.修改&lt;/p&gt;&lt;div&gt;&lt;pre&gt;$sql =&quot;update t_mysql set name='重活' where id=1&quot;;$result = $db-&amp;amp;gt;query($sql);if($db-&amp;amp;gt;affected_rows&amp;amp;gt;0 &amp;amp;amp;&amp;amp;amp; $result){ echo '修改成功';}&lt;/pre&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;4.删除&lt;/p&gt;&lt;p&gt;&lt;span&gt;立即学习&lt;/span&gt;“PHP免费学习笔记（深入）”；&lt;/p&gt;&lt;div&gt;&lt;pre&gt;$sql =&quot;delete from t_mysql where id=4&quot;;$result = $db-&amp;amp;gt;query($sql);if($result &amp;amp;amp;&amp;amp;amp; $db-&amp;amp;gt;affected_rows&amp;amp;gt;0){ echo '删除成功';}&lt;/pre&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;5.查询&lt;/p&gt;&lt;div&gt;&lt;pre&gt;$sql = &quot;select * from t_mysql&quot;;  $result = $db-&amp;amp;gt;query($sql);  if($result){   $row = $result-&amp;amp;gt;fetch_row(); //索引数组 $r[0]   print_r($row);  }&lt;/pre&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;6.删除表&lt;/p&gt;&lt;div&gt;&lt;pre&gt;$sql = &quot;drop table if exists t_mysql&quot;;  $result = $db-&amp;amp;gt;query($sql);  if($result){   echo &quot;删除表成功&quot;;  }&lt;/pre&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;7.事务（注意只有innoDB引擎支持 myisam不支持事务）&lt;/p&gt;&lt;div&gt;&lt;pre&gt;$db-&amp;amp;gt;autocommit(FALSE);  $result1 = $db-&amp;amp;gt;query(&quot;insert into t_mysql values(null,3,'2333')&quot;);  $result2 = $db-&amp;amp;gt;query(&quot;insert into t_mysql values(null,5,'44433')&quot;);  if($result1 &amp;amp;amp;&amp;amp;amp; $result2){   $db-&amp;amp;gt;commit();   echo 'ok';  }else{   $db-&amp;amp;gt;rollback();  }&lt;/pre&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;上面就是BAE的基本操作，其实就是一般php操作数据库，足够在上边搭建一般的微信应用了。&lt;br&gt;&lt;br&gt;文件下载http://xiazai.jb51.net/201612/yuanma/baemysqli(jb51.net).rar&lt;br&gt;&lt;br&gt;外篇&lt;br&gt;&lt;br&gt;mysql数据库连接代码&lt;/p&gt;&lt;div&gt;&lt;pre&gt;&amp;lt;?php   $dbname = &quot;tIXZeAfkXSSgYzKuMwGZ&quot;;//百度bae数据库   /*从环境变量里取出数据库连接需要的参数*/ $host = getenv(&amp;amp;#39;HTTP_BAE_ENV_ADDR_SQL_IP&amp;amp;#39;); $port = getenv(&amp;amp;#39;HTTP_BAE_ENV_ADDR_SQL_PORT&amp;amp;#39;); $user = getenv(&amp;amp;#39;HTTP_BAE_ENV_AK&amp;amp;#39;); $pwd = getenv(&amp;amp;#39;HTTP_BAE_ENV_SK&amp;amp;#39;);   /*接着调用mysql_connect()连接服务器*/ $link = @mysql_connect(&quot;{$host}:{$port}&quot;,$user,$pwd,true); if(!$link) {  die(&quot;Connect Server Failed: &quot; . mysql_error()); } /*连接成功后立即调用mysql_select_db()选中需要连接的数据库*/ if(!mysql_select_db($dbname,$link)) {  die(&quot;Select Database Failed: &quot; . mysql_error($link)); } else{  echo &amp;amp;#39;ok&amp;amp;#39;; } mysql_query(&quot;set names utf8&quot;);//设置编码utf8?&amp;gt;&lt;/pre&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;</description><pubDate>Thu, 13 Mar 2025 12:11:00 +0800</pubDate></item><item><title>php微信公众号开发（3）php实现简单微信文本通讯</title><link>https://www.sharedbk.com/web/post/41492.html</link><description>&lt;p&gt;微信开发前，需要设置token，这个是微信设置的，可以任意设置，用来实现微信通讯。这里有一个别人写的微信类，功能还比较不错。weixin.class.php代码如下&lt;/p&gt;&lt;div&gt;&lt;pre&gt;&amp;lt;?php class Weixin{ public $token = &amp;amp;#39;&amp;amp;#39;;//token public $debug = false;//是否debug的状态标示，方便我们在调试的时候记录一些中间数据 public $setFlag = false; public $msgtype = &amp;amp;#39;text&amp;amp;#39;; //(&amp;amp;#39;text&amp;amp;#39;,&amp;amp;#39;image&amp;amp;#39;,&amp;amp;#39;location&amp;amp;#39;) public $msg = array();  public function __construct($token,$debug) { $this-&amp;gt;token = $token; $this-&amp;amp;gt;debug = $debug; }//获得用户发过来的消息（消息内容和消息类型 ） public function getMsg() { $postStr = $GLOBALS[&quot;HTTP_RAW_POST_DATA&quot;];  if (!empty($postStr)) {  $this-&amp;amp;gt;msg = (array)simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);  $this-&amp;amp;gt;msgtype = strtolower($this-&amp;amp;gt;msg['MsgType']); } }//回复文本消息 public function makeText($text='') { $CreateTime = time(); $FuncFlag = $this-&amp;amp;gt;setFlag ? 1 : 0; $textTpl = &quot;&amp;lt;xml&amp;gt;  &amp;lt;tousername&amp;gt;msg['FromUserName']}]]&amp;amp;gt;&amp;lt;/tousername&amp;gt;  &amp;lt;fromusername&amp;gt;msg['ToUserName']}]]&amp;amp;gt;&amp;lt;/fromusername&amp;gt;  &amp;lt;createtime&amp;gt;{$CreateTime}&amp;lt;/createtime&amp;gt;  &amp;lt;msgtype&amp;gt;&amp;lt;/msgtype&amp;gt;  &amp;lt;content&amp;gt;&amp;lt;/content&amp;gt;  &amp;lt;funcflag&amp;gt;%s&amp;lt;/funcflag&amp;gt;  &amp;lt;/xml&amp;gt;&quot;; return sprintf($textTpl,$text,$FuncFlag); } //根据数组参数回复图文消息 public function makeNews($newsData=array()) { $CreateTime = time(); $FuncFlag = $this-&amp;amp;gt;setFlag ? 1 : 0; $newTplHeader = &quot;&amp;lt;xml&amp;gt;  &amp;lt;tousername&amp;gt;msg['FromUserName']}]]&amp;amp;gt;&amp;lt;/tousername&amp;gt;  &amp;lt;fromusername&amp;gt;msg['ToUserName']}]]&amp;amp;gt;&amp;lt;/fromusername&amp;gt;  &amp;lt;createtime&amp;gt;{$CreateTime}&amp;lt;/createtime&amp;gt;  &amp;lt;msgtype&amp;gt;&amp;lt;/msgtype&amp;gt;  &amp;lt;content&amp;gt;&amp;lt;/content&amp;gt;  &amp;lt;articlecount&amp;gt;%s&amp;lt;/articlecount&amp;gt;&amp;lt;articles&amp;gt;&quot;; $newTplItem = &quot;&amp;lt;item&amp;gt;  &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;  &amp;lt;description&amp;gt;&amp;lt;/description&amp;gt;  &amp;lt;picurl&amp;gt;&amp;lt;/picurl&amp;gt;  &amp;lt;url&amp;gt;&amp;lt;/url&amp;gt;  &amp;lt;/item&amp;gt;&quot;; $newTplFoot = &quot;&amp;lt;/articles&amp;gt;  &amp;lt;funcflag&amp;gt;%s&amp;lt;/funcflag&amp;gt;  &amp;lt;/xml&amp;gt;&quot;; $Content = ''; $itemsCount = count($newsData['items']); $itemsCount = $itemsCount  $item) {  if ($keycheckSignature()) {  if( $_SERVER['REQUEST_METHOD']=='GET' )  {  echo $_GET['echostr'];  exit;  } }else{    exit; } } private function checkSignature() { $signature = $_GET[&quot;signature&quot;]; $timestamp = $_GET[&quot;timestamp&quot;]; $nonce = $_GET[&quot;nonce&quot;];  $tmpArr = array($this-&amp;amp;gt;token, $timestamp, $nonce); sort($tmpArr); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr );  if( $tmpStr == $signature ){  return true; }else{  return false; } } }?&amp;amp;gt;&lt;/pre&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;接着正式开发，使用百度SVN地址，创建weixinapi.php文件，这个根据你后台设置名称。&lt;/p&gt;&lt;div&gt;&lt;pre&gt;&amp;lt;?php define(&quot;TOKEN&quot;, &quot;&quot;);define(&amp;amp;#39;DEBUG&amp;amp;#39;, false);include_once(&amp;amp;#39;weixin.class.php&amp;amp;#39;);require_once(&quot;db.php&quot;);  $weixin = new Weixin(TOKEN,DEBUG);//实例化$weixin-&amp;gt;getMsg();$type = $weixin-&amp;amp;gt;msgtype;//消息类型$keyword = $weixin-&amp;amp;gt;msg['Content'];//获取的文本if ($type==='text') {$reply = $weixin-&amp;amp;gt;makeText($key);}elseif($type==='event'){//第一次关注推送事件 $reply = $weixin-&amp;amp;gt;makeText(&quot;欢迎关注&quot;);}else{//其他类型$reply = $weixin-&amp;amp;gt;makeText(&quot;暂时没有图片,声音,地理位置等功能,后续开发会增加,感谢你关注&quot;);}$weixin-&amp;amp;gt;reply($reply);&lt;/pre&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这样就实现了一个例子，第一次关注事件回复，非文本回复，以及文本回复，这里文本回复是你输入什么就返回什么。&lt;br&gt;具体实现功能就写在文本回复里面。&lt;br&gt;其他的功能暂时不做，具体开发下节再说。&lt;br&gt;&lt;/p&gt;</description><pubDate>Thu, 13 Mar 2025 12:10:27 +0800</pubDate></item><item><title>php微信公众号开发（4）php实现自定义关键字回复</title><link>https://www.sharedbk.com/web/post/41491.html</link><description>&lt;p&gt;我们知道，微信公众号开发分订阅号和服务号，而个人只能申请订阅号，订阅号不能设置菜单，无形中只能通过关键字回复实现，比如我回复帮助，就返回帮助信息，如果我回复电影霍元甲，就返回霍元甲电影详细链接，这些都属于关键字回复，特定格式来实现。&lt;br&gt;&lt;br&gt;新建一张表，比如t_type表，用来实现输入关键字，返回特定文本，这里选择开发模式，为了不每次都改代码，我们把关键字和返回值写入数据表，设置表字段id，type,value三个字段。&lt;br&gt;&lt;br&gt;上一节我们得到了文本输入的值$keyword,现在我们用这个关键字去数据库表t_type，查询输入值，就能实现一些关键字，返回值这样简单特定返回功能，&lt;br&gt;&lt;br&gt;比如输入帮助，返回帮助信息，输入翻译我爱你，就能翻译了，输入手机18200000000返回归属地，对于直接能返回文本，那就存储值，比如帮助信息，如果翻译这种需要处理的，数据库就存储fanyi值，手机1820000000存储shouji，那么怎么处理呢，看这些代码&lt;/p&gt;&lt;div&gt;&lt;pre&gt;$str2 = mb_substr($keyword,0,2,'utf-8');//前两个字符$sql = &quot;select value from t_type where type='$keyword' or type='$str2' limit 1&quot;;  $res = mysql_query($sql);  $rs = mysql_fetch_array($res);if(!empty($rs)){  switch($rs[0]){    case &quot;shouji&quot;://查询功能break;}}else{//数据库没有查到进行处理}&lt;/pre&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这样就实现了输入手机+号码查询归属地，翻译类似实现，要添加功能，只需要通过数据库设置关键字和值，就能实现。&lt;br&gt;&lt;br&gt;这样基本所有功能就能分类实现了比如常见查询身份证归属地，ip地址查询，电影等等，都能够实现，下课再讲。&lt;/p&gt;</description><pubDate>Thu, 13 Mar 2025 12:09:46 +0800</pubDate></item><item><title>php版微信小店调用api示例代码</title><link>https://www.sharedbk.com/web/post/41490.html</link><description>&lt;p&gt;本文实例讲述了php版微信小店调用api的方法。分享给大家供大家参考，具体如下：&lt;br&gt;&lt;br&gt;刚开始调用微信小店api的时候，可能大家会遇到问题。系统总是提示system error，归根结底还是发送的参数不正确。&lt;br&gt;&lt;br&gt;下面给出几个调用例子：&lt;br&gt;&lt;br&gt;例子写得不全。&lt;/p&gt;&lt;div&gt;&lt;pre&gt;&amp;lt;?php function cUrlRequest($url,$data = null){  $curl = curl_init();  curl_setopt($curl, CURLOPT_URL, $url);  curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);  curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);  if (!empty($data)){    curl_setopt($curl, CURLOPT_POST, 1);    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);  }  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);  $output = curl_exec($curl);  curl_close($curl);  return $output;}//获取所有商品function gStateProduct($state = 0,$token){   //https://api.weixin.qq.com/merchant/getbystatus?access_token=ACCESS_TOKEN   //{&quot;status&quot;: 0}  // $AccessToken = &quot;xxxxxxxx&quot;;   $url = &quot;https://api.weixin.qq.com/merchant/getbystatus?access_token=&quot;.$token;   //print_r($this-&amp;gt;AccessToken);   $ResData = cUrlRequest($url,'{&quot;status&quot;: '.$state.'}');  //特别注意这里，这个是json格式的。   echo &quot;&amp;lt;pre class=&quot;brush:php;toolbar:false&quot;&amp;gt;&quot;;   print_r( json_decode($ResData) );}//获得所有分组function getAllCategory($state = 0,$token){    $url = &quot;https://api.weixin.qq.com/merchant/group/getall?access_token=&quot;.$token;    $ResData = cUrlRequest($url,'{&quot;status&quot;: '.$state.'}');    echo &quot;&amp;lt;pre class=&quot;brush:php;toolbar:false&quot;&amp;gt;&quot;;    print_r( json_decode($ResData) );}//根据分组id来获得商品信息function getProductByGroudid($state = 0,$token){  $url = &quot;https://api.weixin.qq.com/merchant/group/getbyid?access_token=&quot;.$token;  $ResData = cUrlRequest($url,'{&quot;group_id&quot;: '.$state.'}');  echo &quot;&amp;lt;pre class=&quot;brush:php;toolbar:false&quot;&amp;gt;&quot;;   print_r( json_decode($ResData) );}//获取accesstokenfunction getAccessToken(){    $appid = &quot;your appid&quot;;    $appsecret = &quot;your appsecret&quot;;    $url = &quot;https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&amp;amp;appid=&quot;.$appid.&quot;&amp;amp;secret=&quot;.$appsecret;    $result = cUrlRequest($url);    $jsoninfo = json_decode($result, true);    $access_token = $jsoninfo[&quot;access_token&quot;];    return $access_token;}//根据product_id来获取单个商品function getOneProductByid($state = 0,$token){  $url=&quot;https://api.weixin.qq.com/merchant/get?access_token=&quot;.$token;  $ResData = cUrlRequest($url,'{&quot;product_id&quot;: &quot;'.$state.'&quot;&quot;}');  echo &quot;&amp;lt;pre class=&quot;brush:php;toolbar:false&quot;&amp;gt;&quot;;   print_r( json_decode($ResData) );}$AccessToken=getAccessToken();//gStateProduct(1,$AccessToken);//getAllCategory(1,$AccessToken);//getProductByGroudid(207061749,$AccessToken);getOneProductByid(&quot;pf82VwN45zr8eOlur5mAiSTjg8WU&quot;,$AccessToken);&lt;/pre&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;</description><pubDate>Thu, 13 Mar 2025 12:09:12 +0800</pubDate></item><item><title>php版微信小店API二次开发及使用示例</title><link>https://www.sharedbk.com/web/post/41489.html</link><description>&lt;p&gt;本文实例讲述了php版微信小店api二次开发及使用方法。分享给大家供大家参考，具体如下：&lt;br&gt;&lt;br&gt;1. weixiaodian.php页面：&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;div&gt;&lt;pre&gt;&amp;lt;?php   class wXd  {    public $AppID = &quot;&quot;;    public $AppSecret = &quot;&quot;;    public $OutPut = &quot;&quot;;    public $AccessToken = &quot;&quot;;    public $ID = &quot;&quot;;    public $HandleAT = array();    public $Logistics = array();    public function __construct($ID = &amp;amp;#39;0&amp;amp;#39;){      $this-&amp;gt;ID = $ID;      $this-&amp;amp;gt;sLogisticsList();    }    public function cUrlRequest($url,$data = null){      $curl = curl_init();      curl_setopt($curl, CURLOPT_URL, $url);      curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);      curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);      if (!empty($data)){        curl_setopt($curl, CURLOPT_POST, 1);        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);      }      curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);      $output = curl_exec($curl);      curl_close($curl);      return $output;    }    //获取ACCESSTOKEN    public function sAcessToken(){      $this-&amp;amp;gt;HandleAT = $this-&amp;amp;gt;gAccessToken();      if($this-&amp;amp;gt;HandleAT-&amp;amp;gt;expire_time AppID;        $appsecret = $this-&amp;amp;gt;AppSecret;        $url = &quot;https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&amp;amp;amp;appid=&quot;.$appid.&quot;&amp;amp;amp;secret=&quot;.$appsecret;        $result = https_request($url);        //echo '&amp;lt;pre class=&quot;brush:php;toolbar:false&quot;&amp;gt;'; var_dump($result);die;        $jsoninfo = json_decode($result, true);        $access_token = $jsoninfo[&quot;access_token&quot;];        $this-&amp;gt;pAccessToken($access_token);        return $access_token;      }      else{        return $this-&amp;gt;HandleAT-&amp;gt;access_token;      }    }    //保存ACCESSTOKEN    public function pAccessToken($accesstoken){      $Path = $_SERVER['DOCUMENT_ROOT'].&quot;/jSon_file/access_token_&quot;.$this-&amp;gt;ID.&quot;.json&quot;;      //print_r($Path);      if(!file_exists($Path)){        touch($Path);        chmod($Path,0777);      }      $data['expire_time'] = time() + 7000;      $data['access_token'] = $accesstoken;      $fp = fopen($Path, &quot;w&quot;);      fwrite($fp, json_encode($data));      fclose($fp);    }    //读取ACCESSTOKEN    public function gAccessToken(){      $Path = $_SERVER['DOCUMENT_ROOT'].&quot;/jSon_file/access_token_&quot;.$this-&amp;gt;ID.&quot;.json&quot;;      if(!file_exists($Path)){        $data['expire_time'] = 0;        $data['access_token'] = '';      }      else{        $data = json_decode(file_get_contents($Path));        //print_r($data);      }      return $data;    }    //获取所有商品    public function gStateProduct($state = 0){       //https://api.weixin.qq.com/merchant/getbystatus?access_token=ACCESS_TOKEN       //{&quot;status&quot;: 0}       $this-&amp;gt;AccessToken = $this-&amp;gt;sAcessToken();       $url = &quot;https://api.weixin.qq.com/merchant/getbystatus?access_token=&quot;.$this-&amp;gt;AccessToken;       //print_r($this-&amp;gt;AccessToken);       $ResData = $this-&amp;gt;cUrlRequest($url,'{&quot;status&quot;: '.$state.'}');       //echo &quot;&amp;lt;pre class=&quot;brush:php;toolbar:false&quot;&amp;gt;&quot;;       print_r( json_decode($ResData) );    }    //设置微小店物流支持列表    public function sLogisticsList(){      $this-&amp;gt;Logistics['Fsearch_code'] = &quot;邮政EMS&quot;;      $this-&amp;gt;Logistics['002shentong'] = &quot;申通快递&quot;;      $this-&amp;gt;Logistics['066zhongtong'] = &quot;中通速递&quot;;      $this-&amp;gt;Logistics['056yuantong'] = &quot;圆通速递&quot;;      $this-&amp;gt;Logistics['042tiantian'] = &quot;天天快递&quot;;      $this-&amp;gt;Logistics['003shunfeng'] = &quot;顺丰速运&quot;;      $this-&amp;gt;Logistics['059Yunda'] = &quot;韵达快运&quot;;      $this-&amp;gt;Logistics['064zhaijisong'] = &quot;宅急送&quot;;      $this-&amp;gt;Logistics['020huitong'] = &quot;汇通快运&quot;;      $this-&amp;gt;Logistics['zj001yixun'] = &quot;易迅快递&quot;;    }    //获取订单详情    public function gOrderInfo($order){      $this-&amp;gt;AccessToken = $this-&amp;gt;sAcessToken();      //print_r($this-&amp;gt;AccessToken);      $url = &quot;https://api.weixin.qq.com/merchant/order/getbyid?access_token=&quot;.$this-&amp;gt;AccessToken;      $ResData = $this-&amp;gt;cUrlRequest($url,'{&quot;order_id&quot;: &quot;'.$order.'&quot;}');      //$url = &quot;https://api.weixin.qq.com/merchant/order/getbyfilter?access_token=&quot;.$this-&amp;gt;AccessToken;      //$ResData = $this-&amp;gt;cUrlRequest($url,'{&quot;status&quot;: 2}');      print_r( json_decode($ResData) );    }    //查询全部订单    public function gOrderAll($data = array()){      $this-&amp;gt;AccessToken = $this-&amp;gt;sAcessToken();      $url = &quot;https://api.weixin.qq.com/merchant/order/getbyfilter?access_token=&quot;.$this-&amp;gt;AccessToken;      if(!empty($data)){        $data = json_encode($data);      }      else{        $firstday = strtotime(date(&quot;Y-m-01&quot;,time()));        $data = array('begintime' =&amp;gt; $firstday,'endtime' =&amp;gt; strtotime(&quot;$firstday +1 month -1 day&quot;));        $data = json_encode($data);      }      $ResData = $this-&amp;gt;cUrlRequest($url,$data);      print_r( json_decode($ResData) );    }    //设置订单发货    public function sOrderDelivery($data = array(&quot;need_delivery&quot; =&amp;gt; '0')){      $this-&amp;gt;AccessToken = $this-&amp;gt;sAcessToken();      $url = &quot;https://api.weixin.qq.com/merchant/order/setdelivery?access_token=&quot;.$this-&amp;gt;AccessToken;      if(!empty($data)){        $data = json_encode($data);      }      else{        $data = array(&quot;need_delivery&quot; =&amp;gt; '0');        $data = json_encode($data);      }      $ResData = $this-&amp;gt;cUrlRequest($url,$data);      print_r( json_decode($ResData) );    }    //关闭订单    public function sOrderClose($order){      $this-&amp;gt;AccessToken = $this-&amp;gt;sAcessToken();      $url = &quot;https://api.weixin.qq.com/merchant/order/close?access_token=&quot;.$this-&amp;gt;AccessToken;      $ResData = $this-&amp;gt;cUrlRequest($url,'{&quot;order_id&quot;: &quot;'.$order.'&quot;}');      print_r( json_decode($ResData) );    }}&lt;/pre&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;2. 页面执行代码&lt;/p&gt;&lt;div&gt;&lt;pre&gt;&amp;lt;?php include_once &amp;amp;#39;class/weixiaodian.php&amp;amp;#39;;$wXd = new wXd();echo &quot;&amp;lt;pre class=&quot;brush:php;toolbar:false&quot;&amp;gt;&quot;;//查询全部商品$wXd-&amp;gt;gStateProduct();//获取订单信息$wXd-&amp;gt;gOrderInfo('12963133879983601645');//关闭订单$wXd-&amp;gt;sOrderClose('12963133879983600740');//发货订单设置$data['need_delivery'] = '1';$data['order_id'] = '12963133879983600667';$data['delivery_company'] = '059Yunda';$data['delivery_track_no'] = '1000464090326';$wXd-&amp;gt;sOrderDelivery($data);//获取所有订单$wXd-&amp;gt;gOrderAll();echo &quot;&lt;/pre&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&quot;;</description><pubDate>Thu, 13 Mar 2025 12:08:27 +0800</pubDate></item><item><title>C# 微信公众号开发--准备工作</title><link>https://www.sharedbk.com/web/post/41488.html</link><description>&lt;p&gt;前言&lt;/p&gt;&lt;p&gt;      最初打算熟悉下微信开发打算用node.js开发，结果底气不足先用c#开发，先踩了踩坑。&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;准备工作&lt;/p&gt;&lt;p&gt;     微信公众平台开发者文档。 这个先多看几遍。&lt;/p&gt;&lt;p&gt;     测试公众号，申请开通后会看到微信号，appID,appsecret。开通后可以看到扫描下方的二维码关注该测试公众号&lt;/p&gt;&lt;p&gt;  域名。域名和服务器的话大家可以买阿里云，如果觉的价格不合适可以在某宝上域名资源和服务器资源。&lt;/p&gt;&lt;p&gt;     服务器。域名和服务器需要先把基础环境搭建起来，因为公众号接口配置信息(URL、Token)、js接口安全域名。 &lt;/p&gt;&lt;p&gt;     准备工作都到位了先在服务上把环境搭建起来，因为填写URL时微信需要检查目前这个服务器控制权是否在你手里。我就用IIS先搭建了地址，随便返回个字符串。&lt;/p&gt;&lt;p&gt;     硬件环境和软件环境到位后顺便看下盛派微信SDK，主要是简化了微信公众号开发，同时又开源，可以学习下SDK的设计和思路。同时有开源SDK都是我们开发者的福音，为作者点赞。&lt;/p&gt;</description><pubDate>Thu, 13 Mar 2025 11:40:49 +0800</pubDate></item><item><title>C#微信公众号开发--微信事件交互</title><link>https://www.sharedbk.com/web/post/41487.html</link><description>&lt;p&gt;前言&lt;/p&gt;&lt;p&gt;      一切准备工作就绪时就先实现一个关注公众号后向客户端推送一条消息。关注后推送消息需要一个get请求、一个post请求，get请求主要是为了向微信服务器验证，post请求主要就是处理微信消息了。 调接口时传递的appid和appsecret请传递自己公众号对应的参数。&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;微信事件交互&lt;/p&gt;&lt;p&gt;      微信事件交互主要是向微信服务器推送XML数据包&lt;/p&gt;&lt;p&gt;看效果&lt;/p&gt;&lt;p&gt;看代码&lt;/p&gt;&lt;div&gt;&lt;pre&gt;[HttpGet][ActionName(&quot;Index&quot;)]public ActionResult Get(string signature,string timestamp,string nonce,string echostr){    if (CheckSignature.Check(signature, timestamp, nonce, token))    {        return Content(echostr);    }    else    {       return Content(&quot;err&quot;);    }}&lt;/pre&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;[HttpPost][ActionName(&quot;Index&quot;)]public ActionResult Get(string signature, string timestamp, string nonce){     StreamReader sr = new StreamReader(Request.InputStream, Encoding.UTF8);     XmlDocument doc = new XmlDocument();     doc.Load(sr);     sr.Close();     sr.Dispose();     WxMessage wxMessage = new WxMessage();     wxMessage.ToUserName = doc.SelectSingleNode(&quot;xml&quot;).SelectSingleNode(&quot;ToUserName&quot;).InnerText;     wxMessage.FromUserName = doc.SelectSingleNode(&quot;xml&quot;).SelectSingleNode(&quot;FromUserName&quot;).InnerText;     wxMessage.MsgType = doc.SelectSingleNode(&quot;xml&quot;).SelectSingleNode(&quot;MsgType&quot;).InnerText;     wxMessage.CreateTime = int.Parse(doc.SelectSingleNode(&quot;xml&quot;).SelectSingleNode(&quot;CreateTime&quot;).InnerText);     if (wxMessage.MsgType == &quot;event&quot;)     {         wxMessage.EventName = doc.SelectSingleNode(&quot;xml&quot;).SelectSingleNode(&quot;Event&quot;).InnerText;         if (!string.IsNullOrEmpty(wxMessage.EventName) &amp;amp;amp;&amp;amp;amp; wxMessage.EventName == &quot;subscribe&quot;)         {              string content = &quot;您好，欢迎访问garfieldzf8测试公众平台&quot;;              content = SendTextMessage(wxMessage, content);              return Content(content);        }    }            return Content(&quot;&quot;);}private string SendTextMessage(WxMessage wxmessage,string content){      string result = string.Format(Message, wxmessage.FromUserName,wxmessage.ToUserName,DateTime.Now.Ticks, content);      return result;} public string Message {     get     {         return @&quot;&amp;lt;xml&amp;gt;                      &amp;lt;tousername&amp;gt;&amp;lt;/tousername&amp;gt;                      &amp;lt;fromusername&amp;gt;&amp;lt;/fromusername&amp;gt;                      &amp;lt;createtime&amp;gt;{2}&amp;lt;/createtime&amp;gt;                      &amp;lt;msgtype&amp;gt;&amp;lt;/msgtype&amp;gt;                      &amp;lt;content&amp;gt;&amp;lt;/content&amp;gt;                 &amp;lt;/xml&amp;gt;&quot;;            }    }&lt;/pre&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;public class WxMessage  {        public string ToUserName { get; set; }        public string FromUserName { get; set; }        public long CreateTime { get; set; }        public string Content { get; set; }        public string MsgType { get; set; }        public string EventName { get; set; }        public string EventKey { get; set; }   }&lt;/pre&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;总结&lt;/p&gt;&lt;p&gt;     开发微信接口的过程中不能调试，唯一排除问题的方式就是在关键的地方记log。&lt;/p&gt;&lt;p&gt;     微信事件交互主要是分析微信发送的xml数据包，解析xml，并按照消息指定格式拼接xml发送给response。在Get方法里用到的CheckSignature 是盛派微信SDK的一个类，也就是对签名校验。&lt;/p&gt;&lt;p&gt;     向客户端发送消息时主要ToUserName和FromUserName。我一开始把两个参数写反了导致客户端收不到消息。&lt;/p&gt;</description><pubDate>Thu, 13 Mar 2025 11:40:07 +0800</pubDate></item><item><title>C#微信公众号开发--网页授权(oauth2.0)获取用户基本信息一</title><link>https://www.sharedbk.com/web/post/41486.html</link><description>&lt;p&gt;前言&lt;/p&gt;&lt;p&gt;     微信网页授权共分为两种方式:snsapi_base、snsapi_userinfo。 snsapi_base需要关注公众号，获取用户信息时不弹出用户授权界面。 snsapi_userinfo是在用户未关注公众号的情况下浏览页面，会先弹出一个用户授权界面，用户授权后才能拿到用户信息。这一篇我们先看snsapi_base实现。&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;踩坑注意     &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;刚开始我调试时snsapi_base方式，点击页面地址时提示地址链接不可用，网页授权需要先在公众号里设置网页授权基本信息，也就是设置域名。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;区分清楚全局access_token和网页授权access_token&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;这里注意只填写到域名&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;看效果&lt;/p&gt;&lt;p&gt;       这里看我们通过oauth  snsapi_base已经拿到用户的基本信息，对于一般咨询类的开发也就够用了。&lt;/p&gt;&lt;p&gt;看思路&lt;/p&gt;&lt;p&gt;1、通过回掉地址先拿到code。&lt;/p&gt;&lt;p&gt;2、通过code拿到openid。&lt;/p&gt;&lt;p&gt;3、通过appid和appsecret拿到全局access_token（这一点区别于snsapi_userinfo）。&lt;/p&gt;&lt;p&gt;4、通过全局access_token和openid拿到用户信息。&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;看代码&lt;/p&gt;&lt;p&gt;     到这里也就简单了，主要是get方式调微信接口，同时准备好你的get和post请求方式，返回参数用json转化成实体类。&lt;/p&gt;&lt;div&gt;&lt;pre&gt;public ActionResult OAuthSnsApiBase() {      string code = Request.QueryString[&quot;code&quot;];      try     {           if (!string.IsNullOrEmpty(code))           {                   OAuthToken oauthToken = HttpUtility.Get&amp;lt;oauthtoken&amp;gt;(string.Format(&quot;https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&amp;amp;amp;secret={1}&amp;amp;amp;code={2}&amp;amp;amp;grant_type=authorization_code&quot;, appID, appsecret, code));                    string accesstoken = string.Empty;                    AccessToken token = HttpUtility.Get&amp;lt;accesstoken&amp;gt;(string.Format(&quot;https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&amp;amp;amp;appid={0}&amp;amp;amp;secret={1}&quot;,appID,appsecret));                    if (token != null &amp;amp;amp;&amp;amp;amp; !string.IsNullOrEmpty(token.access_token))                    {                        accesstoken = token.access_token;                    }                                        if (oauthToken != null &amp;amp;amp;&amp;amp;amp; !string.IsNullOrEmpty(oauthToken.openid))                    {                                                OAuthUserInfo userInfo = HttpUtility.Get&amp;lt;oauthuserinfo&amp;gt;(string.Format(&quot;https://api.weixin.qq.com/cgi-bin/user/info?access_token={0}&amp;amp;amp;openid={1}&amp;amp;amp;lang=zh_CN&quot;, accesstoken, oauthToken.openid));                        if (userInfo != null)                        {                                                                     ViewData[&quot;headImage&quot;] = userInfo.headimgurl;                            ViewData[&quot;openid&quot;] = userInfo.openid;                            ViewData[&quot;nickName&quot;] = userInfo.nickname;                            if (userInfo.sex == 0)                            {                                ViewData[&quot;sex&quot;] = &quot;未知&quot;;                            }                            else if (userInfo.sex == 1)                            {                                ViewData[&quot;sex&quot;] = &quot;男&quot;;                            }                            else                            {                                ViewData[&quot;sex&quot;] = &quot;女&quot;;                            }                            ViewData[&quot;province&quot;] = userInfo.province;                            ViewData[&quot;city&quot;] = userInfo.city;                        }                        else                        {                                                }                    }                    else                    {                                           }                                  }                else                {                    return Redirect(string.Format(&quot;https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&amp;amp;amp;redirect_uri={1}&amp;amp;amp;response_type=code&amp;amp;amp;scope=snsapi_base&amp;amp;amp;state=123456#wechat_redirect&quot;, appID,&quot;http://&quot;+Request.Url.Host + Url.Action(&quot;OAuthSnsApiBase&quot;)));                }            }            catch (Exception ex)            {                         ViewData[&quot;errmsg&quot;] = ex.Message;            }                        return View();        }&amp;lt;/oauthuserinfo&amp;gt;&amp;lt;/accesstoken&amp;gt;&amp;lt;/oauthtoken&amp;gt;&lt;/pre&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;pre&gt; public class OAuthToken     {         public string access_token { get; set; }         public int expires_in { get; set; }         public string refresh_token { get; set; }         public string openid { get; set; }         public string scope { get; set; }     }  public class AccessToken     {         public string access_token { get; set; }         public int expires_in { get; set; }     }public class OAuthUserInfo     {         public string openid { get; set; }         public string nickname { get; set; }         public int sex { get; set; }         public string province { get; set; }          public string city { get; set; }          public string country { get; set; }          public string headimgurl { get; set; }          public string privilege { get; set; }          public string unionid { get; set; }              }&lt;/pre&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;总结&lt;/p&gt;&lt;p&gt;     这里获取用户信息的接口是https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&amp;amp;openid=OPENID&amp;amp;lang=zh_CN。和网页授权二获取用户接口是不一样的。 &lt;/p&gt;&lt;p&gt;代码全部上传到github里：https://github.com/garfieldzf8/WeChat&lt;/p&gt;&lt;p&gt;参考&lt;/p&gt;&lt;p&gt;http://www.cnblogs.com/txw1958/p/weixin76-user-info.html&lt;/p&gt;&lt;p&gt; &lt;/p&gt;</description><pubDate>Thu, 13 Mar 2025 11:39:27 +0800</pubDate></item></channel></rss>