文章针对订阅号和服务号

01.开发环境

  • Visual Studio
  • IIS
  • natapp 做内外网映射

02.订阅号和服务号区别

  • 推送频率:服务号每月 4 条。订阅号每天 1 条
  • 功能:服务号开放更多高级功能。订阅号功能相对有限
  • 接收消息:服务号显示在微信对话框中。订阅号显示在文件夹中

订阅号和服务号区别

03.使用 Senparc.Weixin SDK

Nuget 搜索Senparc.Weixin.MP添加引用

001.网页授权–2018 年 3 月 28 日 14:17:03

网页授权解决的问题是:获取用户 OpenID 或者获取用户信息。(不使用 OAuth 带来的问题是,无法保证应用服务器先收到 点击事件 还是 先打开网页)
授权前,需要设置授权回调域名。具体位置:“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”

授权方式有两种:

  • snsapi_base 用来获取进入页面的用户的 openid。 静默授权。
  • snsapi_userinfo 用来获取用户的基本信息。需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。

微信菜单设置格式:

1
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf5b65d2df8d129d4&redirect_uri=http%3a%2f%2fwww.a9u5kn.natappfree.cc%2fsmd%2fweixin%2fOAuth2%2fIndex%3freturnUrl%3d%2fUserInfo%2fIndex&response_type=code&scope=snsapi_base&state=none#wechat_redirect

参数说明:

参数 是否必须 说明
appid 公众号的唯一标识
redirect_uri 授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理
response_type 默认 code
scope 作用域。snsapi_base 或者 snsapi_userinfo
state 重定向后会带上 state 参数。可以填写 0-9 A-Z a-z 任意值
#wechat_redirect 无论直接打开还是做页面 302 重定向时候,必须带此参数

示例:

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
...
using Senparc.Weixin.MP.AdvancedAPIs

namespace Test
{
public class Oauth2Controller : Controller
{
private static readonly string AppId = "";
private static readonly string AppSecret = "";

//returnUrl接收授权成功之后返回的地址
public ActionResult Index(string code, string state, string returnUrl)
{
if(string.IsNullOrEmpty(code))
{
return Content("授权失败");
}

//避免重复调用授权接口
if(Session["WxOpenId"] != null)
{
return Redirect(returnUrl);
}

try
{
var result = OAuthApi.GetAccessToken(AppId, AppSecret, code); //调用SDK提供的方法获取
Session["WxOpenId"] = result.openId;
return Redirect(returnUrl);
}
catch(Exception ex)
{
//TODO. SAVE LOG.
return Content(ex.Message);
}

}
}
}

99.遇到的问题

  • a.js 文件缓存问题。这个问题可以在引用的时候加个参数,修改 js 文件同时修改参数值
  • b.未能解析此远程名称‘api.weixin.qq.com’。说明服务器无法 ping 通此此地址,无法上外网。