微信开放平台微信智能接口 /语义理解上手指南

微信开放平台微信智能接口 /语义理解上手指南

微信开放平台语义理解接口调用(http请求)简单方便,用户无需掌握语义理解及相关技术,只需根据自己的产品特点,选择相应的服务即可搭建一套智能语义服务。

第一步:创建应用

请到“管理中心”创建应用,点击“创建移动应用”或者“创建网站应用”,填写相关资料,然后将该应用提交审核,只有审核通过的应用才能进行开发。

注册完毕,我们会在 7 个工作日内完成审核工作。审核通过之后,开放平台将分配给该移动应用全局唯一的 AppID 和AppSecret。

第二步:根据 AppID 和AppSecret获得access token

调用接口:
http请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
参数说明:
参数是否必须说明
grant_type获取access_token填写client_credential
appid应用的appid
secret应用的appsecret
返回说明:

正常情况下,微信会返回下述 JSON 数据包。

{
"access_token":"ACCESS_TOKEN",
"expires_in":7200
}

参数说明
access_token获取到的凭证
expires_in凭证有效时间,单位:秒

错误时微信会返回错误码等信息,JSON数据包示例如下(该示例为 AppID 无效错误):

{
"errcode":40013,
"errmsg":"invalid appid"
}

第三步:使用access token调用语义理解接口

输入说明:
http请求方式: POST(请使用 https 协议)
https://api.weixin.qq.com/semantic/semproxy/search?access_token=YOUR_ACCESS_TOKEN
POST数据格式:JSON
POST数据例子:
{
"query":"查一下明天从北京到上海的南航机票",
"city":"北京",
"category": "flight,hotel",
"appid":"wxaaaaaaaaaaaaaaaa",
"uid":"123456"
}
输入参数说明:
参数是否必须参数类型说明
access_tokenString根据 appid 和appsecret获取到的token
queryString输入文本串
categoryString需要使用的服务类型,多个用“,”隔开,不能为空
latitude见接口协议文档Float纬度坐标,与经度同时传入;与城市二选一传入
longitude见接口协议文档Float经度坐标,与纬度同时传入;与城市二选一传入
city见接口协议文档String城市名称,与经纬度二选一传入
region见接口协议文档String区域名称,在城市存在的情况下可省;与经纬度二选一传入
appidStringAppid,开发者的唯一标识
uidString用户唯一id(非开发者id),用户区分应用下的不同用户(建议填入用户openid),如果为空,则无法使用上下文理解功能。appid和 uid 同时存在的情况下,才可以使用上下文理解功能。
返回说明:

正常情况下,微信会返回下述 JSON 数据包。

{
	"errcode":0,
	"query":"查一下明天从北京到上海的南航机票",
	"type":"flight",
	"semantic":{
		"details":{
			"start_loc":{
			"type":"LOC_CITY",
			"city":"北京市",
			"city_simple":"北京",
			"loc_ori":"北京"
			},
			"end_loc": {
			"type":"LOC_CITY",
			"city":"上海市",
			"city_simple":"上海",
			"loc_ori":"上海"
			},
			"start_date": {
			"type":"DT_ORI",
			"date":"2014-03-05",
			"date_ori":"明天"
			},
			"airline":"中国南方航空公司"
		},
		"intent":"SEARCH"
	}
}

返回参数说明:
参数是否必须参数类型说明
errcodeInt表示请求后的状态
queryString用户的输入字符串
typeString服务的全局类型id,详见协议文档中垂直服务协议定义
semanticObject语义理解后的结构化标识,各服务不同
resultArray部分类别的结果
answerString部分类别的结果html5展示,目前不支持
textString特殊回复说明

更多详细内容与协议说明,请查看:语义理解接口协议文档

微信登录功能 /网站应用微信登录开发指南

准备工作

网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统。 在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者帐号,并拥有一个已审核通过的网站应用,并获得相应的 AppID 和AppSecret,申请微信登录且通过审核后,可开始接入流程。

授权流程说明

微信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

第三方使用网站应用授权登录前请注意已获取相应网页授权作用域(scope=snsapi_login),则可以通过在 PC 端打开以下链接: https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 若提示“该链接无法访问”,请检查参数是否填写错误,如redirect_uri的域名与审核时填写的授权域名不一致或 scope 不为snsapi_login。

参数说明

参数是否必须说明
appid应用唯一标识
redirect_uri请使用 urlEncode 对链接进行处理
response_type填code
scope应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login
state用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止 csrf 攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加 session 进行校验
lang界面语言,支持cn(中文简体)与en(英文),默认为cn

返回说明

用户允许授权后,将会重定向到redirect_uri的网址上,并且带上 code 和state参数

redirect_uri?code=CODE&state=STATE

若用户禁止授权,则不会发生重定向。

请求示例

登录一号店网站应用 https://test.yhd.com/wechat/login.do 打开后,一号店会生成 state 参数,跳转到 https://open.weixin.qq.com/connect/qrconnect?appid=wxbdc5610cc59c1631&redirect_uri=https%3A%2F%2Fpassport.yhd.com%2Fwechat%2Fcallback.do&response_type=code&scope=snsapi_login&state=3d6be0a4035d839573b04816624a415e#wechat_redirect 微信用户使用微信扫描二维码并且确认登录后,PC端会跳转到 https://test.yhd.com/wechat/callback.do?code=CODE&state=3d6be0a40sssssxxxxx6624a415e

将微信登录二维码内嵌到自己页面

为了满足网站更定制化的需求,我们还提供了第二种获取 code 的方式,支持网站将微信登录二维码内嵌到自己页面中,用户使用微信扫码授权后通过 JS 将code返回给网站。 JS微信登录主要用途:网站希望用户在网站内就能完成登录,无需跳转到微信域下登录后再返回,提升微信登录的流畅性与成功率。 网站内嵌二维码微信登录 JS 实现办法:

步骤1:在页面中先引入如下 JS 文件(支持https):

http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js

步骤2:在需要使用微信登录的地方实例以下 JS 对象:

 var obj = new WxLogin({
 self_redirect:true,
 id:"login_container", 
 appid: "", 
 scope: "", 
 redirect_uri: "",
  state: "",
 style: "",
 href: ""
 });

参数说明

参数是否必须说明
self_redirecttrue:手机点击确认登录后可以在 iframe 内跳转到 redirect_uri,false:手机点击确认登录后可以在 top window 跳转到 redirect_uri。默认为 false。
id第三方页面显示二维码的容器id
appid应用唯一标识,在微信开放平台提交应用审核通过后获得
scope应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即可
redirect_uri重定向地址,需要进行UrlEncode
state用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止 csrf 攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加 session 进行校验
style提供”black”、”white”可选,默认为黑色文字描述。详见文档底部FAQ
href自定义样式链接,第三方可根据实际需求覆盖默认样式。详见文档底部FAQ

第二步:通过 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 泄漏,风险同上。

