微信开放平台微信登录功能 /移动应用微信登录开发指南

微信开放平台微信登录功能 /移动应用微信登录开发指南

准备工作

移动应用微信登录是基于OAuth2.0 协议标准构建的微信 OAuth2.0 授权登录系统。

在进行微信 OAuth2.0 授权登录接入之前,在微信开放平台注册开发者帐号,并拥有一个已审核通过的移动应用,并获得相应的 AppID 和 AppSecret,申请微信登录且通过审核后,可开始接入流程。

1、目前移动应用上微信登录只提供原生的登录方式,需要用户安装微信客户端才能配合使用。

2、对于 Android 应用,建议总是显示微信登录按钮,当用户手机没有安装微信客户端时,请引导用户下载安装微信客户端。

3、对于 iOS 应用,考虑到 iOS 应用商店审核指南中的相关规定,建议开发者接入微信登录时,先检测用户手机是否已安装微信客户端(使用 sdk 中isWXAppInstalled函数 ),对未安装的用户隐藏微信登录按钮,只提供其他登录方式(比如手机号注册登录、游客登录等)。

授权流程说明

微信 OAuth2.0 授权登录让微信用户使用微信身份安全登录第三方应用或网站,在微信用户授权登录已接入微信 OAuth2.0 的第三方应用后,第三方可以获取到用户的接口调用凭证(access_token),通过 access_token 可以进行微信开放平台授权关系接口调用,从而可实现获取微信用户基本开放信息和帮助用户实现基础开放功能等。

微信 OAuth2.0 授权登录目前支持 authorization_code 模式,适用于拥有 server 端的应用授权。该模式整体流程为:

1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据 code 参数;

2. 通过 code 参数加上 AppID 和AppSecret等,通过 API 换取access_token;

3. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

获取 access_token 时序图:

第一步:请求 CODE

移动应用微信授权登录

开发者需要配合使用微信开放平台提供的 SDK 进行授权登录请求接入。正确接入 SDK 后并拥有相关授权域(scope)权限后,开发者移动应用会在终端本地拉起微信应用进行授权登录,微信用户确认后微信将拉起开发者移动应用,并带上授权临时票据(code)。

iOS 平台应用授权登录接入代码示例(请参考 iOS 接入指南):


-(void)sendAuthRequest
{
	//构造 SendAuthReq 结构体
	SendAuthReq* req =[[[SendAuthReq alloc]init]autorelease];
	req.scope = @"snsapi_userinfo";
	req.state = @"123";
	//第三方向微信终端发送一个 SendAuthReq 消息结构
	[WXApi sendReq:req];
}

Android 平台应用授权登录接入代码示例(请参考 Android 接入指南):

{
	// send oauth request
	Final SendAuth.Req req = new SendAuth.Req();
	req.scope = "snsapi_userinfo";
	req.state = "wechat_sdk_demo_test";
	api.sendReq(req);
}

参数说明

