# 离线刷脸签约状态变更回调
# 1. 接口规则
● 认证方式:HTTPS协议,SHA256 with RSA进行签名;
● 返回和提交数据的签名,商户号,时间戳,随机串等在HTTP头中传递;
● 提交和返回结果采用JSON格式;
● 字符集默认使用UTF-8,请勿使用其它字符集;
● 交互的返回和回调数据都需要校验签名。
# 2. 离线刷脸回调通知-用户签约状态变更通知API
# 2.1 应用场景
刷脸用户在完成签约或解约后,微信会通知商户用户签约状态变更。商户需要接收处理,并返回应答。出于安全的考虑,我们对数据进行加密,商户需要先对通知数据进行解密,才能得到用户签约状态信息。
对后台通知交互时,如果微信收到应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。
注意:同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。
推荐的做法是,当商户系统收到通知进行处理时,先检查对应业务数据的状态,并判断该通知是否已经处理。如果未处理,则再进行处理;如果已处理,则直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。
# 2.2 签约状态变更通知业务序列图
签约: 服务商可以通过签约小程序引导用户完成签约. 此时微信离线刷脸业务系统将会发送签约变更状态给到服务商提供的回调地址。
解约: 解约入口有两个,一个是微信用户通过微信客户端发起解约,一个是商户通过调用后台API接口进行解约。解约后,微信K12业务系统将发送签约变更状态给到服务商提供的回调地址。
以下是签约通知状态变更业务中, 微信离线刷脸业务系统和商户后台系统交互的序列图:
# 2.3 接口说明
环境:正式环境
请求方式:post
请求地址:该链接由商户提供,微信审核通过后上线。URL必须为https协议。如果链接无法访问,商户将无法接收到微信通知。通知url必须为直接可访问的url,不能携带参数。
notify_url:“https://api.yourcompany.com/notify/process.action”
# 2.4 请求参数
参数名 | 变量名 | 类型 | 必填 | 描述 |
通知ID | id | string(32) | 是 | 通知的唯一ID。 示例值:EV-2018022511223320873 |
通知创建时间 | create_time | string(16) | 是 | 通知创建的时间。 示例值:2020-05-20T10:23:14+08:00 |
通知类型 | event_type | string(32) | 是 | 通知的类型。 示例:FACEPAY.USER_STATE_CHANGE |
通知数据类型 | resource_type | string(32) | 是 | 通知的资源数据类型,支付成功通知为encrypt-resource。 示例值:encrypt-resource |
通知数据 | resource | object | 是 | 通知资源数据 |
回调摘要 | summary | string(64) | 是 | 回调摘要。 示例值:刷脸用户签约状态变更 |
resource对象列表:
参数名 | 变量名 | 类型 | 必填 | 描述 |
加密算法类型 | algorithm | string(32) | 是 | 对支付结果数据进行加密的加密算法,目前只支持AEAD_AES_256_GCM;
示例值:AEAD_AES_256_GCM |
数据密文 | ciphertext | string(1048576) | 是 | Base64编码后的支付结果数据密文; 示例值:dfewfewe== |
原始回调类型 | original_type | string(64) | 是 | 原始回调类型; 示例值:facepay |
附加数据 | associated_data | string(16) | 否 | 附加数据; 示例值: fefwe |
随机串 | nonce | string(32) | 是 | 加密使用的随机串; 示例值:fdasflkja484w |
下面详细描述对通知数据进行解密的流程:
A、用商户平台上设置的APIv3密钥【微信商户平台—>账户设置—>API安全—>设置APIv3密钥】,记为key;
B、针对resource.algorithm中描述的算法(目前为AEAD_AES_256_GCM),取得对应的参数nonce和associated_data;
C、使用key、nonce和associated_data,对数据密文resource.ciphertext进行解密,得到JSON形式的资源对象;
注意:AEAD_AES_256_GCM算法的接口细节,请参考rfc5116。微信支付使用的密钥key长度为32个字节,随机串nonce长度12个字节,associated_data长度小于16个字节并可能为空。
解密后的resource对象列表:
参数名 | 变量名 | 类型 | 必填 | 描述 |
微信刷脸用户ID | user_id | string(64) | 是 | 微信刷脸用户唯一标识; 示例:FUxxxfjeiofewfefw |
商户刷脸用户ID | out_user_id | string(64) | 是 | 商户刷脸用户唯一标识; 示例值:fefwe33333333 |
机构编号 | organization_id | string(32) | 是 | 机构编号,代表一个学校、一个企业; 示例值:Ofewfwijifeeeex |
商户号 | mch_id | string(32) | 是 | 微信支付分配的商户号; 示例值:1333333333 |
通知创建时间 | notify_create_time | string(32) | 是 | 通知创建时间;示例值:xxxx |
微信APPID | appid | string(32) | 是 | 微信APPID; 示例值: wx3233223 |
微信用户openid | openid | string(64) | 是 | 微信openid; 示例值: 3829323efdwef |
签约ID | contract_id | string(32) | 是 | 用户签约ID |
请求示例
{
"user_id": "FUxxxfjeiofewfefw",
"out_user_id": "fefwe33333333",
"organization_id": "OPfefewwefwe",
"mch_id": "1233456",
"notify_create_time": "2020-05-20T10:23:14+08:00",
"appid": "fefefewfefew",
"openid": "fjeofejwofewfew"
}
# 2.5 通知签名
加密不能保证通知请求来自微信。微信会对发送给商户的通知进行签名,并将签名值放在通知的HTTP头Wechatpay-Signature。商户应当验证签名,以确认请求来自微信,而不是其他的第三方。签名验证的算法请参考《微信支付APIv3签名方案》。
# 2.6 通知应答
商户后台在正确处理回调之后,需要返回200或者204的HTTP状态码。其他的状态码,微信支付均认为通知失败,并按照前述的策略定期发起通知。注意,当商户后台应答失败时,微信支付将记录下应答的报文,建议商户按照如下格式返回。
应答示例
{
"code": "ERROR_NAME",
"message": "ERROR_DESCRIPTION",
}