建议将secret、用户数据(如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
snsapi_base/sns/oauth2/refresh_token刷新或续期access_token使用
snsapi_base/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. 网站内嵌二维码微信登录 JS 代码中 style 字段作用? 答:第三方页面颜色风格可能为浅色调或者深色调,若第三方页面为浅色背景,style字段应提供”black”值(或者不提供,black为默认值),则对应的微信登录文字样式为黑色。相关效果如下:

若提供”white”值,则对应的文字描述将显示为白色,适合深色背景。相关效果如下:

4.网站内嵌二维码微信登录 JS 代码中 href 字段作用? 答:如果第三方觉得微信团队提供的默认样式与自己的页面样式不匹配,可以自己提供样式文件来覆盖默认样式。举个例子,如第三方觉得默认二维码过大,可以提供相关 css 样式文件,并把链接地址填入 href 字段

.impowerBox .qrcode {width: 200px;}
.impowerBox .title {display: none;}
.impowerBox .info {width: 200px;}
.status_icon {display: none}
.impowerBox .status {text-align: center;} 

相关效果如下:

微信开放平台 微信内网页跳转APP功能

功能介绍

在部分场景下,用户在微信内访问网页时需要跳转到 APP 使用完整服务,为此我们提供了“微信开放标签”以满足微信内网页跳转到 APP 的需求。 微信内网页跳转 APP 功能已向全体开发者开放,当用户访问已认证服务号的 JS 接口安全域名时,可以通过“微信开放标签”打开符合条件的 APP 。

使用说明

  1. 由于“微信开放标签”只开放给 JS 接口安全域名,使用此功能前请确保网页所属的域名已绑定为服务号的 JS 接口安全域名。详见《微信开放标签说明文档》
  2. 微信内网页无法跳转任意的 APP 。开发者需要在“微信开放平台”登记域名与移动应用(APP)的绑定关系,网页只可以跳转其域名绑定的移动应用(APP)。详见下述关联说明。

关联说明

设置入口

使用前需将「 JS 接口安全域名绑定的服务号」绑定在「移动应用的微信开放平台账号」下,并确保服务号与此开放平台账号同主体且均已认证。请前往 微信开放平台 – 管理中心 – 公众号详情 – 接口信息 设置域名与所需跳转的移动应用。

获得此设置入口的权限,需同时满足如下条件:

  1. 服务号已认证
  2. 开放平台账号已认证
  3. 服务号与开放平台账号同主体

绑定域名和移动应用

  1. 绑定域名的要求:
  • 域名须为当前服务号的 JS 安全域名
  • 域名只能同时绑定一个移动应用,因此须确保域名未被其他移动应用绑定
  1. 绑定移动应用的要求
  • 只能绑定同一微信开放平台账号下审核通过的移动应用
  1. 绑定次数
  • 每月可修改绑定3次

接入微信开放标签

绑定域名和移动应用后,即可在网页中使用“微信开放标签”跳转对应的移动应用。详见《微信开放标签说明文档》

APP拉起微信客服功能

APP拉起微信客服功能

功能介绍

考虑到部分场景下 APP 需要拉起微信客服,以完成相关咨询服务。为此 openSDK 提供了移动应用(APP)拉起微信客服功能。移动应用(APP)接入此功能后,用户可以从 APP 拉起指定的微信客服会话。该功能已向全体开发者开放,开发者在已认证的微信开放平台帐号下 . 申请移动应用审核通过后并上架,即可获得移动应用拉起微信客服的功能权限。

使用说明

帐号要求

移动应用开发者使用该功能,需同时满足以下条件:

  1. 微信开放平台账号已认证
  2. 移动应用审核通过并上架

注意:若移动应用未上架,则最多只能拉起微信客服100次/天,用于满足调试需求。

关联说明

移动应用仅可拉起具有绑定关系的微信客服,开发者需前往微信客服官网完成移动应用(appid)和企业 id 的绑定。

注意:一个移动应用(appid)最多绑定15个企业id

开发示例

Android开发示例

  • opensdk版本:大于等于6.7.9

调用接口:WXOpenCustomerServiceChat 移动应用跳转到微信客服会话示例:

String appId = "wxd930ea5d5a258f4f"; // 填移动应用(App)的 AppId
IWXAPI api = WXAPIFactory.createWXAPI(context, appId);

// 判断当前版本是否支持拉起客服会话
if (api.getWXAppSupportAPI() >= Build.SUPPORT_OPEN_CUSTOMER_SERVICE_CHAT) {
	String url = kfUrl.getText().toString();
	WXOpenCustomerServiceChat.Req req = new WXOpenCustomerServiceChat.Req();
	req.corpId = "xxxx";							      // 企业ID
	req.url = "https://work.weixin.qq.com/kfid/kfcxxxxx";	// 客服URL
	api.sendReq(req);
}

iOS 开发示例

  • opensdk版本:大于等于 1.9.2

移动应用跳转到微信客服会话示例:

    WXOpenCustomerServiceReq *req = [[WXOpenCustomerServiceReq alloc] init];
    req.corpid = corpId;	//企业ID
    req.url = url;			//客服URL
    return [WXApi sendReq:req completion:nil];

回调说明

	-(void)onResp:(BaseResp *)resp 
	{
	     if ([resp isKindOfClass:[WXOpenCustomerServiceResp class]])
	     {
	     	  int errCode = resp.errCode;		// 0 为成功,其余为失败
	          NSString *string = resp.extMsg;	// 相关错误信息
	     }
	}

微信开放平台APP拉起小程序功能 /iOS开发示例

微信开放平台APP拉起小程序功能 /iOS开发示例

开发前需下载 iOS 开发工具包(SDK),前往下载

移动应用跳转到小程序示例:

WXLaunchMiniProgramReq *launchMiniProgramReq = [WXLaunchMiniProgramReq object];
launchMiniProgramReq.userName = userName;  //拉起的小程序的username
launchMiniProgramReq.path = path;    ////拉起小程序页面的可带参路径,不填默认拉起小程序首页,对于小游戏,可以只传入 query 部分,来实现传参效果,如:传入 "?foo=bar"。
launchMiniProgramReq.miniProgramType = miniProgramType; //拉起小程序的类型
return  [WXApi sendReq:launchMiniProgramReq];

回调说明

-(void)onResp:(BaseResp *)resp 
{
     if ([resp isKindOfClass:[WXLaunchMiniProgramResp class]])
     {
          NSString *string = resp.extMsg;
          // 对应小程序组件 <button open-type="launchApp"> 中的 app-parameter 属性
     }
}

小程序跳转回移动应用请参考 《小程序开发文档》

微信开放平台APP拉起小程序功能 /Android开发示例

微信开放平台APP拉起小程序功能 /Android开发示例

开发前需下载 Android 开发工具包(SDK),可前往下载

调用接口:WXLaunchMiniProgram 移动应用跳转到小程序示例:

String appId = "wxd930ea5d5a258f4f"; // 填移动应用(App)的 AppId,非小程序的 AppID
IWXAPI api = WXAPIFactory.createWXAPI(context, appId);

WXLaunchMiniProgram.Req req = new WXLaunchMiniProgram.Req();
req.userName = "gh_d43f693ca31f"; // 填小程序原始id
req.path = path;                  ////拉起小程序页面的可带参路径,不填默认拉起小程序首页,对于小游戏,可以只传入 query 部分,来实现传参效果,如:传入 "?foo=bar"。
req.miniprogramType = WXLaunchMiniProgram.Req.MINIPTOGRAM_TYPE_RELEASE;// 可选打开 开发版,体验版和正式版
api.sendReq(req);

回调说明

WXEntryActivity中

public void onResp(BaseResp resp) {
    if (resp.getType() == ConstantsAPI.COMMAND_LAUNCH_WX_MINIPROGRAM) {
        WXLaunchMiniProgram.Resp launchMiniProResp = (WXLaunchMiniProgram.Resp) resp;
        String extraData =launchMiniProResp.extMsg; //对应小程序组件 <button open-type="launchApp"> 中的 app-parameter 属性
    }
}

小程序跳转回移动应用请参考《小程序开发文档》

微信开放平台APP拉起小程序功能 /功能介绍

微信开放平台APP拉起小程序功能 /功能介绍

功能介绍

考虑到部分场景下 APP 需要通过小程序来承载服务,为此 OpenSDK 提供了移动应用(APP)拉起小程序功能。移动应用(APP)接入此功能后,用户可以在 APP 中跳转至微信某一小程序的指定页面,完成服务后再跳回至原 APP 。
移动应用拉起小程序功能已向全体开发者开放,开发者在微信开放平台帐号下申请移动应用并通过审核后,即可获得移动应用拉起小程序功能权限。

跳转规则

  1. 对于已通过认证的开放平台账号,其移动应用可以跳转至任何合法的小程序,且不限制跳转的小程序数量。
  2. 对于未通过认证的开放平台账号,其移动应用仅可以跳转至同一开放平台账号下小程序。

注意:若移动应用未上架,则最多只能跳转小程序100次/天,用于满足调试需求。

接入流程

详见《 Android 开发示例》《 iOS 开发示例》

微信开放平台一次性订阅消息开发指南

微信开放平台一次性订阅消息开发指南

开发者可以通过一次性订阅消息授权让微信用户授权第三方移动应用或公众号(接入说明),获得发送一次订阅消息给到授权微信用户的机会。授权微信用户可以不需要关注公众号。微信用户每授权一次,开发者可获得一次下发消息的权限,消息将下发至服务通知。

使用说明:

1.第三方发起微信一次性订阅授权请求,微信用户允许授权第三方移动应用后,微信会拉起应用,并且带上授权用户 openid 等信息
2.通过 API 给授权用户推送一条订阅消息

注:在进行一次性订阅消息授权接入之前,需要在微信开放平台注册开发者帐号,并拥有一个已审核通过的移动应用,获得相应的下发消息模板 ID 后,可开始接入流程。

授权流程:

第一步:微信用户同意授权,获取一次给用户推送一条订阅消息的机会

开发者需要配合使用微信开放平台提供的 SDK 进行一次性订阅消息授权请求接入。正确接入 SDK 后,开发者移动应用会在终端本地拉起微信应用进行订阅消息授权,微信用户确认后微信将拉起开发者移动应用,并带上授权用户 openid 等信息。

iOS 平台应用一次性订阅消息授权接入代码示例(请参考 iOS 接入指南):

WXSubscribeMsgReq \*req = [[WXSubscribeMsgReq alloc] init];
req.scene = scene;
req.templateId = templateId;
req.reserved = reserved;
[WXApi sendReq:req];

Android 平台应用一次性订阅消息授权接入代码示例(请参考 Android 接入指南):

SubscribeMessage.Req req = new SubscribeMessage.Req();
req.scene = scene;
req.templateID = templateID;
req.reserved = reserved;

参数说明

参数是否必须说明
appid应用唯一标识,在微信开放平台提交应用审核通过后获得
scene重定向后会带上 scene 参数,开发者可以填 0-10000 的整型值,用来标识订阅场值
template_id订阅消息模板 ID,在微信开放平台提交应用审核通过后获得
reserved用于保持请求和回调的状态,授权请后原样带回给第三方。该参数可用于防止 csrf 攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加 session 进行校验,开发者可以填写 a-zA-Z0-9 的参数值,最多 128 字节,要求做 urlencode

可拉起微信打开一次性消息订阅授权页:

返回说明:

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

返回示例:

openid:oyAaTjt-xXvP87pubE4eUOF-ttD4
template_id:7YuTL__ilzyZB9DXcDt2mHx-CAS_E7KtsQkhIGVhhRM
action:confirm
reserved:hello
scene:1000

参数说明

参数说明
openid用户唯一标识,仅在用户确认授权时才有
template_id订阅消息模板 ID
action用户点击动作,”confirm”代表用户确认授权,”cancel”代表用户取消授权
scene订阅场景值
reserved请求带入原样返回

第二步:通过 API 推送订阅模板消息给到授权微信用户

接口请求说明

POST https://api.weixin.qq.com/cgi-bin/message/template/subscribe?access_token=ACCESS_TOKEN

post 数据示例

{
  "touser": "OPENID",
  "template_id": "TEMPLATE_ID",
  "url": "URL",
  "scene": "SCENE",
  "title": "TITLE",
  "data": {
    "content": {
      "value": "VALUE",
      "color": "COLOR"
    }
  }
}

参数说明

参数是否必须说明
access_token接口调用凭证,获取方式见后面附录说明
touser填接收消息的用户 openid
template_id订阅消息模板 ID
url点击消息跳转的链接,需要有 ICP 备案
scene订阅场景值
title消息标题,15 字以内
data消息正文,value 为消息内容文本(200 字以内),没有固定格式,可用\n 换行,color 为整段消息内容的字体颜色(目前仅支持整段消息为一种颜色)

返回说明

在调用接口后,会返回 JSON 数据包。正常时的返回 JSON 数据包示例:

{
  "errcode": 0,
  "errmsg": "ok"
}

附获取 access_token 说明:

access_token 是全局唯一接口调用凭据,开发者调用各接口时都需使用 access_token,请妥善保存。access_token 的存储至少要保留 512 个字符空间。access_token 的有效期目前为 2 个小时,需定时刷新,重复获取将导致上次获取的 access_token 失效。

API 调用所需的 access_token 的使用及生成方式说明:

1.为了保密 appsecrect,第三方需要一个 access_token 获取和刷新的中控服务器。而其他业务逻辑服务器所使用的 access_token 均来自于该中控服务器,不应该各自去刷新,否则会造成 access_token 覆盖而影响业务;

2.目前 access_token 的有效期通过返回的 expires_in 来传达,目前是 7200 秒之内的值。中控服务器需要根据这个有效时间提前去刷新新 access_token。在刷新过程中,中控服务器对外输出的依然是老 access_token,此时公众平台后台会保证在刷新短时间内,新老 access_token 都可用,这保证了第三方业务的平滑过渡;

3.access_token 的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新 access_token 的接口,这样便于业务服务器在 API 调用获知 access_token 已超时的情况下,可以触发 access_token 的刷新流程。

开发者可以使用 AppID 和 AppSecret 调用本接口来获取 access_token。移动应用的 AppID 和 AppSecret 可登录微信开放平台 – 管理中心 – 应用详情页中查看(需要审核通过的应用才能看到)。AppSecret 生成后请自行保存,因为在公众平台每次生成查看都会导致 AppSecret 被重置。注意调用所有微信接口时均需使用 https 协议。如果第三方不使用中控服务器,而是选择各个业务逻辑点各自去刷新 access_token,那么就可能会产生冲突,导致服务不稳定。

接口请求说明

GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

参数说明

参数是否必须说明
grant_type获取 access_token 填写 client_credential
appid第三方用户唯一凭证
secret第三方用户唯一凭证密钥,即 appsecret

返回说明

正常情况下,微信会返回下述 JSON 数据包给开发者:

{
  "access_token": "ACCESS_TOKEN",
  "expires_in": 7200
}

参数说明

参数说明
access_token获取到的凭证
expires_in凭证有效时间,单位:秒

错误时微信会返回错误码等信息,JSON 数据包示例如下(该示例为 AppID 无效错误):

{
  "errcode": 40013,
  "errmsg": "invalid appid"
}

返回码说明

返回码说明
-1系统繁忙,此时请开发者稍候再试
0请求成功
40001AppSecret 错误或者 AppSecret 不属于这个 appid,请开发者确认 AppSecret 的正确性
40002请确保 grant_type 字段值为 client_credential

微信开放平台微信登录功能 /消息推送服务器设置

微信开放平台微信登录功能 /消息推送服务器设置

消息推送

第一步:填写服务器配置

登录OPEN平台后,在移动应用/网页应用详情页面 -「消息推送」中,管理员可启用消息服务,填写服务器地址(URL)、令牌(Token) 和 消息加密密钥(EncodingAESKey)等信息。

  • URL: 开发者用来接收微信消息和事件的接口 URL。开发者所填写的URL 必须以 http:// 或 https:// 开头,分别支持 80 端口和 443 端口。
  • Token: 可由开发者可以任意填写,用作生成签名(该 Token 会和接口 URL 中包含的 Token 进行比对,从而验证安全性)。
  • EncodingAESKey: 由开发者手动填写或随机生成,将用作消息体加解密密钥。

同时,开发者可选择消息加解密方式:明文模式(默认)、兼容模式和安全模式。可以选择消息数据格式:XML 格式(默认)或 JSON 格式。

模式的选择与服务器配置在提交后都会立即生效,请开发者谨慎填写及选择。切换加密方式和数据格式需要提前配置好相关代码,详情请参考 消息加解密说明

第二步:验证消息的确来自微信服务器

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

参数描述
signature微信加密签名,signature结合了开发者填写的 token 参数和请求中的 timestamp 参数、nonce参数。
timestamp时间戳
nonce随机数
echostr随机字符串

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

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

验证 URL 有效性成功后即接入生效。

检验 signature 的PHP示例代码:

private function checkSignature()
{
    $signature = $_GET["signature"];
    $timestamp = $_GET["timestamp"];
    $nonce = $_GET["nonce"];

    $token = TOKEN;
    $tmpArr = array($token, $timestamp, $nonce);
    sort($tmpArr, SORT_STRING);
    $tmpStr = implode( $tmpArr );
    $tmpStr = sha1( $tmpStr );

    if ($tmpStr == $signature ) {
        return true;
    } else {
        return false;
    }
}

PHP示例代码下载:下载

第三步:接收消息和事件

当某些特定的用户操作引发事件推送时(如用户资料变更时),微信服务器会将消息(或事件)的数据包以 POST 请求发送到开发者配置的 URL,开发者可以依据自身业务逻辑进行响应。事件类型消息推荐使用 FromUserName + CreateTime 排重。

服务器收到请求必须做出下述回复,这样微信服务器才不会对此作任何处理,并且不会发起重试。详见下面说明:

  1. 直接回复success(推荐方式)
  2. 直接回复空串(指字节长度为0的空字符串,而不是结构体中 content 字段的内容为空)

微信开放平台 微信登录功能 /移动应用授权用户信息变更

微信开放平台 微信登录功能 /移动应用授权用户信息变更

授权用户信息变更

1、 授权用户资料变更:当部分用户的资料存在风险时,平台会对用户资料进行清理,并通过消息推送服务器通知最近30天授权过的开放平台开发者,我们建议开发者留意响应该事件,及时主动更新或清理用户的头像及昵称,降低风险。
2、 授权用户资料撤回:当用户撤回授权信息时,平台会通过消息推送服务器通知给开放平台开发者,请开发者注意及时删除用户信息。
3、 授权用户完成注销:当授权用户完成注销后,平台会通过消息推送服务器通知给开放平台开发者,请依法依规及时履行相应个人信息保护义务,保护用户权益。
点击查看消息推送服务器配置

事件推送示例:

XML

<xml>
    <ToUserName><![CDATA[gh_870882ca4b1]]></ToUserName>
    <FromUserName><![CDATA[owAqB1v0ahK_Xlc7GshIDdf2yf7E]]></FromUserName>
    <CreateTime>1626857200</CreateTime>
    <MsgType><![CDATA[event]]></MsgType>
    <Event><![CDATA[user_authorization_revoke]]></Event>
    <OpenID><![CDATA[owAqB1nqaOYYWl0Ng484G2z5NIwU]]></OpenID>
    <AppID><![CDATA[wx13974bf780d3dc89]]></AppID>
    <RevokeInfo><![CDATA[1]]></RevokeInfo>
</xml>

JSON

{
"ToUserName": "gh_870882ca4b1",
"FromUserName": "oaKk346BaWE-eIn4oSRWbaM9vR7s",
"CreateTime": 1627359464,
"MsgType": "event",
"Event": "user_authorization_revoke",
" OpenID": "oaKk343WOktAaT2ygsX138BGblrg",
" AppID": "wx13974bf780d3dc89",
" RevokeInfo": "301",
}

事件字段定义

属性类型说明
ToUserNamestring移动应用的UserName
FromUserNamestring平台推送服务UserName
MsgTypestring默认为:Event
Eventstringuser_info_modified:用户资料变更,user_authorization_revoke:用户撤回,user_authorization_cancellation:用户完成注销;
CreateTimenumber发送时间
OpenIDstring授权用户OpenID
AppIDstring移动应用的AppID
RevokeInfostring用户撤回的授权信息,301:用户撤回移动应用所有授权信息

微信开放平台微信登录功能 /移动应用扫码登录

微信开放平台微信登录功能 /移动应用扫码登录

功能概述

扫码登录能力,指的是开发者可在移动应用内使用此能力,拉取二维码,用户使用微信客户端扫描二维码后可以登录此移动应用。此能力可被应用在多设备登录、智能硬件、电视盒子等场景。

iOS 扫码授权获得 Code 流程

步骤一:请求函数

(BOOL)Auth:(NSString *)appId nonceStr:(NSString *)nonceStr timeStamp:(NSString*)timeStamp scope:(NSString *) scope signature:(NSString *)signature schemeData:(NSString *)schemeData;

参数说明

参数是否必须说明
appid应用唯一标识
scope应用授权作用域,拥有多个作用域用逗号(,)分隔,APP 所拥有的 scope
nonceStr一个随机的尽量不重复的字符串,用来使得每次的 signature 不同
timeStamp时间戳
signature签名
schemeData会在扫码后拼在 scheme 后

步骤二:监听二维码回调,回调的时候显示二维码

 (void)onAuthGotQrcode:(UIImage *)image;  //得到二维码

步骤三:用户确认登录之后回调 authCode

-(void)onAuthFinish:(int)errCode AuthCode:(NSString *)authCode;    //成功登录

Android 扫码授权流程

流程

首先 APP 通过 IDiffDevOAuth.auth()接口发起授权,然后在 OAuthListener.onAuthGotQrcode()回调接口中获取二维码,在 APP 中展示二维码,最后用户通过微信扫码,授权.

接口

IDiffDevOAuth

boolean auth(String appId, String scope, String noncestr, String timestamp, String signature, OAuthListener listener)

参数说明

参数是否必须说明
appId应用唯一标识
scope应用授权作用域,拥有多个作用域用逗号(,)分隔,APP 所拥有的 scope
noncestr一个随机的尽量不重复的字符串,用来使得每次的 signature 不同
timestamp时间戳
signature签名
listener授权流程的回调接口

OAuthListener

/**
 * auth之后返回的二维码接口
 *
 * @param qrcodeImgPath 废弃
 * @param imgBuf 二维码图片数据
 */
void onAuthGotQrcode(String qrcodeImgPath, byte[] imgBuf);

/**
 * 用户扫描二维码之后,回调改接口
 */
void onQrcodeScanned();

/**
 * 用户点击授权后,回调改接口
 */
void onAuthFinish(OAuthErrCode errCode, String authCode);

SDK 扫码登录签名算法

获取 Ticket

生成签名之前必须先获取对应的 sdk_ticket。

sdk_ticket 是用于生成签名的临时票据。正常情况下,sdk_ticket 的有效期为 7200 秒,通过 access_token 来获取。由于获取 sdk_ticket 的 api 调用次数非常有限,频繁刷新 sdk_ticket 会导致 api 调用受限,影响自身业务,开发者需在自己的服务存储与更新 sdk_ticket。

1.参考以下文档,使用 APP 的 Appid 和 AppSecret 获取 access_token 获取 access_token,:

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183

2.用第一步拿到的 access_token 采用 http GET 方式请求获得 sdk_ticket:

https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=2

成功返回如下 JSON:

{
  "errcode": 0,

  "errmsg": "ok",

  "ticket": "-p3A5zVP95IuafPhzA6lRR95_F9nZEBfJ_n4E9t8ZFWKJTDPOwccVQhHCwDBmvLkayF_jh-m9HOExhumOziDWA",

  "expires_in": 7200
}

获得 sdk_ticket 之后,就可以生成扫码登录的签名了。

签名生成

签名生成规则如下:

参与签名的字段包括第三方 appid,noncestr(随机字符串), 有效的 sdk_ticket, timestamp(时间戳) 。

对所有待签名参数按照字段名(即key)的 ASCII 码从小到大排序(字典序)后,使用 URL 键值对的格式(即 key1=value1&key2=value2…)拼接成字符串 string1。 这里需要注意的是所有参数名均为小写字符。 对 string1 作 sha1 加密,字段名和字段值都采用原始值,不进行 URL 转义。即 signature=sha1(string1)。

示例

appid=wxappid

sdk_ticket=-p3A5zVP95IuafPhzA6lRR95_F9nZEBfJ_n4E9t8ZFWKJTDPOwccVQhHCwDBmvLkayF_jh-m9HOExhumOziDWA

noncestr=noncestr

timestamp=1417508194

1.对所有待签名参数按照字段名(即key)的 ASCII 码从小到大排序(字典序)

appid、noncestr、sdk_ticket、timestamp

2.使用 URL 键值对的格式(即 key1=value1&key2=value2…)拼接成字符串 string1:

appid=wxappid&noncestr=noncestr&sdk_ticket=-p3A5zVP95IuafPhzA6lRR95_F9nZEBfJ_n4E9t8ZFWKJTDPOwccVQhHCwDBmvLkayF_jh-m9HOExhumOziDWA&timestamp=1417508194

3.对 string1 进行 sha1 签名,得到 signature: 429eaaa13fd71efbc3fd344d0a9a9126835e7303

微信登录功能 /授权后接口调用(UnionID)

通过 code 获取 access_token

接口说明

通过 code 获取 access_token 的接口。

请求说明

GET 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"
}
参数说明
access_token接口调用凭证
expires_inaccess_token 接口调用凭证超时时间,单位(秒)
refresh_token用户刷新 access_token
openid授权用户唯一标识
scope用户授权的作用域,使用逗号(,)分隔