参数是否必须说明
appid应用唯一标识,在微信开放平台提交应用审核通过后获得
scope应用授权作用域,如获取用户个人信息则填写 snsapi_userinfo
state用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止 csrf 攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加 session 进行校验。在 state 传递的过程中会将该参数作为 url 的一部分进行处理,因此建议对该参数进行url encode操作,防止其中含有影响 url 解析的特殊字符(如’#’、’&’等)导致该参数无法正确回传。

返回示例:

appid: wxd477edab60670232
scope: snsapi_userinfo
state: wechat_sdk_demo

可拉起微信打开授权登录页:

返回说明

用户点击授权后,微信客户端会被拉起,跳转至授权界面,用户在该界面点击允许或取消,SDK 通过 SendAuth 的 Resp 返回数据给调用方。

返回值说明
ErrCodeERR_OK = 0(用户同意) ERR_AUTH_DENIED = -4(用户拒绝授权) ERR_USER_CANCEL = -2(用户取消)
code用户换取 access_token 的 code,仅在 ErrCode 为 0 时有效
state第三方程序发送时用来标识其请求的唯一性的标志,由第三方程序调用 sendReq 时传入,由微信终端回传,state 字符串长度不能超过 1K
lang微信客户端当前语言
country微信用户当前国家信息

第二步:通过 code 获取 access_token

获取第一步的 code 后,请求以下链接获取 access_token:

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

参数说明

参数是否必须说明
appid应用唯一标识,在微信开放平台提交应用审核通过后获得
secret应用密钥 AppSecret,在微信开放平台提交应用审核通过后获得
code填写第一步获取的 code 参数
grant_type填 authorization_code

返回说明

正确的返回:

{
  "access_token": "ACCESS_TOKEN",
  "expires_in": 7200,
  "refresh_token": "REFRESH_TOKEN",
  "openid": "OPENID",
  "scope": "SCOPE",
  "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
参数说明
access_token接口调用凭证
expires_inaccess_token 接口调用凭证超时时间,单位(秒)
refresh_token用户刷新 access_token
openid授权用户唯一标识
scope用户授权的作用域,使用逗号(,)分隔
unionid当且仅当该移动应用已获得该用户的 userinfo 授权时,才会出现该字段

错误返回样例:

{"errcode":40029,"errmsg":"invalid code"}

刷新 access_token 有效期

access_token 是调用授权关系接口的调用凭证,由于 access_token 有效期(目前为 2 个小时)较短,当 access_token 超时后,可以使用 refresh_token 进行刷新,access_token 刷新结果有两种:

1. 若access_token已超时,那么进行refresh_token会获取一个新的access_token,新的超时时间;
2. 若access_token未超时,那么进行refresh_token不会改变access_token,但超时时间会刷新,相当于续期access_token。

refresh_token 拥有较长的有效期(30 天),当 refresh_token 失效的后,需要用户重新授权。

请求方法

获取第一步的 code 后,请求以下链接进行 refresh_token:

https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN

参数说明

参数是否必须说明
appid应用唯一标识
grant_type填 refresh_token
refresh_token填写通过 access_token 获取到的 refresh_token 参数

返回说明

正确的返回:

{
  "access_token": "ACCESS_TOKEN",
  "expires_in": 7200,
  "refresh_token": "REFRESH_TOKEN",
  "openid": "OPENID",
  "scope": "SCOPE"
}
参数说明
access_token接口调用凭证
expires_inaccess_token 接口调用凭证超时时间,单位(秒)
refresh_token用户刷新 access_token
openid授权用户唯一标识
scope用户授权的作用域,使用逗号(,)分隔

错误返回样例:

{ "errcode": 40030, "errmsg": "invalid refresh_token" }

注意:

  1. Appsecret 是应用接口使用密钥,泄漏后将可能导致应用数据泄漏、应用的用户数据泄漏等高风险后果;存储在客户端,极有可能被恶意窃取(如反编译获取Appsecret);
  2. access_token 为用户授权第三方应用发起接口调用的凭证(相当于用户登录态),存储在客户端,可能出现恶意获取access_token 后导致的用户数据泄漏、用户微信相关接口功能被恶意发起等行为;
  3. refresh_token 为用户授权第三方应用的长效凭证,仅用于刷新access_token,但泄漏后相当于access_token 泄漏,风险同上。

建议将Appsecret、用户数据(如access_token)放在 App 云端服务器,由云端中转接口调用请求。

第三步:通过access_token调用接口

获取access_token后,进行接口调用,有以下前提:

  1. access_token有效且未超时;
  2. 微信用户已授权给第三方应用帐号相应接口作用域(scope)。

对于接口作用域(scope),能调用的接口有以下:

授权作用域(scope)接口接口说明
snsapi_base/sns/oauth2/access_token通过 code 换取access_token、refresh_token和已授权scope
/sns/oauth2/refresh_token刷新或续期access_token使用
/sns/auth检查access_token有效性
snsapi_userinfo/sns/userinfo获取用户个人信息

其中snsapi_base属于基础接口,若应用已拥有其它 scope 权限,则默认拥有snsapi_base的权限。使用snsapi_base可以让移动端网页授权绕过跳转授权登录页请求用户授权的动作,直接跳转第三方网页带上授权临时票据(code),但会使得用户已授权作用域(scope)仅为snsapi_base,从而导致无法获取到需要用户授权才允许获得的数据和基础功能。

接口调用方法可查阅微信授权关系接口调用指南

F.A.Q

1. 什么是授权临时票据(code)?

答:第三方通过 code 进行获取access_token的时候需要用到,code的超时时间为10分钟,一个 code 只能成功换取一次access_token即失效。code的临时性和一次保障了微信授权登录的安全性。第三方可通过使用 https 和state参数,进一步加强自身授权登录的安全性。

2. 什么是授权作用域(scope)?

答:授权作用域(scope)代表用户授权给第三方的接口权限,第三方应用需要向微信开放平台申请使用相应 scope 的权限后,使用文档所述方式让用户进行授权,经过用户授权,获取到相应access_token后方可对接口进行调用。

3.开放平台移动应用微信登录目前是否收费?

答:“微信登录”和第三方网站共享微信庞大的用户价值,同时为微信用户提供更便捷服务和更优质内容,实现双向共赢,目前不收取任何费用。

微信开放平台WP8接入指南

微信开放平台WP8接入指南

注:本文为微信 WP8 终端开发工具的新手使用教程,只涉及教授 SDK 的使用方法,默认读者已经熟悉 VS2012 的基本使用方法,以及具有一定的编程知识基础等。

1.申请你的 AppID

请到 开发者应用登记页面 进行登记,登记并选择移动应用进行设置后,将获得 AppID,可立即用于开发。但应用登记完成后还需要提交审核,只有审核通过的应用才能正式发布使用。

2.微信终端 SDK 开发包

SDK 开发包包含 3 个文件:

-MicroMsgSDK.dll(每个第三方应用必须要导入该 sdk 库,用于实现与微信的交互)

-MicroMsgSDK.XML(API 文档,放到与 MicroMsgSDK.dll 相同的目录,在 VS 中可以提供帮助,如查看函数注释)

-Google.ProtocolBuffersLite.dll(Google 的 ProtocolBuffer 开源库,用于序列化数据,引入即可)

请前往资源下载页下载最新 SDK 包

3.搭建开发环境

[1] 在 VS2012 中建立你的工程。

[2] 如下图所示,右键点击工程的 References,在快捷菜单中选择 Add References,在打开的弹出框上点击“Browser”按钮,然后选择 WP8 平台 SDK 开发包 中的两个 dll 文件。

[3] 引入 SDK 的 dll 后,在 References 下可以看到引入的 dll 库。(如下图所示)。

SDK 的名字空间为 MicroMsg.sdk,在使用前先导入此名字空间。

using MicroMsg.sdk;

4.在代码中使用 SDK 开发包

[1] 发送请求或响应到微信

现在,你的程序要发送请求或响应给微信,可以通过 IWXAPI 的 sendReq 和 sendResp 两个函数来实现。

boolean sendReq(BaseReq req);

sendReq 是第三方 app 主动发送请求给微信,发送请求后会拉起微信应用,微信对请求进行处理后,会发送响应回 App。

boolean sendResp(BaseResp resp);

sendResp 场景:微信先向第三方 app 发送请求,拉起第三方 App 界面,当用户操作完成后,第三方 app 通过 sendResp 发送响应数据给微信,拉起微信界面。

sendReq 示例:

try

{

int scene = SendMessageToWX.Req.WXSceneSession; //发给微信朋友`

WXTextMessage message = new WXTextMessage();

message.Title = “文本”;

message.Text = “这是一段文本内容”;

SendMessageToWX.Req req = new SendMessageToWX.Req(message, scene);

IWXAPI api = WXAPIFactory.CreateWXAPI(AppID);

api.SendReq(req);

}

catch (WXException ex)

{

MessageBox.Show(ex.Message);

}

AppID 为你在微信开放平台网站上登记应用得到的 AppID。

需要注意的是,SendMessageToWX.Req 的 scene 参数,如果 scene 填 WXSceneSession,那么消息会发送给微信好友。如果 scene 填 WXSceneTimeline,那么消息会发送至朋友圈。如果 scene 填 WXSceneChooseByUser,那么会由用户来选择发送给好友还是发到朋友圈。scene 默认值为 WXSceneChooseByUser。

sendResp 示例:

try
{
WXTextMessage message = new WXTextMessage();
message.Title = "文本";
message.Text = "这是一段文本内容";
GetMessageFromWX.Resp resp = new GetMessageFromWX.Resp(req.Transaction, req.Username, message);
IWXAPI api = WXAPIFactory.CreateWXAPI(AppID);
api.SendResp(resp);
}
catch (WXException ex)
{
MessageBox.Show(ex.Message);
}

req 为微信向你的应用发送请求时传过来的数据对象。

具体要发送的内容由第三方 app 开发者定义,SDK 支持文本、图片、文件、链接、表情、音乐、视频、自定义等多种消息内容。具体可参考 Demo 源码。

[2] 处理微信的请求和响应

如果你的程序需要接收微信发送的请求和响应,需要下面 4 步操作:a.修改 WMAppManifest.xml

a.修改 WMAppManifest.xml

右键点击应用的 Properties 下的 WMAppManifest.xml,选择 Open with…,然后选择 Xml (Text) Editer 打开该文件。在的前面,加上以下标签代码(如果你的文件中已经存在标签,则添加在已有的标签下)

上面 Xml 片段中有两处需要修改的,一个是 Name=”SDK_DEMO”,改成任意你喜欢的名字,两个支持的 FileType,一个是.wechatapp, 另外一个是.wx3b34a14b66641dfd,其中“wx3b34a14b66641dfd”改成你在微信开放平台上登记应用时得到的 AppID,这个务必要写对,不然微信拉不起你的应用。

b. 编写微信入口 Page 类

继承 WXEntryBasePage 类,并覆写下表中的函数,来处理来自微信的请求和响应,微信发送的数据,已经填到了参数中,可直接取用。注意:如果覆写 OnNavigatedTo 函数,需要调用 base.OnNavigatedTo,以保证父类中的逻辑得以执行。

c. 继承系统的 UriMapperBase 类

大致逻辑如下:

class AssociationUriMapper : UriMapperBase
{
private string tempUri;
public override Uri MapUri(Uri uri)
{
tempUri = uri.ToString();
// 根据文件类型打开程序
if (tempUri.Contains("/FileTypeAssociation"))
{
// 获取fileID (after "fileToken=").
int fileIDIndex = tempUri.IndexOf("fileToken=") + 10;
string fileID = tempUri.Substring(fileIDIndex);
// 获取文件名.string incommingFileName = SharedStorageAccessManager.GetSharedFileName(fileID);
// 获取文件后缀
int extensionIndex = incommingFileName.LastIndexOf('.') + 1;
string incommingFileType = incommingFileName.Substring(extensionIndex).ToLower();
// 根据不同文件类型,跳转不同参数的地址
switch (incommingFileType)
{
case "wx3b34a14b66641dfd":
return new Uri("/DemoEntryPage.xaml?fileToken=" + fileID, UriKind.Relative);
default:
return new Uri("/MainPage.xaml", UriKind.Relative);
}
}
else
{
return uri;
}
}
}

case ‘wx3b34a14b66641dfd’: 改成你的 AppID。

“/DemoEntryPage.xaml?fileToken=” 改成步骤 b 中继承 WXEntryBasePage 的 Page 的路径。

d. 修改 App.xaml.cs 文件

然后在 App.xaml.cs 的 InitializePhoneApplication()函数中,增加一行代码:

// Assign the URI-mapper class to the application frame.

RootFrame.UriMapper = new AssociationUriMapper();

注意:

  1. 在测试的时候,确保你安装的 WP8 的微信(4.0 以上版本)

微信 SDK Sample Demo 源码

微信开放平台应用《微信开放平台网站信息登记表》填写规范

微信开放平台应用《微信开放平台网站信息登记表》填写规范

应用《微信开放平台网站信息登记表》

8.1 你所提交的《微信开放平台网站信息登记表》里的应用内容需与微信开放平台内应用基本信息保持一致。

驳回示例:微信开放平台应用名称为“书轩”,《微信开放平台网站信息登记表》中填写的应用名称为“二轩”,与平台应用名称无关。

8.2 《微信开放平台网站信息登记表》公章需与登记表内主办单位/微信开放平台认证主体一致。

8.3 《微信开放平台网站信息登记表》备案属港澳/海外主体无公章的,可用有权人手写签名替代。

8.4 《微信开放平台网站信息登记表》内的公司公章需清晰且规范,暂不支持合同章等其他章。

8.5 《微信开放平台网站信息登记表》备案需与登记表内主办单位一致。

8.6 《微信开放平台网站信息登记表》中的备案号需填写规范,正确的备案号格式示例:粤 ICP 备XXX号/粤 ICP 备XXX号-1。

微信开放平台特别应用审核规范

微信开放平台特别应用审核规范

特别应用

7.1 游戏应用

7.1.1 你所提交的应用若属于游戏应用且应用已在应用市场上架,可在提审基本信息页面的流程图处附上相关<网络游戏出版物号>等材料以供审核。若游戏出版单位和微信开放平台帐号认证主体不一致,建议一并补充版权方与微信开放平台帐号主体方的授权文件,授权书需加盖双方公章,且至少一方公章为鲜章。如以上材料无法提供,建议用户申请应用时在应用已上架处勾选否。

7.2 企业内部使用应用

7.2.1 你所申请的应用仅限企业内部使用,提交应用申请时主体信息需先通过微信开放平台主体认证,且在申请/修改应用说明处说明“该应用是只限内部使用,不做他用”。

7.2.2 你所申请的应用仅限企业内部使用,需上传能够清晰说明只限内部使用的应用行流程图,或提交该应用仅限内部使用的盖章说明。

7.2.3 你所申请的应用仅限企业内部使用且在应用已上架处勾选是,可在已上架应用下载链接处提交微信开放平台帐号主体下其他应用下载链接;若在应用已上架处勾选否,可提供与微信开放平台帐号主体一致的企业网站。

微信开放平台应用流程图审核规范

微信开放平台应用流程图审核规范

应用流程图

6.1 你在新增申请应用或修改应用时,如申请的应用已在应用市场上架,APP运行流程图处可直接提交相关 APP 运行截图,并提供相关应用商店的应用下载链接;如申请的应用未在应用市场上架,可提交相关交互设计图或者运行流程逻辑图等说明 APP 运行逻辑流程。

6.2 你所提供的流程图内容需与应用名称/应用图标/官网的内容一致。

6.3 你所提供的运行流程逻辑图应是规范的 APP 流程图或者交互设计图,不得上传图标或小程序、公众号、网站等其他平台的截图。

驳回示例:提供的运行流程图属于小程序截图,不是应用 APP 截图。

6.4 你所提供的流程图应呈现较多应用具体信息,建议流程图中 APP 运行截图包含有时间、电量等内容的状态栏来校验应用的真实性、安全性和统一性。

驳回示例:流程图的截图没有包含时间、电量等信息的状态栏,属于不规范截图。

微信开放平台应用官网审核规范

微信开放平台应用官网审核规范

应用官网

4.1 你可提供支持访问的应用官网或企业网站以供审核,官网内容需规范,包括应用提供的服务功能详情、用户协议、版权所有者、网站备案信息、联系方式等,官网不支持提供手机端小程序、公众号和H5等页面类型。 驳回示例:提供的官网为H5页面类型。

4.2 你所提供的官网不得是无法访问应用详细信息的登录界面,如网站需登录后才可访问,建议提供相关帐号密码以供审核人员登录并查看相关信息。

驳回示例:提供的官网打开是登录界面,无法访问应用相关详细信息。

4.3 你所提交的网站内容、排版等需符合常规网站要求,不支持只有几行文字,或者仅是一张或几张图片的,又或者是文档形式的网站内容。

驳回示例:提供的官网内容仅是一张图片,无应用相关详细信息。 

4.4 你所提交官网需有应用名称字眼及其应用介绍、应用图片、应用提供的服务功能详情等内容,如没有,建议调整网站内容补充更多应用详情内容或修改名称重新提审。

驳回示例:应用注册名称为“周末市集”,官网导航栏展示名称为“周末漫画“,与应用名称无关。

4.5 你所提交的官网开发者信息,需要与微信开放平台开发者资质认证主体信息一致,如不一致,提交时需提供相关授权书(加盖双方公章) 以供审核。

驳回示例:官网内主体信息展示为上海 xx 科技有限公司,微信开放平台帐号认证主体名称为佛山 xx 科技有限公司。