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

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

微信开放平台语义理解接口调用(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特殊回复说明

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

微信开放平台 微信内网页跳转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 中跳转至微信某一小程序的指定页面,完成服务后再跳回至原 APP 。
移动应用拉起小程序功能已向全体开发者开放,开发者在微信开放平台帐号下申请移动应用并通过审核后,即可获得移动应用拉起小程序功能权限。

跳转规则

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

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

接入流程

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

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

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

消息推送

第一步:填写服务器配置

登录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:用户撤回移动应用所有授权信息

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

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

准备工作

移动应用微信登录是基于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 源码

微信开放平台Android接入指南

微信开放平台Android接入指南

Android接入指南

注 1:jCenter 服务将在2021年5月1日之后关停,微信 SDK 已迁移到 Maven Central,请开发者及时修改引用仓库。

注 2:微信 SDK 改成通过 Gradle 的方式发布到 Maven Central,包名做了相应修改,从原来的 com.tencent.mm.sdk 修改为 com.tencent.mm.opensdk,需要开发者修改对应的 import 语句。

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

注 4:本文为微信 Android 终端开发工具的新手使用教程,只涉及教授 SDK 的使用方法,默认读者已经熟悉 IDE 的基本使用方法(Android Studio(推荐) 或 Eclipse),以及具有一定的编程知识基础等。

关于openSDK6.8.0的更新说明

微信将于近期发布 targetSdkVersion 30的客户端版本,因Android11系统特性,该微信版本在Android 11及以上系统版本的设备上运行时,授权登录、分享、微信支付等功能受到影响,可能无法正常使用。为了适配 Android 系统新版本特性,保证微信功能正常使用,请第三方应用2021年11月1日之前进行更新,点击查看更新指引

目录

接入指南

1.申请你的 AppID

请到 开发者应用登记页面 进行登记,登记并选择移动应用进行设置后,将该应用提交审核,只有审核通过的应用才能进行开发。

2.下载 SDK 及 API 文档

Android Studio 环境下:

  • 在 build.gradle 文件中,添加如下依赖即可:
dependencies {
    api 'com.tencent.mm.opensdk:wechat-sdk-android:+'
}

(从6.8.0版本开始,请使用 wechat-sdk-android )

  • 由于 jCenter 服务关停,需要修改成引用 Maven Central,在项目的根 build.gradle 文件中,添加如下代码即可:
buildscript {
    repositories {
        jcenter()       // 原有 jCenter 引用可继续保留
        mavenCentral()
    }
}

allprojects {
    repositories {
        jcenter()      // 原有 jCenter 引用可继续保留
        mavenCentral()
    }
}

特别注意,目前 Maven Central仅支持部分版本:6.6.4、6.6.5、6.6.23、6.7.0、6.7.9、6.8.0,建议开发者升级至最新版本6.8.0。后续所有版本更新都会上传至Maven Central。

Eclipse 环境下:

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

3.搭建开发环境

Android Studio 环境下:

在 Android Studio 中新建你的工程,并保证网络设置可以成功从 Maven Central 下载微信 SDK 即可。

Eclipse 环境下:

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

[2] 在工程中新建一个 libs 目录,将开发工具包中 libs 目录下的 libammsdk.jar 复制到该目录中(如下图所示,建立了一个名为 SDK_Sample 的工程,并把 jar 包复制到 libs 目录下)。

[3] 右键单击工程,选择 Build Path 中的 Configure Build Path…,选中 Libraries 这个 tab,并通过 Add Jars…导入工程 libs 目录下的 libammsdk.jar 文件。(如下图所示)。

在你需要使用微信终端 API 的文件中导入相应的类。

import com.tencent.mm.opensdk.openapi.WXTextObject;

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

[1] 注册到微信

要使你的程序启动后微信终端能响应你的程序,必须在代码中向微信终端注册你的 id。(如下图所示,可以在程序入口 Activity 的 onCreate 回调函数处,或其他合适的地方将你的应用 id 注册到微信。注册函数示例如下图所示。

	// APP_ID 替换为你的应用从官方网站申请到的合法appID
private static final String APP_ID = "wx88888888";

// IWXAPI 是第三方 app 和微信通信的 openApi 接口
private IWXAPI api;

private regToWx() {
    // 通过 WXAPIFactory 工厂,获取 IWXAPI 的实例
    api = WXAPIFactory.createWXAPI(this, APP_ID, true);

    // 将应用的 appId 注册到微信
    api.registerApp(APP_ID);

   //建议动态监听微信启动广播进行注册到微信
  registerReceiver(new BroadcastReceiver() {
   @Override
   public void onReceive(Context context, Intent intent) {

     // 将该 app 注册到微信
    api.registerApp(Constants.APP_ID);
   }
  }, new IntentFilter(ConstantsAPI.ACTION_REFRESH_WXAPP));

}

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

现在,你的程序要发送请求或发送响应到微信终端,可以通过 IWXAPI 的 sendReq 和 sendResp 两个方法来实现。

boolean sendReq(BaseReq req);

sendReq 是第三方 app 主动发送消息给微信,发送完成之后会切回到第三方 app 界面。

boolean sendResp(BaseResp resp);

sendResp 是微信向第三方 app 请求数据,第三方 app 回应数据之后会切回到微信界面。

sendReq 的实现示例,如下图所示:

//初始化一个 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 = String.valueOf(System.currentTimeMillis());  //transaction字段用与唯一标示一个请求
req.message = msg;
req.scene = mTargetScene;

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

需要注意的是,SendMessageToWX.Req 的 scene 成员,如果 scene 填 WXSceneSession,那么消息会发送至微信的会话内。如果 scene 填 WXSceneTimeline(微信 4.2 以上支持,com.tencent.mm.opensdk.constants.Build.java 里面定义了各个功能支持的版本号,如果需要检查微信版本支持 API 的情况, 可调用 IWXAPI 的 getWXAppSupportAPI 方法,比如,要判断微信是否支持分享到朋友圈功能,可以如下所示进行判断:

if (api.getWXAppSupportAPI() >= Build.TIMELINE_SUPPORTED_SDK_INT) {
    //do share
}

那么消息会发送至朋友圈。scene 默认值为 WXSceneSession。

sendResp 的实现与 SendReq 类似,如下图所示:

// 初始化一个 WXTextObject 对象
WXTextObject textObj = new WXTextObject();
textObj.text = text;

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

// 构造一个Resp
GetMessageFromWX.Resp resp = new GetMessageFromWX.Resp();
// 将 req 的transaction设置到 resp 对象中,其中 bundle 为微信传递过来的 Intent 所带的内容,通过getExtras()方法获取
resp.transaction = new GetMessageFromWX.Req(bundle).transaction;
resp.message = msg;

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

具体要发送的内容由第三方 app 开发者定义,具体可参考微信开发工具包中的 SDK Sample Demo 源码。

[3] 接收微信的请求及返回值

如果你的程序需要接收微信发送的请求,或者接收发送到微信请求的响应结果,需要下面 3 步操作:

a. 在你的包名相应目录下新建一个 wxapi 目录,并在该 wxapi 目录下新增一个 WXEntryActivity 类,该类继承自 Activity(例如应用程序的包名为 net.sourceforge.simcpux,则新添加的类如下图所示)

并在 manifest 文件里面加上exported、taskAffinity及 launchMode 属性,其中 exported 设置为true,taskAffinity设置为你的包名,launchMode设置为singleTask,例如:

<activity
    android:name=".wxapi.WXEntryActivity"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.Translucent.NoTitleBar"
    android:exported="true"
    android:taskAffinity="填写你的包名"
    android:launchMode="singleTask">
</activity>

b. 实现 IWXAPIEventHandler 接口,微信发送的请求将回调到 onReq 方法,发送到微信请求的响应结果将回调到 onResp 方法

c. 在 WXEntryActivity 中将接收到的 intent 及实现了 IWXAPIEventHandler 接口的对象传递给 IWXAPI 接口的 handleIntent 方法,示例如下图:

api.handleIntent(getIntent(), this);


当微信发送请求到你的应用,将通过 IWXAPIEventHandler 接口的 onReq 方法进行回调,类似的,应用请求微信的响应结果将通过 onResp 回调。

注意事项

[1]如果需要混淆代码,为了保证 sdk 的正常使用,需要在 proguard.cfg 加上下面两行配置:

-keep class com.tencent.mm.opensdk.** {
    *;
}

-keep class com.tencent.wxop.** {
    *;
}

-keep class com.tencent.mm.sdk.** {
    *;
}

[2]如果需要运行 SDK Sample 工程,需要通过指定的 debug.keystore 来进行签名:

Android Studio 环境下:

signingConfigs {
    debug {
        storeFile file("../debug.keystore")
    }
}

Eclipse 环境下:

请查阅文档《如何运行 SDK Demo 工程 》

至此,你已经能使用微信 Android 开发工具包的 API 内容了。如果想更详细了解每个 API 函数的用法,请查阅 Android 平台参考手册 或自行下载阅读微信 SDK Sample Demo 源码。

前往下载微信 SDK 示例代码

Android 11-更新 openSDK 适配

针对微信 targetSdkVersion 30的客户端版本,因Android11系统特性,该微信版本在Android 11及以上系统版本的设备上运行时,授权登录、分享、微信支付等功能受到影响,可能无法正常使用。为了适配 Android 系统新版本特性,保证微信功能正常使用,请第三方应用2021年11月1日之前进行如下更新:

适配方案

  1. 第三方应用需要更新微信 Android SDK至6.8.0版本,引用代码如下:
dependencies {
    api 'com.tencent.mm.opensdk:wechat-sdk-android:6.8.0'
    // 或者直接引用最新版本
    // api 'com.tencent.mm.opensdk:wechat-sdk-android:+'
}

无论第三方应用 targetSdkVersion 是否升级为30,均需要进行微信 Android SDK版本升级适配。

  1. targetSdkVersion升级到30的第三方应用,由于Android 11 软件包可见性 特性的影响,OpenSDK的接口可能无法正常拉起微信,从而无法使用微信的部分功能,需要在主工程的AndroidManifest.xml 中增加标签,代码如下:
<manifest package="com.example.app">

      ...

      // 在应用的 AndroidManifest.xml 添加如下<queries>标签
    <queries>
        <package android:name="com.tencent.mm" />   // 指定微信包名
    </queries>

      ...

</manifest>

注:添加以上标签之后,需要开发者升级编译工具,否则会出现编译错误。

  • Android Studio 需要升级至 3.3 及以上,建议升级至 4.0 及以上版本
  • Android SDK Build-Tools 需要升级至 30 及以上版本
  • com.android.tools.build:gradle 需要升级至 3.6.0 版本及以上

验证流程

  1. 环境准备:
  2. 验证流程:

(1) 安装第三方应用后,首次触发微信登录功能。(注:该操作前务必不要触发任何分享、跳转等 openSDK 功能)

(2) 若成功完成微信登录功能,即验证 openSDK 更新成功。

(2) 若签名验证失败,收到回调errcode=-6,则需开发者重新检查步骤1和2是否完成。

targetSdkVersion升级到30的第三方应用,具体适配详情另可参考文档Android 11 系统策略更新,请开发者及时适配

微信开放平台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修复问题.

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

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

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

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 运行截图包含有时间、电量等内容的状态栏来校验应用的真实性、安全性和统一性。

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

微信开放平台应用市场下载链接审核规范

微信开放平台应用市场下载链接审核规范

应用市场下载链接

5.1你在新增申请应用或修改应用时,如申请的应用已在应用市场上架,可在应用已上架处勾选是,并提供可访问的有效应用商店下载链接。

5.2 如你的应用已在应用市场上架,提交应用申请时微信开放平台帐号主体信息需先通过认证。

5.3 你所提交的应用市场下载链接需包含与微信开放平台应用名称、图标、主体信息、APP流程图内容一致的信息来校验应用的真实性、安全性和统一性。

驳回示例:应用市场下载链接内应用名称为巨兽**,在开放平台创建的应用名称为猛兽**,名称不一致。

5.4 你所提交的应用市场下载链接应是应用宝、App Store、谷歌商店、小米、华为、vivo等应用商城的下载链接,apk下载链接、非应用商店的、无法正常打开的以及无相关下载按钮的链接均属于不规范。

驳回示例1: 应用市场下载链接无应用开发商信息。

驳回示例2:应用市场下载链接无应用相关信息。

驳回示例3:应用市场下载链接无法访问。

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

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

应用官网

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

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

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

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

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

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

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

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

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

微信开放平台应用类目审核规范

微信开放平台应用类目审核规范

3.1 你所申请的应用服务范围需与实际填写的类目一致,也需与自身所提供的服务一致。

驳回示例:应用提供的服务是商业服务,实际经营内容为商业服务 – 会展服务,选择类目是体育 – 体育培训,审核将不会通过。

3.2 你在申请或变更应用前需先自行添加和应用匹配的类目,再发起应用的申请和变更。选择类目流程指引:微信开放平台后台->管理中心->应用类目->添加应用类目。

3.3 如现有类目跟应用不匹配的,可删除现有类目,删除现有类目不会影响之前关联其删除类目的应用。

3.4 服务类目有分个人类目与非个人类目。部分类目需你在微信开放平台帐号中心完成开发者资质认证后才可选择。