错误返回样例:

{
  "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 失效的后,需要用户重新授权后才可以继续获取用户头像昵称。

请求方法

使用/sns/oauth2/access_token 接口获取到的 refresh_token 进行以下接口调用:

GET 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"
}

接口说明

检验授权凭证(access_token)是否有效

请求说明

GET https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID

参数说明

参数是否必须说明
access_token调用接口凭证
openid普通用户标识,对该公众帐号唯一

返回说明

正确的 Json 返回结果:

{
  "errcode": 0,
  "errmsg": "ok"
}

错误的 Json 返回示例:

{
  "errcode": 40003,
  "errmsg": "invalid openid"
}

获取用户个人信息(UnionID 机制)

接口说明

此接口用于获取用户个人信息。开发者可通过 OpenID 来获取用户基本信息。特别需要注意的是,如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的 unionid 来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号,用户的 unionid 是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid 是相同的。请注意,在用户修改微信头像后,旧的微信头像 URL 将会失效,因此开发者应该自己在获取用户信息后,将头像图片保存下来,避免微信头像 URL 失效后的异常情况。

请求说明

GET https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID

参数说明

参数是否必须说明
access_token调用凭证
openid普通用户的标识,对当前开发者帐号唯一
lang国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语,默认为 en

返回说明

正确的 Json 返回结果:

{
  "openid": "OPENID",
  "nickname": "NICKNAME",
  "sex": 1,
  "province": "PROVINCE",
  "city": "CITY",
  "country": "COUNTRY",
  "headimgurl": "https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
  "privilege": ["PRIVILEGE1", "PRIVILEGE2"],
  "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
参数说明
openid普通用户的标识,对当前开发者帐号唯一
nickname普通用户昵称
sex普通用户性别,1 为男性,2 为女性
province普通用户个人资料填写的省份
city普通用户个人资料填写的城市
country国家,如中国为 CN
headimgurl用户头像,最后一个数值代表正方形头像大小(有 0、46、64、96、132 数值可选,0 代表 640*640 正方形头像),用户没有头像时该项为空
privilege用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)
unionid用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的 unionid 是唯一的。

建议:

开发者最好保存 unionID 信息,以便以后在不同应用之间进行用户信息互通。

错误的 Json 返回示例:

{
  "errcode": 40003,
  "errmsg": "invalid openid"
}

调用频率限制

接口名频率限制
通过 code 换取 access_token5 万/分钟
获取用户基本信息5 万/分钟
刷新 access_token10 万/分钟

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

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

准备工作

移动应用微信登录是基于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.开放平台移动应用微信登录目前是否收费?

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

APP接入微信原生支付APP支付开发指引

APP接入微信原生支付APP支付开发指引

1. 接口规则

为了在保证支付安全的前提下,带给商户简单、一致且易用的开发体验,我们推出了全新的微信支付APIv3接口。该版本API的具体规则请参考“APIv3接口规则
备注:当前接口用于微信国内钱包

2. 开发准备

2.1. 搭建和配置开发环境

