.net core 微信公众号开发(一)
<p><span style="font-size: 16px"><strong>一: 登录微信公众平台:进行注册</strong></span></p><p><span style="color: rgba(255, 102, 0, 1)"><strong> (注意:请通读整篇文章后,再进行实操,免走弯路)</strong></span></p>
<p> https://mp.weixin.qq.com/ ,点击立即注册,选择你需要的账号类型,</p>
<p> 这个是各种类型的区分:https://kf.qq.com/faq/170815aUZjeQ170815mU7bI7.htm, </p>
<p> 大致总结:订阅号没有服务号权限多,类型个人没有类型企业注册麻烦,个人无法认证,企业可认证 </p>
<p><img src="https://img2020.cnblogs.com/blog/586337/202009/586337-20200917103649336-507660519.png" alt="" loading="lazy"></p>
<p> 注册过程中,可分为:个人/企业等(企业,自媒体等注册时,需要组织代号,经营许可证,对公账户等),这块我选择注册的是个人账号(需要上传手持身份证的照片)</p>
<p> </p>
<p><strong><span style="font-size: 16px">二:微信公众号基础操作</span></strong></p>
<p> 1:首先,了解一下整个工作流程(开发-->接口权限,可看见开发者的接口权限)</p>
<p> </p>
<p> <img src="https://img2020.cnblogs.com/blog/586337/202009/586337-20200917112148979-1656671551.png" alt="" width="414" height="629" loading="lazy"></p>
<p> </p>
<p> </p>
<p> 2:开发前的准备</p>
<p> 开发前,必须设置好 开发-->基础配置-->【服务器配置】(不配置的情况下,所有操作对测试公众号/公众号,都是不起作用的)</p>
<p> <img src="https://img2020.cnblogs.com/blog/586337/202009/586337-20200917114458227-1308223652.png" alt="" loading="lazy"></p>
<p> </p>
<p> </p>
<p> </p>
<p> <img src="https://img2020.cnblogs.com/blog/586337/202009/586337-20200917113929840-659869082.png" alt="" loading="lazy"></p>
<p> </p>
<p> <strong> 如上图所示:何进行服务器验证呢?</strong></p>
<p> 前提:</p>
<p> a: 一个对外的接口(微信服务器会通过该接口,传递给你4个参数:加密签名,时间戳,随机数,随机字符串)</p>
<p> b:页面填写时,还会有个:Token </p>
<p style="margin-left: 30px"> 接口处理逻辑: </p>
<div class="cnblogs_code" style="margin-left: 30px">
<pre>wechat server ---> url :传入【加密签名,时间戳,随机数,随机字符串】--><span style="color: rgba(0, 0, 0, 1)"> 将【Token,时间戳,随机数】排序并连接成一个字符串
进行sha1加密,得到的字符串 与 【加密签名】进行对比,一致则表示通过,并返回【随机字符串】</span></pre>
</div>
<p> 代码:</p>
<div class="cnblogs_code" style="margin-left: 30px"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_bf04fad6-779b-49db-a59c-2877a5f8ef3b" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_bf04fad6-779b-49db-a59c-2877a5f8ef3b" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_bf04fad6-779b-49db-a59c-2877a5f8ef3b" class="cnblogs_code_hide" style="margin-left: 30px">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span>
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> <span style="color: rgba(0, 0, 0, 1)">
</span><span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 255, 1)">public</span> ActionResult WechatValidation(<span style="color: rgba(0, 0, 255, 1)">string</span> echoStr,<span style="color: rgba(0, 0, 255, 1)">string</span> signature,<span style="color: rgba(0, 0, 255, 1)">string</span> timestamp,<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> nonce)
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> <span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 255, 1)">string</span> filename = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1.text</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 255, 1)">string</span> webRootPath =<span style="color: rgba(0, 0, 0, 1)"> _hostingEnvironment.WebRootPath;
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 255, 1)">string</span> contentRootPath =<span style="color: rgba(0, 0, 0, 1)"> _hostingEnvironment.ContentRootPath;
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 255, 1)">string</span> fullpath =<span style="color: rgba(0, 0, 0, 1)"> Path.Combine(webRootPath, filename);
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 0, 1)">System.IO.File.Exists(fullpath))
</span><span style="color: rgba(0, 128, 128, 1)">10</span> <span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 0, 1)"> System.IO.File.Create(fullpath).Close();
</span><span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">13</span>
<span style="color: rgba(0, 128, 128, 1)">14</span> System.IO.File.AppendAllText(fullpath, $<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">\r\nTime:{DateTime.Now},string echoStr:{echoStr},string signature:{signature},string timestamp:{timestamp},string nonce:{nonce}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">15</span>
<span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(0, 0, 255, 1)">var</span> token = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">wechat</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">17</span> <span style="color: rgba(0, 0, 255, 1)">var</span> checkResult =<span style="color: rgba(0, 0, 0, 1)"> CheckSignature(token, signature, timestamp, nonce);
</span><span style="color: rgba(0, 128, 128, 1)">18</span> <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> Content(echoStr);
</span><span style="color: rgba(0, 128, 128, 1)">19</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">20</span>
<span style="color: rgba(0, 128, 128, 1)">21</span>
<span style="color: rgba(0, 128, 128, 1)">22</span> <span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">bool</span> CheckSignature(<span style="color: rgba(0, 0, 255, 1)">string</span> token, <span style="color: rgba(0, 0, 255, 1)">string</span> signature, <span style="color: rgba(0, 0, 255, 1)">string</span> timestamp, <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> nonce)
</span><span style="color: rgba(0, 128, 128, 1)">23</span> <span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">24</span>
<span style="color: rgba(0, 128, 128, 1)">25</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建数组,将 Token, timestamp, nonce 三个参数加入数组</span>
<span style="color: rgba(0, 128, 128, 1)">26</span> <span style="color: rgba(0, 0, 255, 1)">string</span>[] array =<span style="color: rgba(0, 0, 0, 1)"> { token, timestamp, nonce };
</span><span style="color: rgba(0, 128, 128, 1)">27</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">进行排序</span>
<span style="color: rgba(0, 128, 128, 1)">28</span> <span style="color: rgba(0, 0, 0, 1)"> Array.Sort(array);
</span><span style="color: rgba(0, 128, 128, 1)">29</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">拼接为一个字符串</span>
<span style="color: rgba(0, 128, 128, 1)">30</span> <span style="color: rgba(0, 0, 255, 1)">var</span>tempStr = String.Join(<span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">, array);
</span><span style="color: rgba(0, 128, 128, 1)">31</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">对字符串进行 SHA1加密</span>
<span style="color: rgba(0, 128, 128, 1)">32</span> tempStr =<span style="color: rgba(0, 0, 0, 1)"> Get_SHA1_Method2(tempStr);
</span><span style="color: rgba(0, 128, 128, 1)">33</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">判断signature 是否正确</span>
<span style="color: rgba(0, 128, 128, 1)">34</span> <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (tempStr.Equals(signature))
</span><span style="color: rgba(0, 128, 128, 1)">35</span> <span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">36</span> <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">37</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">38</span> <span style="color: rgba(0, 0, 255, 1)">else</span>
<span style="color: rgba(0, 128, 128, 1)">39</span> <span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">40</span> <span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">41</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">42</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">43</span>
<span style="color: rgba(0, 128, 128, 1)">44</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span> Get_SHA1_Method2(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> strSource)
</span><span style="color: rgba(0, 128, 128, 1)">45</span> <span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">46</span> <span style="color: rgba(0, 0, 255, 1)">string</span> strResult = <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">47</span>
<span style="color: rgba(0, 128, 128, 1)">48</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Create </span>
<span style="color: rgba(0, 128, 128, 1)">49</span> System.Security.Cryptography.SHA1 md5 =<span style="color: rgba(0, 0, 0, 1)"> System.Security.Cryptography.SHA1.Create();
</span><span style="color: rgba(0, 128, 128, 1)">50</span>
<span style="color: rgba(0, 128, 128, 1)">51</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">注意编码UTF8、UTF7、Unicode等的选择 </span>
<span style="color: rgba(0, 128, 128, 1)">52</span> <span style="color: rgba(0, 0, 255, 1)">byte</span>[] bytResult =<span style="color: rgba(0, 0, 0, 1)"> md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(strSource));
</span><span style="color: rgba(0, 128, 128, 1)">53</span>
<span style="color: rgba(0, 128, 128, 1)">54</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">字节类型的数组转换为字符串 </span>
<span style="color: rgba(0, 128, 128, 1)">55</span> <span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> i = <span style="color: rgba(128, 0, 128, 1)">0</span>; i < bytResult.Length; i++<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">56</span> <span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">57</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">16进制转换 </span>
<span style="color: rgba(0, 128, 128, 1)">58</span> strResult = strResult + bytResult.ToString(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">X</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">59</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">60</span> <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> strResult.ToLower();
</span><span style="color: rgba(0, 128, 128, 1)">61</span> }</pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p> </p>
<p> c:接口写完,即可部署服务器</p>
<p> d:回到微信服务器,将url api填好, token和代码里面的token值保持一致,点击:提交(验证要求在5秒内有响应,如果失败,多点几次提交)</p>
<p> </p>
<p>三:测试账号开发</p>
<p> 开发-->开发者工具--->公众平台测试账号</p>
<p> a:可获得测试用的:appid, appscrect </p>
<p> b:填入接口配置信息: url API , token</p>
<p> c: 扫一扫测试号码二维码(即:测试用的测试公众号)</p>
<p> d: 可接入模板消息,如:(json单引号会出错)</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">订单编号:{{orderid.DATA}}
亲爱的,{{name.DATA}},
于{{time.DATA}},发货
点击查看详情 </span></pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/586337/202009/586337-20200917121249078-2011860041.png" alt="" loading="lazy"></p>
<p> </p>
<p> </p>
<p><strong> 没有对外服务器的时候,如何自己申请(买)一个服务器域名,进行配置 </strong></p>
<p> 这边我使用的是腾讯云产品: </p>
<p> https://cloud.tencent.com/guide</p>
<p> </p>
<p> </p><br><br>
来源:https://www.cnblogs.com/hanliping/p/13684343.html
頁:
[1]