为了帮助开发者调用开放接口,我们提供了JAVA、PHP、GO三种语言版本的开发库,封装了签名生成、签名验证、敏感信息加/解密、媒体文件上传等基础功能(更多语言版本的开发库将在近期陆续提供

测试步骤

1、根据自身开发语言,选择对应的开发库并构建项目,具体配置请参考下面链接的详细说明:

    • wechatpay-java(推荐)wechatpay-apache-httpclient,适用于Java开发者。

    • wechatpay-php(推荐)、wechatpay-guzzle-middleware,适用于PHP开发者

    注:当前开发指引接口PHP示例代码采用wechatpay-guzzle-middleware版本

    • wechatpay-go,适用于Go开发者

更多资源可前往微信支付开发者社区搜索查看

2、创建加载商户私钥、加载平台证书、初始化httpClient的通用方法


@Before
public void setup() throws IOException {
    // 加载商户私钥(privateKey:私钥字符串)
    PrivateKey merchantPrivateKey = PemUtil
            .loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes("utf-8")));
 
    // 加载平台证书(mchId:商户号,mchSerialNo:商户证书序列号,apiV3Key:V3密钥)
    AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier(
            new WechatPay2Credentials(mchId, new PrivateKeySigner(mchSerialNo, merchantPrivateKey)),apiV3Key.getBytes("utf-8"));
 
    // 初始化httpClient
    httpClient = WechatPayHttpClientBuilder.create()
            .withMerchant(mchId, mchSerialNo, merchantPrivateKey)
            .withValidator(new WechatPay2Validator(verifier)).build();
}
 
@After
public void after() throws IOException {
    httpClient.close();
}

3、基于接口的示例代码,替换请求参数后可发起测试

说明:

• 上面的开发库为微信支付官方开发库,其它没有审核或者控制下的第三方工具和库,微信支付不保证它们的安全性和可靠性

通过包管理工具引入SDK后,可根据下面每个接口的示例代码替换相关参数后进行快速测试

• 开发者如果想详细了解签名生成、签名验证、敏感信息加/解密、媒体文件上传等常用方法的具体代码实现,可阅读下面的详细说明:

    1.签名生成

    2.签名验证

    3.敏感信息加解密

    4.merchantPrivateKey(私钥)

    5.wechatpayCertificates(平台证书)

    6.APIV3Key(V3 key)

• 如想更详细的了解我们的接口规则,可查看我们的接口规则指引文档

2.2. 业务开发配置

2.2.1. 注册APP

APP接入微信支付,需要先将商户APP在微信开放平台进行注册,登记APP开发参数以生成APPID。具体操作步骤如下:

一、登录微信开放平台,进入【管理中心 → 移动应用 → 创建移动应用】;

二、完成基本信息的录入,商户需要在本步骤提交APP对应的下载地址,应用官网,应用水印,icon等业务信息;

三、完成平台信息的录入,商户需要在本步骤提交APP在Android及iOS端对应的开发参数,包括Android端应用的包名,应用签名,iOS端应用的bundle ID, universal link等;

注意:

四、以上信息全部提交完成后,即完成APP的注册,商户可在【管理中心 → 移动应用】中,选择具体的应用查看其APPID及已获得的接口能力;

五、获取到APP的APPID后,需要将该APPID与商户的收款mch_id进行绑定,商户可登录商户平台后前往【产品中心 -> AppID账号管理】界面中进行AppID的绑定及管理,界面如图所示:

2.2.2. iOS开发要点说明

• iOS系统OpenSDK升级指引

由于苹果公司在iOS13系统回收了查询 App bundleID 的能力,导致微信无法保证授权凭证能正确返回给AppID对应的应用。为此,微信支付强烈要求所有商户尽快升级到OpenSDK1.8.6,并让用户及时更新APP,否则安全风险将一直存在。谢谢配合!

详细OpenSDK升级指引请参见:OpenSDK升级指引

注意:OpenSDK升级后请一定按照文档要求完成验证工作,确保OpenSDK升级成功。

• 开发配置:

以下项目开发环境以Xcode6.0,运行环境为IOS7.0为例,说明其开发中需要的操作

  • 一、项目设置APPID商户在微信开放平台申请开发APP应用后,微信开放平台会生成APP的唯一标识APPID。在Xcode中打开项目,设置项目属性中的URL Schemes为您的APPID。如图标红位置所示
  • 二、注册APPID商户APP工程中引入微信lib库和头文件,调用API前,需要先向微信注册您的APPID,代码如下:[WXApi registerApp:@”wxd930ea5d5a258f4f” withDescription:@”demo 2.0″];

•注意:

OpenSDK前端拉起支付及SDK回调的相关说明,请参考OpenSDK调起支付说明

  • 一、后台设置商户在微信开放平台申请开发应用后,微信开放平台会生成APP的唯一标识APPID。由于需要保证支付安全,需要在开放平台绑定商户应用包名和应用签名,设置好后才能正常发起支付。设置界面在【开放平台】中的栏目【管理中心 / 修改应用 / 修改开发信息】里面,如图红框内所示。应用包名:是在APP项目配置文件AndroidManifest.xml中声明的package值,例如上图中的package=”demo.wxpay.tenpay.com”。应用签名:根据项目的应用包名和编译使用的keystore,可由签名工具生成一个32位的md5串,在调试的手机上安装签名工具后,运行可生成应用签名串,如图8.9所示,绿色串即应用签名。点击下载签名生成工具
  • 二、注册APPID商户APP工程中引入微信JAR包,调用API前,需要先向微信注册您的APPID,代码如下:final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);// 将该app注册到微信msgApi.registerApp(“wxd930ea5d5a258f4f”);

•注意:

OpenSDK前端拉起支付及SDK回调的相关说明,OpenSDK调起支付说明

3. 快速接入

3.1. 业务流程图

重点步骤说明:

步骤3:用户下单发起支付,商户可通过微信支付APP下单API创建支付订单。

商户调用APP下单API后,分正常返回和异常返回情况:

  • 正常返回:返回prepay_id,商户可根据返回的prepay_id来生成调用OpenSDK的签名以执行下一步。
  • 异常返回:返回http code或错误码,商户可根据http code列表 或错误码说明来排查原因并执行下一步操作

步骤8: 商户通过APP调起支付OpenSDK调起微信支付,发起支付请求,有关OpenSDK调起支付的详细说明,请参考2.2.2部分的说明

步骤15-19: 用户支付成功后,商户可通过以下两种方式获取订单状态

我们通过以下接口将用户确认订单信息回调通知给商户系统:

方法一:支付结果通知。用户支付成功后,微信支付会将支付成功的结果以回调通知的形式同步给商户,商户的回调地址需要在调用APP下单API时传入notify_url参数。

方法二:当因网络抖动或本身notify_url存在问题等原因,导致无法接收到回调通知时,商户也可主动调用查询订单API 查询订单API来获取订单状态

3.2. API接入(含示例代码)

本文档展示了如何使用微信支付服务端 SDK 快速接入APP支付产品,完成与微信支付对接的部分。

注意:

  • 文档中的代码示例是用来阐述 API 基本使用方法,代码中的示例参数需替换成商户自己账号及参数才能跑通。
  • 以下接入步骤仅提供参考,请商户结合自身业务需求进行评估、修改。
3.2.1. 【服务端】APP下单

步骤说明:用户在商户APP内完成商户选择后进入支付页面,商户需要通过后端请求该APP下单API来获取预支付ID。

示例代码

public void CreateOrder() throws Exception{
  //请求URL
  HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/pay/transactions/app");
  // 请求body参数
  String reqdata = "{"
          + ""time_expire":"2018-06-08T10:34:56+08:00","
          + ""amount": {"
          + ""total":100,"
          + ""currency":"CNY""
          + "},"
          + ""mchid":"1230000109","
          + ""description":"Image形象店-深圳腾大-QQ公仔","
          + ""notify_url":"https://www.weixin.qq.com/wxpay/pay.php","
          + ""out_trade_no":"1217752501201407033233368018","
          + ""goods_tag":"WXG","
          + ""appid":"wxd678efh567hg6787","
          + ""attach":"自定义数据说明","
          + ""detail": {"
          + ""invoice_id":"wx123","
          + ""goods_detail": ["
          + "{"
          + ""goods_name":"iPhoneX 256G","
          + ""wechatpay_goods_id":"1001","
          + ""quantity":1,"
          + ""merchant_goods_id":"商品编码","
          + ""unit_price":828800"
          + "},"
          + "{"
          + ""goods_name":"iPhoneX 256G","
          + ""wechatpay_goods_id":"1001","
          + ""quantity":1,"
          + ""merchant_goods_id":"商品编码","
          + ""unit_price":828800"
          + "}"
          + "],"
          + ""cost_price":608800"
          + "},"
          + ""scene_info": {"
          + ""store_info": {"
          + ""address":"广东省深圳市南山区科技中一道10000号","
          + ""area_code":"440305","
          + ""name":"腾讯大厦分店","
          + ""id":"0001""
          + "},"
          + ""device_id":"013467007045764","
          + ""payer_client_ip":"14.23.150.211""
          + "}"
          + "}";
  StringEntity entity = new StringEntity(reqdata,"utf-8");
  entity.setContentType("application/json");
  httpPost.setEntity(entity);
  httpPost.setHeader("Accept", "application/json");

  //完成签名并执行请求
  CloseableHttpResponse response = httpClient.execute(httpPost);

  try {
      int statusCode = response.getStatusLine().getStatusCode();
      if (statusCode == 200) { //处理成功
          System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));
      } else if (statusCode == 204) { //处理成功,无返回Body
          System.out.println("success");
      } else {
          System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));
          throw new IOException("request failed");
      }
  } finally {
      response.close();
  }
}

重要参数说明

• out_trade_no:商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一

• description:商品描述

• notify_url:支付回调通知URL,该地址必须为直接可访问的URL,不允许携带查询串

• total:订单总金额,单位为分

更多参数、响应详情及错误码请参见APP下单API接口文档

步骤说明:通过APP下单API成功获取预支付交易会话标识(prepay_id)后,需要通过OpenSDK来调起微信支付收银台

  • 该步骤请使用开放平台的官方OpenSDK:
    IOS OpenSDK下载地址
    Android OpenSDK下载地址
  • SDK的调用需要携带签名(参与签名的参数为:appid、partnerid、prepayid、package、noncestr、timestamp,参数区分大小写)
  • 重要入参说明:
    • package:取固定值Sign=WXPay
    • signType:该接口V3版本仅支持RSA
    • paySign:签名

iOS SDK调用说明

  • 一、拉起支付商户服务器生成支付订单,先调用APP下单API生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。以下是调起微信支付的关键代码:PayReq *request = [[[PayReq alloc] init] autorelease]; request.partnerId = @"10000100"; request.prepayId= @"1101000000140415649af9fc314aa427"; request.package = @"Sign=WXPay"; request.nonceStr= @"a462b76e7436e98e0ed6e13c64b4fd1c"; request.timeStamp= @"1397527777"; request.sign= @"582282D72DD2B03AD892830965F428CB16E7A256"; [WXApi sendReq:request] 注意:该sign生成字段名列表见调起支付API
  • 二、SDK结果回调按照微信SDK Sample,在类实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码, 如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意 一定不能以客户端返回作为用户支付的结果,应以服务器端接收的支付通知或查询API返回的结果为准。代码示例如下:-(void)onResp:(BaseResp*)resp{ if ([respisKindOfClass:[PayRespclass]]){ PayResp*response=(PayResp*)resp; switch(response.errCode){ caseWXSuccess: //服务器端查询支付通知或查询API返回的结果再提示成功 NSlog(@"支付成功"); break; default: NSlog(@"支付失败,retcode=%d",resp.errCode); break; } } }回调中errCode值列表:名称描述解决方案-2用户取消无需处理。发生场景:用户不支付了,点击取消,返回APP。0成功展示成功页面-1错误可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。

Android SDK调用说明

  • 一、SDK拉起支付商户服务器生成支付订单,先调用APP下单API生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。以下是调起微信支付的关键代码:IWXAPI api; PayReq request = new PayReq(); request.appId = "wxd930ea5d5a258f4f"; request.partnerId = "1900000109"; request.prepayId= "1101000000140415649af9fc314aa427",; request.packageValue = "Sign=WXPay"; request.nonceStr= "1101000000140429eb40476f8896f4c9"; request.timeStamp= "1398746574"; request.sign= "7FFECB600D7157C5AA49810D2D8F28BC2811827B"; api.sendReq(request);注意:该sign生成字段名列表见调起支付API
  • 二、支付结果回调参照微信SDK Sample,在net.sourceforge.simcpux.wxapi包路径中实现WXPayEntryActivity类(包名或类名不一致会造成无法回调),在WXPayEntryActivity类中实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码, 如果支付成功则去后台查询支付结果再展示用户实际支付结果。注意一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。代码示例如下:publicvoidonResp(BaseRespresp){ if(resp.getType()==ConstantsAPI.COMMAND_PAY_BY_WX){ Log.d(TAG,"onPayFinish,errCode="+resp.errCode); AlertDialog.Builderbuilder=newAlertDialog.Builder(this); builder.setTitle(R.string.app_tip); } }回调中errCode值列表:名称描述解决方案0成功展示成功页面-1错误可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。-2用户取消无需处理。发生场景:用户不支付了,点击取消,返回APP。
3.2.3.【服务端】接收支付结果通知

步骤说明:当用户完成支付,微信会把相关支付结果将通过异步回调的方式通知商户,商户需要接收处理,并按文档规范返回应答

注意

  • 支付结果通知是以POST 方法访问商户设置的通知url,通知的数据以JSON 格式通过请求主体(BODY)传输。通知的数据包括了加密的支付结果详情
  • 加密不能保证通知请求来自微信。微信会对发送给商户的通知进行签名,并将签名值放在通知的HTTP头Wechatpay-Signature。商户应当验证签名,以确认请求来自微信,而不是其他的第三方。签名验证的算法请参考 《微信支付API v3签名验证》
  • 支付通知http应答码为200或204才会当作正常接收,当回调处理异常时,应答的HTTP状态码应为500,或者4xx
  • 商户成功接收到回调通知后应返回成功的http应答码为200或204
  • 同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。 推荐的做法是,当商户系统收到通知进行处理时,先检查对应业务数据的状态,并判断该通知是否已经处理。如果未处理,则再进行处理;如果已处理,则直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱
  • 对后台通知交互时,如果微信收到商户的应答不符合规范或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。(通知频率为15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h – 总计 24h4m)

更多参数、响应详情及错误码请参见 JSAPI / APP / H5 / Native / 小程序支付通知API接口文档

3.2.4. 【服务端】查询订单

步骤说明:当商户后台、网络、服务器等出现异常,商户系统最终未接收到支付通知时,商户可通过查询订单接口核实订单支付状态

示例代码(通过微信订单号查询):


public void QueryOrder() throws Exception {
   
  //请求URL
  URIBuilder uriBuilder = new URIBuilder("https://api.mch.weixin.qq.com/v3/pay/transactions/id/4200000745202011093730578574");
  uriBuilder.setParameter("mchid", mchId);
 
  //完成签名并执行请求
  HttpGet httpGet = new HttpGet(uriBuilder.build());
  httpGet.addHeader("Accept", "application/json");
  CloseableHttpResponse response = httpClient.execute(httpGet);
   
  try {
      int statusCode = response.getStatusLine().getStatusCode();
      if (statusCode == 200) {
          System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));
      } else if (statusCode == 204) {
          System.out.println("success");
      } else {
          System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));
          throw new IOException("request failed");
      }
  } finally {
      response.close();
  }
}
      

注意:

  • 查询订单可通过微信支付订单号商户订单号两种方式查询,两种查询方式返回结果相同

更多参数、响应详情及错误码请参见 JSAPI / APP / H5 / Native / 小程序查询订单API接口文档

3.2.5. 【服务端】关闭订单

步骤说明:当商户订单支付失败需要生成新单号重新发起支付,要对原订单号调用关单,避免重复支付;系统下单后,用户支付超时,系统退出不再受理,避免用户继续,请调用关单接口

示例代码


  public void CloseOrder() throws Exception {
     
    //请求URL
    HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/sdkphp12345678920201028112429/close");
    //请求body参数
    String reqdata ="{"mchid": ""+mchId+""}";
     
    StringEntity entity = new StringEntity(reqdata,"utf-8");
    entity.setContentType("application/json");
    httpPost.setEntity(entity);
    httpPost.setHeader("Accept", "application/json");
   
  //完成签名并执行请求
    CloseableHttpResponse response = httpClient.execute(httpPost);
    try {
        int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode == 200) {
            System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));
        } else if (statusCode == 204) {
            System.out.println("success");
        } else {
            System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));
            throw new IOException("request failed");
        }
    } finally {
        response.close();
    }
  }
  

注意

  • 订单生成后不能马上调用关单接口,最短调用时间间隔为5分钟
  • 已支付成功的订单不能关闭

更多参数、响应详情及错误码请参见 JSAPI / APP / H5 / Native / 小程序接口文档

3.2.6. 【服务端】申请交易账单

步骤说明:微信支付按天提供交易账单文件,商户可以通过该接口获取账单文件的下载地址

示例代码


public void TradeBill() throws Exception {
   
  //请求URL
  URIBuilder uriBuilder = new URIBuilder("https://api.mch.weixin.qq.com/v3/bill/tradebill");
  uriBuilder.setParameter("bill_date", "2020-11-09");
  uriBuilder.setParameter("bill_type", "ALL");
 
  //完成签名并执行请求
  HttpGet httpGet = new HttpGet(uriBuilder.build());
  httpGet.addHeader("Accept", "application/json");
  CloseableHttpResponse response = httpClient.execute(httpGet);
 
  try {
      int statusCode = response.getStatusLine().getStatusCode();
      if (statusCode == 200) {
          System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));
      } else if (statusCode == 204) {
          System.out.println("success");
      } else {
          System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));
          throw new IOException("request failed");
      }
  } finally {
      response.close();
  }
}

注意

更多参数、响应详情及错误码请参见 JSAPI / APP / H5 / Native / 小程序接口文档

3.2.7. 【服务端】下载账单

步骤说明:通过申请交易账单接口获取到账单下载地址(download_url)后,再通过该接口获取到对应的账单文件,文件内包含交易相关的金额、时间、营销等信息,供商户核对订单、退款、银行到账等情况

示例代码


public void DownloadUrl(String download_url) throws Exception{
  PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(new ByteArrayInputStream(privateKey.getBytes("utf-8")));
   
  //初始化httpClient
  //该接口无需进行签名验证、通过withValidator((response) -> true)实现
  httpClient =  WechatPayHttpClientBuilder.create().withMerchant(mchId, mchSerialNo, merchantPrivateKey).withValidator((response) -> true).build();
   
  //请求URL
  //账单文件的下载地址的有效时间为30s
  URIBuilder uriBuilder = new URIBuilder(download_url);
  HttpGet httpGet = new HttpGet(uriBuilder.build());
  httpGet.addHeader("Accept", "application/json");
   
  //执行请求
  CloseableHttpResponse response = httpClient.execute(httpGet);
  try {
      int statusCode = response.getStatusLine().getStatusCode();
      if (statusCode == 200) {
          System.out.println("success,return body = " + EntityUtils.toString(response.getEntity()));
      } else if (statusCode == 204) {
          System.out.println("success");
      } else {
          System.out.println("failed,resp code = " + statusCode+ ",return body = " + EntityUtils.toString(response.getEntity()));
          throw new IOException("request failed");
      }
  } finally {
      response.close();
  }
}

注意

• 账单文件的下载地址的有效时间为30s

• 强烈建议商户将实际账单文件的哈希值和之前从接口获取到的哈希值进行比对,以确认数据的完整性

更多参数、响应详情及错误码请参见 JSAPI / APP / H5 / Native / 小程序下载账单API接口文档

4. 常见问题

Q:微信APP支付,前端调起的时候返回errcode = -1该如何排查?

A:1. 查看APP下单参数返回是否正常,是否有正确的在调用SDK前获取了正确的prepay_id;

  •  2.查看调用SDK签名是否正确,请注意以下几点:
  • 3. 检查客户端调用sendReq(PayReq)对象赋值的正确性(必要时让商户提供数据),若通过异步获取到后台数据,比如data对象是通过异步请求得到的对象:request.appId = data.appid; 实际appid属性值为空;
  • 4. 检查对应的开发配置,包括iOS的appid配置,Android的包名及包签名设置。
Q:app调用“唤起支付api”返回:商户支付下单id非法

A:请确认唤起支付参数字段名是否与文档的一致。

Q:服务商模式下,调用APP下单接口,返回“特殊子商户未授权的产品权限”

A:APP支付需要进行单独的授权开通才可使用,请前往服务商平台子商户管理中找到对应的子商户授权服务商APP支付权限。

Q:调用APP下单接口,返回“sub_appid与sub_mch_id不匹配”

A:在调用APP下单接口前,需保证子商户号与子商户APP的appid存在绑定关系,请服务商前往服务商平台的子商户管理页面中操作绑定。

微信开放平台微信支付功能 /微信APP支付接入商户服务中心

微信开放平台微信支付功能 /微信APP支付接入商户服务中心

1. 申请流程指引

1.1 申请流程图

1.2 申请接入步骤详细说明

1.2.1 到微信开放平台添加移动应用

目前仅对已通过认证的开发者创建的移动应用开放申请,请登录微信开放平台 ,添加移动应用,等待审核。

1.2.2 申请支付功能,提交相关资料

审核通过后,可在管理中心 – 移动应用,为通过审核的移动应用申请支付功能;

1)填写资料:根据页面提示,分别填写应用基本资料、企业审核资料和财务审核资料

每一步填写所需的材料均会在填写前给予相应提示,您可提前进行准备,以加快填写和审批速度。

2)等待审核:微信团队会在 7 个工作日给出审核结果,结果会发送到开放平台通知中心邮箱中;

通知中心:(登录后页面右上角)

通过审核后,商户将收到邮件通知,邮件中包含商户号和登录密码,请牢记申请时填写的邮箱地址。

1.2.3 验证结算账户,在线签署协议

1)验证账户,签署协议:

微信支付会向申请时提交的结算账户汇入一笔金额随机的验证款,登录商户平台 回填验证款,并签署在线协议,开启结算功能。

2)开始开发工作:

开发文档:微信支付 App 支付开发文档

2. 开放类目及资费标准

移动应用申请接入微信 APP 支付,商户使用微信支付服务时,需按照腾讯规定的标准交纳微信支付手续费。费率及收费方式参见经营范围 。

3. 常见商户接入问题

3.1 我提交完申请资料之后一直没有通过审核,为什么?

在收到商户提交的申请资料之后,微信审核团队会在 7 个工作日以内通知审核结果。若审核被驳回,商户可登录微信开放平台查看驳回原因,请根据驳回原因调整填写内容,并再次提交,微信审核团队将继续进行审核。

3.2 个人开发的移动应用可以申请微信 APP 支付吗?

仅接受公司主体的移动应用申请微信 APP 支付权限。

3.3 交纳的支付手续费,会否开具发票或收据吗?

会开具支付手续费发票。

微信分享与收藏功能 Android开发手册

微信分享与收藏功能 Android开发手册

开发者在 App 中在集成微信 SDK 后,可调用接口实现,以下依次是文字、图片、视频、网页、小程序、音乐视频类型分享的示例。如果分享的消息中涉及文件路径(如图片类型消息),建议开发者针对 Android 7.0 版本及以上设备,判断微信版本支持的情况下,更新为 FileProvider 的方式进行分享。详情查阅《OpenSDK 支持 FileProvider 方式分享文件到微信文档》

WXMediaMessage (微信媒体消息内容)说明

字段类型含义备注
sdkVerintsdk 版本号
titleString消息标题限制长度不超过 512Bytes
descriptionString消息描述限制长度不超过 1KB
thumbDatabyte[]缩略图的二进制数据限制内容大小不超过 32KB
mediaObjectWXMediaMessage.IMediaObject消息对象用于描述一个媒体对象的接口,媒体对象包括:
WXTextObject、WXImageObject、WXVideoObject、WXWebpageObject、 WXFileObject、WXAppExtendObject、WXMiniProgramObject 等

SendMessageToWX.Req(SendMessageToWX请求类)

分享或收藏的目标场景,通过修改 SendMessageToWX.Req 的scene字段实现。

字段类型含义备注
messageWXMediaMessage
sceneint发送的目标场景分享到对话:
SendMessageToWX.Req.WXSceneSession
分享到朋友圈:
SendMessageToWX.Req.WXSceneTimeline ;
分享到收藏:
SendMessageToWX.Req.WXSceneFavorite
transactionString对应该请求的事务 ID,通常由 Req 发起,回复 Resp 时应填入对应事务 ID

示例

一、文字类型分享示例

WXTextObject (WXMediaMessage.IMediaObject 的派生类,用于描述一个文本对象)

字段类型含义备注
textString文本数据长度需大于 0 且不超过 10KB

文字类型分享demo

//初始化一个 WXTextObject 对象,填写分享的文本内容
WXTextObject textObj = new WXTextObject();
textObj.text = text;

//用 WXTextObject 对象初始化一个 WXMediaMessage 对象
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = textObj;
msg.description = text;

SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("text");
req.message = msg;
req.scene = mTargetScene;
//调用 api 接口,发送数据到微信
api.sendReq(req);

二、图片类型分享示例

WXImageObject (WXMediaMessage.IMediaObject 的派生类,用于描述一个图片对象)

字段类型含义备注
imageDatabyte[]图片的二进制数据内容大小不超过 1MB
imagePathString图片的本地路径对应图片内容大小不超过 25MB

图片类型分享demo

Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.send_img);

//初始化 WXImageObject 和 WXMediaMessage 对象
WXImageObject imgObj = new WXImageObject(bmp);
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = imgObj;

//设置缩略图
Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, THUMB_SIZE, THUMB_SIZE, true);
bmp.recycle();
msg.thumbData = Util.bmpToByteArray(thumbBmp, true);

//构造一个Req
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("img");
req.message = msg;
req.scene = mTargetScene;
req.userOpenId = getOpenId();
//调用 api 接口,发送数据到微信
api.sendReq(req);

三、视频类型分享示例

WXVideoObject (WXMediaMessage.IMediaObject 的派生类,用于描述一个视频对象)

字段类型含义备注
videoUrlString视频链接限制长度不超过 10KB
videoLowBandUrlString供低带宽的环境下使用的视频链接限制长度不超过 10KB

注意:videoUrl 和 videoLowBandUrl 不能同时为空

视频类型分享 demo:

//初始化一个WXVideoObject,填写url
WXVideoObject video = new WXVideoObject();
video.videoUrl ="视频url";

//用 WXVideoObject 对象初始化一个 WXMediaMessage 对象
WXMediaMessage msg = new WXMediaMessage(video);
msg.title ="视频标题";
msg.description ="视频描述";
Bitmap thumbBmp = BitmapFactory.decodeResource(getResources(), R.drawable.send_music_thumb);
msg.thumbData =Util.bmpToByteArray(thumbBmp,true);

//构造一个Req
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("video");
req.message =msg;
req.scene = mTargetScene;
req.userOpenId = getOpenId();

//调用 api 接口,发送数据到微信
api.sendReq(req);

四、网页类型分享示例

WXWebpageObject (WXMediaMessage.IMediaObject 的派生类,用于描述一个网页对象)

字段类型含义备注
webpageUrlStringhtml 链接限制长度不超过 10KB
//初始化一个WXWebpageObject,填写url
WXWebpageObject webpage = new WXWebpageObject();
webpage.webpageUrl ="网页url";

//用 WXWebpageObject 对象初始化一个 WXMediaMessage 对象
WXMediaMessage msg = new WXMediaMessage(webpage);
msg.title ="网页标题 ";
msg.description ="网页描述";
Bitmap thumbBmp = BitmapFactory.decodeResource(getResources(), R.drawable.send_music_thumb);
msg.thumbData =Util.bmpToByteArray(thumbBmp, true);

//构造一个Req
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("webpage");
req.message =msg;
req.scene =mTargetScene;
req.userOpenId = getOpenId();

//调用 api 接口,发送数据到微信
api.sendReq(req);

五、小程序类型分享示例

WXMiniProgramObject (WXMediaMessage.IMediaObject 的派生类,用于描述一个小程序对象)

字段类型含义备注
webpageUrlString兼容低版本的网页链接限制长度不超过 10KB
userNameString小程序的原始 id小程序原始 ID 获取方法:登录小程序管理后台 – 设置 – 基本设置 – 帐号信息
pathString小程序的 path小程序页面路径;对于小游戏,可以只传入 query 部分,来实现传参效果,如:传入 “?foo=bar”
withShareTicketboolean是否使用带 shareTicket 的分享通常开发者希望分享出去的小程序被二次打开时可以获取到更多信息,例如群的标识。可以设置 withShareTicket 为 true,当分享卡片在群聊中被其他用户打开时,可以获取到 shareTicket,用于获取更多分享信息。详见小程序获取更多分享信息 ,最低客户端版本要求:6.5.13
miniprogramTypeint小程序的类型,默认正式版正式版: WXMiniProgramObject.MINIPTOGRAM_TYPE_RELEASE;
测试版: WXMiniProgramObject.MINIPROGRAM_TYPE_TEST;
预览版: WXMiniProgramObject.MINIPROGRAM_TYPE_PREVIEW
WXMiniProgramObject miniProgramObj = new WXMiniProgramObject();
miniProgramObj.webpageUrl = "http://www.qq.com"; // 兼容低版本的网页链接
miniProgramObj.miniprogramType = WXMiniProgramObject.MINIPTOGRAM_TYPE_RELEASE;// 正式版:0,测试版:1,体验版:2
miniProgramObj.userName = "gh_d43f693ca31f";     // 小程序原始id
miniProgramObj.path = "/pages/media";            //小程序页面路径;对于小游戏,可以只传入 query 部分,来实现传参效果,如:传入 "?foo=bar"
WXMediaMessage msg = new WXMediaMessage(miniProgramObj);
msg.title = "小程序消息Title";                    // 小程序消息title
msg.description = "小程序消息Desc";               // 小程序消息desc
msg.thumbData = getThumb();                      // 小程序消息封面图片,小于128k

SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("miniProgram");
req.message = msg;
req.scene = SendMessageToWX.Req.WXSceneSession;  // 目前只支持会话
api.sendReq(req);

六、音乐视频类型分享示例

WXMusicVideoObject(WXMediaMessage.IMediaObject 的派生类,用于描述一个音乐视频对象),Android SDK 6.6.20 及以上版本支持

字段类型含义备注
musicUrlString音频网页的 URL 地址必填,不能为空,限制长度不超过 10KB
musicDataUrlString音频数据的 URL 地址必填,不能为空,限制长度不超过 10KB
singerNameString歌手名必填,不能为空,限制长度不超过1KB
durationInt歌曲时长必填,单位:毫秒
songLyricString歌词建议填写,限制长度不超过32KB
hdAlbumThumbFilePathString高清专辑图本地文件路径选填,文件限制长度不超过1MB
albumNameString音乐专辑名选填
musicGenreString音乐流派选填
issueDateLong发行时间 Unix 时间戳选填,单位:秒
identificationString音乐标识符建议填写,用户在微信音乐播放器跳回应用时会携带该参数,可用于唯一标识一首歌,微信侧不理解
WXMusicVideoObject musicVideo = new WXMusicVideoObject();
musicVideo.musicUrl = "https://www.qq.com";	 // 音乐url
musicVideo.musicDataUrl="http://xxx/xx.mp3"; // 音乐音频url
musicVideo.songLyric = "xxx";	// 歌词
musicVideo.hdAlbumThumbFilePath = "xxx";	 // 专辑图本地文件路径
musicVideo.singerName = "xxx";
musicVideo.albumName = "album_xxx";
musicVideo.musicGenre = "流行歌曲";
musicVideo.issueDate = 1610713585;
musicVideo.identification = "sample_identification";
musicVideo.duration = 120000;	// 单位为毫秒

WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = musicVideo;
msg.title = "歌曲名称";	// 必填,不能为空
msg.description = "歌曲描述";  // 选填,建议与歌手名字段 singerName 保持一致
msg.messageExt = "额外信息";   // 微信跳回应用时会带上
msg.thumbData = getThumb();   // 音乐卡片缩略图,不超过64KB

SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("musicVideo");
req.message = msg;
req.scene = SendMessageToWX.Req.WXSceneSession;	// 支持会话、朋友圈、收藏
api.sendReq(req);

处理从微信返回到第三方应用,监听com.tencent.mm.opensdk.openapi.IWXAPIEventHandler#onReq回调,处理示例如下:

@Override
public void onReq(BaseReq req) {
	switch (req.getType()) {
		case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
			goToShowMsg((ShowMessageFromWX.Req) req);
			break;
		default:
			break;
    }
}

private void goToShowMsg(ShowMessageFromWX.Req showReq) {
		WXMediaMessage wxMsg = showReq.message;
		if (wxMsg.mediaObject instanceof WXMusicVideoObject) {
			WXMusicVideoObject musicVideoObject = (WXMusicVideoObject) wxMsg.mediaObject;
			String identification = musicVideoObject.identification;	// 分享到微信时的音乐标识符字段
			String messageExt = wxMsg.messageExt;	//分享到微信时传的额外信息字段
          	// 应用根据 identification 与messageExt自行处理
		}
}

音乐视频类型使用说明:

  1. 注意事项:
    • 音乐视频类型与音乐类型不同,分享至微信的音乐视频消息,直接点击好友会话或朋友圈下的分享内容会跳转到微信原生播放器,可以对音乐作品辅以视频制作成音乐视频,进行点赞、评论、发送给朋友、分享到朋友圈、发布至视频号等。
    • 在播放器里点击跳转入口会跳转回App,没有安装 App 时会打开 musicUrl 链接。
  2. 音乐视频类型分享,请开发者特别注意必填的字段有:
    • WXMediaMessage.title:歌曲名称
    • WXMusicVideoObject.musicUrl:音频网页的 URL 地址
    • WXMusicVideoObject.musicDataUrl:音频数据的 URL 地址
    • WXMusicVideoObject.singerName:歌手名
    • WXMusicVideoObject.duration:歌曲时长,单位为毫秒
  3. 第三方应用在分享时设置的字段 WXMediaMessage.messageExt 字段与WXMusicVideoObject.identification 需要保证 Android 与iOS平台是一致的,否则跨平台分享的消息跳转回应用无法保证能够跳转到对应歌曲。
  4. 微信跳转到第三方应用,应用处理 IWXAPIEventHandler.onReq 回调时需要判断WXMediaMessage.mediaObject 的类型进行对应的处理,并且异常情况下也能处理 WXEntryActivity 的关闭,否则可能会导致拉起应用后无法点击操作的问题;无论 WXMediaMessage.mediaObject 类型是什么,WXMediaMessage.messgeExt 字段均会透传是应用在分享时写入的数据,应用可使用该字段进行应用低版本的兼容处理。

注意事项

  1. 发起分享的 App 与小程序属于同一微信开放平台帐号。
  2. 支持分享小程序类型消息至会话,暂不支持分享至朋友圈。
  3. 若客户端版本低于 6.5.6 或在 iPad 客户端接收,小程序类型分享将自动转成网页类型分享。开发者必须填写网页链接字段,确保低版本客户端能正常打开网页链接。
  4. 对于音乐视频类型的分享,需按照如下格式发送邮件至 hansenxu@tencent.com
    • 邮件主题:帐号 XXX 关于音乐视频类 appmsg 的分享功能申请;
    • 邮件内容:需提供移动应用 appid 和需分享的音频网页的域名信息;
    • 要求:
      • 申请帐号需为已完成主体认证的帐号;
      • 申请“音乐视频类型的分享权限”需先完成“音乐类型的分享权限”申请,且申请的移动应用的 appid 和域名需一致;
      • 音乐视频类型的分享权限会涉及到相关法务协议的签署,具体签订流程和开通结果请参考邮件回复结果。

微信分享,分享与收藏功能 /iOS开发手册

微信分享,分享与收藏功能 /iOS开发手册

开发者在 App 中在集成微信 SDK 后,可调用接口实现,以下依次是文字、图片、视频、网页、小程序、音乐视频类型分享的示例。

WXMediaMessage (微信媒体消息内容)说明

字段类型含义备注
titleNSString消息标题限制长度不超过512Bytes
descriptionNSString描述内容限制长度不超过1KB
thumbDataNSData缩略图的二进制数据限制内容大小不超过32KB
mediaObjectNSObject多媒体数据对象可以为WXImageObject、WXMusicVideoObject、WXVideoObject、WXWebpageObject等
messageExtNSString额外信息mediaObject为 WXMusicVideoObject 时,从微信音乐播放器内跳回,会携带该参数,长度不能超过2k。(iOS、Android双平台要一致)

SendMessageToWXReq(SendMessageToWX请求类)

分享或收藏的目标场景,通过修改 SendMessageToWXReq 的 scene 字段实现。

字段类型含义备注
textNSString发送消息的文本内容
bTextBOOL是否文本消息发送消息的类型,包括文本消息和多媒体消息两种,两者只能选择其一,不能同时发送文本和多媒体消息
messageWXMediaMessage发送消息的多媒体内容|
sceneint发送的目标场景分享到对话:
WXSceneSession
分享到朋友圈:
WXSceneTimeline
分享到收藏:
WXSceneFavorite

示例

一、文字类型分享示例

SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText = YES;
req.text = @"分享的内容";
req.scene = WXSceneSession;
[WXApi sendReq:req];

二、图片类型分享示例

WXImageObject 多媒体消息中包含的图片数据对象

字段类型含义备注
imageDataNSData图片的二进制数据内容大小不超过10MB
UIImage *image = [UIImage imageNamed:@"res2.png"];
imageData = UIImageJPEGRepresentation(image, 0.7);
   
WXImageObject *imageObject = [WXImageObject object];
imageObject.imageData = imageData;

WXMediaMessage *message = [WXMediaMessage message];
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"res5"
                                                     ofType:@"jpg"];
message.thumbData = [NSData dataWithContentsOfFile:filePath];
message.mediaObject = imageObject;

SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText = NO;
req.message = message;
req.scene = WXSceneTimeline;
[WXApi sendReq:req];

三、视频类型分享示例

WXVideoObject 多媒体消息中包含的视频数据对象

字段类型含义备注
videoUrlNSString视频链接限制长度不超过10KB
videoLowBandUrlNSString供低带宽的环境下使用的视频链接限制长度不超过10KB

注意:videoUrl和 videoLowBandUrl 不能同时为空

WXVideoObject *videoObject = [WXVideoObject object];
videoObject.videoUrl = @"视频url";
videoObject.videoLowBandUrl = @"低分辨率视频url";
WXMediaMessage *message = [WXMediaMessage message];
message.title = @"标题";
message.description = @"描述";
[message setThumbImage:[UIImage imageNamed:@"缩略图.jpg"]];
message.mediaObject = videoObject;
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText = NO;
req.message = message;
req.scene = WXSceneSession;
[WXApi sendReq:req];

四、网页类型分享示例

WXWebpageObject 多媒体消息中包含的网页数据对象

字段类型含义备注
webpageUrlNSStringhtml链接限制长度不超过10KB
WXWebpageObject *webpageObject = [WXWebpageObject object];
webpageObject.webpageUrl = @"https://open.weixin.qq.com";
WXMediaMessage *message = [WXMediaMessage message];
message.title = @"标题";
message.description = @"描述";
[message setThumbImage:[UIImage imageNamed:@"缩略图.jpg"]];
message.mediaObject = webpageObject;
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText = NO;
req.message = message;
req.scene = WXSceneSession;
[WXApi sendReq:req];

五、小程序类型分享示例

WXMiniProgramObject 多媒体消息中包含的小程序数据对象

字段类型含义备注
webpageUrlNSString兼容低版本的网页链接限制长度不超过10KB
userNameNSString小程序的userName小程序原始 ID 获取方法:登录小程序管理后台 – 设置 – 基本设置 – 帐号信息
pathNSString小程序的页面路径小程序页面路径;对于小游戏,可以只传入 query 部分,来实现传参效果,如:传入 “?foo=bar”
hdImageDataNSData小程序新版本的预览图二进制数据,6.5.9及以上版本微信客户端支持限制大小不超过128KB,自定义图片建议长宽比是 5:4。
withShareTicketBOOL是否使用带 shareTicket 的分享通常开发者希望分享出去的小程序被二次打开时可以获取到更多信息,例如群的标识。可以设置 withShareTicket 为true,当分享卡片在群聊中被其他用户打开时,可以获取到shareTicket,用于获取更多分享信息。详见小程序获取更多分享信息 ,最低客户端版本要求:6.5.13
miniprogramTypeWXMiniProgramType小程序的类型,默认正式版,1.8.1及以上版本开发者工具包支持分享开发版和体验版小程序正式版: WXMiniProgramTypeRelease;
测试版: WXMiniProgramTypeTest;
体验版: WXMiniProgramTypePreview;
WXMiniProgramObject *object = [WXMiniProgramObject object];
object.webpageUrl = webpageUrl;
object.userName = userName;
object.path = path;
object.hdImageData = hdImageData;
object.withShareTicket = withShareTicket;
object.miniProgramType = programType;
WXMediaMessage *message = [WXMediaMessage message];
message.title = @"小程序标题";
message.description = @"小程序描述";
message.thumbData = nil;  //兼容旧版本节点的图片,小于32KB,新版本优先
                          //使用 WXMiniProgramObject 的hdImageData属性
message.mediaObject = object;
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText = NO;
req.message = message;
req.scene = WXSceneSession;  //目前只支持会话
[WXApi sendReq:req];

六、音乐视频类型分享示例

该类型需要OpenSDK 1.8.9以及以上版本

WXMusicVideoObject 多媒体消息中包含的音乐视频数据对象

字段类型含义备注
musicUrlNSString音频网页的 URL 地址必填,限制长度不超过10KB
musicDataUrlNSString音频数据的 URL 地址必填,限制长度不超过10KB
singerNameNSString歌手名必填,限制长度不超过1KB
durationUInt32音乐时长,歌曲时间必填,不能为0,单位:毫秒,
hdAlbumThumbDataNSData高清专辑封面图选填,大小不超过1MB
albumNameNSString音乐专辑名称选填
songLyricNSString歌词信息 LRC格式选填,长度不能超过32K
musicGenreNSString音乐流派选填
issueDateUInt64发行时间 Unix 时间戳选填,单位:秒
identificationNSString音乐标识符选填,建议填写,用户在微信音乐播放器内跳回应用时会携带该参数,可用于唯一标识一首歌,微信侧不理解(iOS、Android双平台要一致)

发送 MV 到微信:

WXMusicVideoObject *mvObject = [WXMusicVideoObject object];
mvObject.musicUrl = @"音乐url";
mvObject.musicDataUrl = @"音乐数据url";
mvObject.singerName = @"歌手名";
mvObject.duration = 60 * 1000; //音乐时长,毫秒
mvObject.hdAlbumThumbData = hdAlbumThumbData; //高清专辑封面图
mvObject.albumName = @"专辑名";
mvObject.musicGenre = @"音乐流派";
mvObject.issueDate = 1611116532; //发行时间 Unix 时间戳
mvObject.identification = @"test-identification"; //音乐标识符 

WXMediaMessage *message = [WXMediaMessage message];
message.title = @"歌曲名称";//必填,不能为空
message.messageExt = @"额外信息"; //微信跳回时会带上

[message setThumbImage:[UIImage imageNamed:@"缩略图.jpg"]];
message.mediaObject = mvObject;
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText = NO;
req.message = message;
req.scene = WXSceneSession;
[WXApi sendReq:req];

处理从微信音乐播放器内跳回:

#pragma mark - WXApiDelegate

- (void)onReq:(BaseReq *)req {
    if ([req isKindOfClass:[LaunchFromWXReq class]]) {
        LaunchFromWXReq *launchReq = (LaunchFromWXReq *)req;
        NSString* messageExt = launchReq.message.messageExt;  //分享到微信时的透传额外信息字字段
        if ([launchReq.message.mediaObject isKindOfClass:WXMusicVideoObject.class]) {
            WXMusicVideoObject *musicVideoObject = (WXMusicVideoObject *)launchReq.message.mediaObject;
            NSString *identification = musicVideoObject.identification; //分享到微信时的音乐标识符字段
            //应用可以根据 messageExt 和identification处理逻辑
        }
    }
}

音乐视频类型使用说明:

  1. 注意事项:
    • 音乐视频类型与音乐类型不同,分享至微信的音乐视频消息,直接点击好友会话或朋友圈下的分享内容会跳转到微信原生播放器,可以对音乐作品辅以视频制作成音乐视频,进行点赞、评论、发送给朋友、分享到朋友圈、发布至视频号等。
    • 在播放器里点击跳转入口会跳转回App,没有安装 App 时会打开 musicUrl 链接。
  2. 音乐视频类型分享,请开发者特别注意必填的字段有:
    • WXMediaMessage.title:歌曲名称
    • WXMusicVideoObject.musicUrl:音频网页的 URL 地址
    • WXMusicVideoObject.musicDataUrl:音频数据的 URL 地址
    • WXMusicVideoObject.singerName:歌手名
    • WXMusicVideoObject.duration:歌曲时长,单位为毫秒
  3. 第三方应用在分享时设置的字段 WXMediaMessage.messageExt 字段与WXMusicVideoObject.identification 需要保证 Android 与iOS平台是一致的,否则跨平台分享的消息跳转回应用无法保证能够跳转到对应歌曲。
  4. 无论 WXMediaMessage.mediaObject 类型是什么,WXMediaMessage.messgeExt 字段均会透传是应用在分享时写入的数据,应用可使用该字段进行应用低版本的兼容处理。

注意事项

  1. 发起分享的 App 与小程序属于同一微信开放平台帐号。
  2. 支持分享小程序类型消息至会话,暂不支持分享至朋友圈。
  3. 若客户端版本低于6.5.6或在 iPad 客户端接收,小程序类型分享将自动转成网页类型分享。开发者必须填写网页链接字段,确保低版本客户端能正常打开网页链接。
  4. 对于音乐视频类型的分享,需按照如下格式发送邮件至 hansenxu@tencent.com
    • 邮件主题:帐号 XXX 关于音乐视频类 appmsg 的分享功能申请;
    • 邮件内容:需提供移动应用 appid 和需分享的音频网页的域名信息;
    • 要求:
      • 申请帐号需为已完成主体认证的帐号;
      • 申请“音乐视频类型的分享权限”需先完成“音乐类型的分享权限”,且申请的移动应用的 appid 和域名需一致;
      • 音乐视频类型的分享权限会涉及到相关法务协议的签署,具体签订流程和开通结果请参考邮件回复结果。

微信开放平台微信分享与收藏功能介绍

功能介绍

微信分享及收藏是指第三方 App 通过接入该功能,让用户可以从 App 分享文字、图片、视频、网页、小程序、音乐视频至微信好友会话、朋友圈或添加到微信收藏。 微信分享及收藏功能已向全体开发者开放,开发者在微信开放平台帐号下申请 App 并通过审核后,即可获得微信分享及收藏权限。 微信分享及收藏目前支持文字、图片、视频、网页、小程序、音乐视频共六种类型(海外应用支持网页、小程序类型分享)

注意:若移动应用未上架,则天分享量受限制为 100 次,包括分享到会话和朋友圈,用于满足调试需求。

为了降低接入成本,优化开发体验,平台近期在灰度测试一个新的SDK,通过该 SDK 可以简单、高效、安全的实现网页分享功能,了解详情

接入流程

详见:

微信开放平台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(&#39;.&#39;) + 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 源码

微信开放平台iOS接入指南

微信开放平台iOS接入指南

iOS接入指南

注 1:接入Open SDK的开发者,请先认真阅读《微信Open SDK个人信息处理规则》并确保对 OpenSDK 的接入使用情况符合上述规则的相关要求。

关于openSDK1.8.6及以上版本的更新说明

由于苹果iOS 13系统版本安全升级,为此 openSDK 在1.8.6及以上版本进行了适配。 1.8.6及以上版本支持Universal Links方式跳转,对 openSDK 分享进行合法性校验。

*建议开发者接入新版本 SDK , 覆盖测试微信7.0.7或以上版本、iOS12或13,以验证所使用的接口的功能性和可用性。

目录

SDK接入成功验证指引

环境

SDK版本: SDK1.8.6或以上
微信版本: 7.0.7或以上
系统版本: iOS12或以上

1.确认微信的Universal Links正常

首先,确认微信(7.0.7或以上版本)的Universal Links在设备上正常,以确保 openSDK 与微信双向使用Universal Links通信

Safari输入

https://help.wechat.com/app/  

下拉查看是否有打开微信入口(如下图)。若无入口,可能是由于系统拉取微信Universal Links失败,请检查手机网络状态是否正常,或更新/重装微信

2.确认 App 的Universal Links配置成功

微信使用第三方 App 的Universal Links唤起第三方 App 时,会在Universal Links末尾拼接路径和参数,因此开发者Universal Links配置必须加上通配符,并测试Universal Links拼接字符串能否唤起app

建议Universal Links配置path,例如/app/*, 避免全域命中Universal Links跳转

以SDK Sample配置为例:

{ "appID": "teamID.com.tencent.xin.SDKSample", "paths": ["/sdksample/*"] }

测试配置是否成功:
1) Safari输入Universal Links(包括完整路径)+随机字符串(例如: abc)
SDK Sample的Universal Links:

https://help.wechat.com/sdksample/  

测试输入 Safari 的Universal Links:

https://help.wechat.com/sdksample/abc

2)下拉页面检查是否有打开 app 的入口提示(如下图)

3.连续发起分享,确认不会发生多次二次跳转行为

当用户首次使用新版本 SDK 发起分享时,将会出现如下交互流程:从 App 拉起微信 – 出现“正在连接”页面 – 返回 App- 重新打开微信。以上是新的安全验证流程,每个用户在首次使用时会出现上述跳转。(如同一用户多次使用分享都出现跳转,请按照以下接入指引,检查Universal Links配置)

4.如 App 有使用微信授权登录功能,确认授权不出现二次确认弹窗

授权登录如出现以下二次确认弹窗,原因是微信无法通过 App 提供的Universal Links返回导致,很可能是 App 的Universal Links不生效,请按照接入指引检查Universal Links配置

SDK接入指引

*请注意红字部分配置

1)根据 苹果文档 配置你应用的Universal Links
微信对Universal Links配置要求
a)Universal Links必须支持https
b)Universal Links配置的 paths 不能带 query 参数
c)微信使用Universal Links拉起第三方 App 时,会在Universal Links末尾拼接路径和参数,因此 App 配置的 paths 必须加上通配符/*
示例:

{ 
"appID": "8P7343TG54.com.tencent.xin.SDKSample",    
"paths": ["/sdksample/*"]
}

2)打开Associated Domains开关,将Universal Links域名加到配置上

3)检查确认 App 的Universal Links配置成功,通过上述SDK接入成功验证指引操作

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

3.下载微信终端 SDK 文件

SDK 文件包括 libWeChatSDK.a,WXApi.h,WXApiObject.h 三个。 如选用手动集成,请前往资源下载页下载最新 SDK 包

4.搭建开发环境

4.1 通过 CocoaPods 集成

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

[2]  在工程的 Podfile 里面添加以下代码:

pod 'WechatOpenSDK'

保存并执行 pod install,然后用后缀为.xcworkspace 的文件打开工程。

注意:

命令行下执行 pod search WechatOpenSDK,如显示的 WechatOpenSDK 版本不是最新的,则先执行 pod repo update 操作更新本地 repo 的内容

关于 CocoaPods 的更多信息请查看 CocoaPods 官方网站 。

[3] 在 Xcode 中,选择你的工程设置项,选中“TARGETS”一栏,在“info”标签栏的“URL type“添加“URL scheme”为你所注册的应用程序 id(如下图所示)。 

Xcode 设置 URL scheme

[4] 在 Xcode 中,选择你的工程设置项,选中“TARGETS”一栏,在 “info”标签栏的“LSApplicationQueriesSchemes“添加weixin、weixinULAPI、weixinURLParamsAPI(如下图所示)。

经验证,在iOS 15系统上,使用Xcode 13编译出的App,LSApplicationQueriesSchemes的数量会限制为50个。第50个之后的 scheme 配置会不生效,需要确保”weixin”、”weixinULAPI”和”weixinURLParamsAPI”配置在 LSApplicationQueriesSchemes 的前50个。

[5] 在你需要使 用微信终端 API 的文件中 import WXApi.h 头文件,并增加 WXApiDelegate 协议。

#import <UIKit/UIKit.h>
#import "WXApi.h"

@interface AppDelegate : UIResponder<UIApplicationDelegate, WXApiDelegate>

@property (strong, nonatomic) UIWindow *window;

@end

3.2 手动集成

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

[2] 将 SDK 文件中包含的 libWeChatSDK.a,WXApi.h,WXApiObject.h 三个文件添加到你所建的工程中(如下图所示,建立了一个名为 Test 的工程,并把以上三个文件添加到 Test 文件夹下)。

(注:请使用 xCode4.5 及以上版本)

[3]开发者需要在工程中链接上:Security.framework, CoreGraphics.framework, WebKit.framework

[4] 在你的工程文件中选择 Build Setting,在”Other Linker Flags”中加入”-ObjC -all_load”,在 Search Paths 中添加 libWeChatSDK.a ,WXApi.h,WXApiObject.h,文件所在位置(如下图所示)。

(注:请使用 xCode4.5 及以上版本) 

[5] 在 Xcode 中,选择你的工程设置项,选中“TARGETS”一栏,在“info”标签栏的“URL type“添加“URL scheme”为你所注册的应用程序 id(如下图所示)。

Xcode 设置 URL scheme

[6] 在 Xcode 中,选择你的工程设置项,选中“TARGETS”一栏,在“info”标签栏的“LSApplicationQueriesSchemes”添加weixin、weixinULAPI、weixinURLParamsAPI(如下图所示)。

经验证,在iOS 15系统上,使用Xcode 13编译出的App,LSApplicationQueriesSchemes的数量会限制为50个。第50个之后的 scheme 配置会不生效,需要确保”weixin”、”weixinULAPI”和”weixinURLParamsAPI”配置在 LSApplicationQueriesSchemes 的前50个。

[7] 在你需要使 用微信终端 API 的文件中 import WXApi.h 头文件,并增加 WXApiDelegate 协议。

#import <UIKit/UIKit.h>
#import "WXApi.h"

@interface AppDelegate : UIResponder<UIApplicationDelegate, WXApiDelegate>

@property (strong, nonatomic) UIWindow *window;

@end

5.在代码中使用开发工具包

[1] 要使你的程序启动后微信终端能响应你的程序,必须在代码中向微信终端注册你的 id。(如下图所示,在 AppDelegate 的 didFinishLaunchingWithOptions 函数中向微信注册 id)。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //向微信注册
    [WXApi registerApp:APP_ID
universalLink:UNIVERSAL_LINK];
    return YES;
}

[2] 重写 AppDelegate 的 handleOpenURL 和 openURL 方法:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    return  [WXApi handleOpenURL:url delegate:self];
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    return [WXApi handleOpenURL:url delegate:self];
}

[3] 重写 AppDelegate 或SceneDelegate的 continueUserActivity 方法: 注意:适配了 SceneDelegate 的App,系统将会回调 SceneDelegate 的continueUserActivity方法,所以需要重写 SceneDelegate 的该方法。

AppDelegate:

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray<id<UIUserActivityRest
oring>> * __nullable restorableObjects))restorationHandler {
    return [WXApi handleOpenUniversalLink:userActivity delegate:self];
}

SceneDelegate:

- (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity {
    [WXApi handleOpenUniversalLink:userActivity delegate:self];
}

[4] 现在,你的程序要实现和微信终端交互的具体请求与回应,因此需要实现 WXApiDelegate 协议的两个方法:

-(void) onReq:(BaseReq*)reqonReq

是微信终端向第三方程序发起请求,要求第三方程序响应。第三方程序响应完后必须调用 sendRsp 返回。在调用 sendRsp 返回时,会切回到微信终端程序界面。

-(void) onResp:(BaseResp*)resp

如果第三方程序向微信发送了 sendReq 的请求,那么 onResp 会被回调。sendReq 请求调用后,会切到微信终端程序界面。

具体在此两方法中所要完成的内容由你定义,具体可参考微信开发工具包中的 SDK Sample Demo 源码。

[5] 如果你的程序要发消息给微信,那么需要调用 WXApi 的 sendReq 函数:

+ (void)sendReq:(BaseReq *)req completion:(void (^
__nullable)(BOOL success))completion;

其中 req 参数为 SendMessageToWXReq 类型。

需要注意的是,SendMessageToWXReq 的 scene 成员,如果 scene 填 WXSceneSession,那么消息会发送至微信的会话内。如果 scene 填 WXSceneTimeline,那么消息会发送至朋友圈。如果 scene 填 WXSceneFavorite,那么消息会发送到“我的收藏”中。scene 默认值为 WXSceneSession。

至此,你已经能使用微信终端 SDK 的 API 内容了。如果想更详细了解每个 API 函数的用法,请查阅官网 API 文档或自行下载阅读微信 SDK Sample Demo 源码

使用SDK 自检函数排查接入问题

SDK1.8.7版本,WXApi新增了自检函数checkUniversalLinkReady:,帮助开发者排查 SDK 接入过程中遇到的问题。

注意事项:

  1. 调用自检函数之前必须要先调用registerApp:universalLink接口, 并确认调用成功
  2. 自检过程中会有 Log 产生,可以先调用 startLogByLevel 函数,根据 Log 排查问题
  3. 会多次回调block
  4. 仅用于新接入 SDK 时调试使用,请勿在正式环境的调用

示例代码:

//在 register 之前打开 log , 后续可以根据 log 排查问题
[WXApi startLogByLevel:WXLogLevelDetail logBlock:^(NSString *log) {
    NSLog(@"WeChatSDK: %@", log);
}];

//务必在调用自检函数前注册
[WXApi registerApp:APP_ID universalLink:UNIVERSAL_LINK];

//调用自检函数
[WXApi checkUniversalLinkReady:^(WXULCheckStep step, WXCheckULStepResult* result) {
    NSLog(@"%@, %u, %@, %@", @(step), result.success, result.errorInfo, result.suggestion);
}];

WXULCheckStep值说明:

  1. step = WXULCheckStepParams: 参数检查
  2. step = WXULCheckStepSystemVersion: 当前系统版本检查
  3. step = WXULCheckStepWechatVersion: 微信客户端版本检查
  4. step = WXULCheckStepSDKInnerOperation: 微信 SDK 内部操作检查
  5. step = WXULCheckStepLaunchWechat: App拉起微信检查
  6. step = WXULCheckStepBackToCurrentApp: 由微信返回当前 App 检查
  7. step = WXULCheckStepFinal: 最终检查

会依次回调这7个step,当回调了WXULCheckStepFinal,说明检测通过,SDK接入成功。 任一 step 回调的result.success为 NO , 流程终止,后续不再回调,可以根据result.errorInfo的查看当前步骤错误的原因,根据result.suggestion修复问题.